Код, написанный на Hack, быстрее, чем код, написанный на PHP на HHVM?

Можем ли мы ожидать прироста скорости при переходе с PHP на Hack на HHVM?

Я имею в виду строго типизированные параметры/возвратные типы, в частности скаляры, позволяют ли HHVM лучше справляться с компиляцией кода в нативный код, или прирост скорости незначителен по сравнению с использованием классического PHP и его смешанных типов ?


person BenMorel    schedule 29.09.2014    source источник
comment
@ Марк, я, конечно, мог бы провести несколько небольших тестов, но я понятия не имею, будут ли они репрезентативными. Меня больше интересует теория, стоящая за этим, поскольку кто-то имеет представление о том, как работает JIT-компилятор HHVM.   -  person BenMorel    schedule 29.09.2014
comment
Что ж, если вы говорите как о переключении платформы, так и о переключении языка ... трудно получить честные измерения от одного или другого, если вы сравниваете два больших изменения ... вы почти наверняка увидите переключение скорости. скажем, с Apache/mod_php на hhvm/php   -  person Mark Baker    schedule 29.09.2014
comment
Лучший способ узнать, работает ли тот или иной метод быстрее, — проверить его скорость. Время каждого события и посмотреть, что быстрее. Я делаю это почти с каждой идеей, которую хочу попробовать.   -  person backend_dev_123    schedule 29.09.2014
comment
Что ж, вы оба говорите правду, но опять же, мне нравятся не только тесты, но и немного теории. @Mark, я уверен, что прирост скорости от mod_php до HHVM огромен. Меня интересует следующее: если я перейду на HHVM, будет ли скорость определяющим фактором при выборе между языком Hack и языком PHP?   -  person BenMorel    schedule 29.09.2014
comment
Ниже я дал полный ответ, который, я думаю, касается как теоретического вопроса о том, как выглядит ускорение, так и того, будет ли скорость определяющим фактором при выборе между Hack и PHP. Но, как и в случае с любым вопросом производительности, даже с учетом того, что я скажу ниже, совет проводить собственные тесты для вещей, которые важны для вас, — это хороший совет.   -  person Josh Watzman    schedule 29.09.2014


Ответы (1)


Я ответил на этот вопрос на Reddit несколько месяцев назад. Я скопировал свой ответ ниже, поскольку с тех пор состояние мира не сильно изменилось. Но имейте в виду, что HHVM все еще развивается, на самом деле довольно быстро, и поэтому он может легко устареть через месяц или два.

Я работаю в команде Hack в Facebook. Ответ на этот вопрос несколько тонкий.

Как уже говорили другие, перенос вашего PHP-кода с PHP5 на HHVM может привести к значительному ускорению. Насколько значительным, зависит от множества факторов. Если вы уже привязаны к IO, вы можете вообще ничего не увидеть; если вы ближе к привязке к процессору, сообщалось об ускорении примерно до 5x, хотя вы, вероятно, получите что-то среднее. Вы должны пойти и попробовать его на своем собственном коде с реальной рабочей нагрузкой — у HHVM есть множество факторов, в частности большее время запуска, которые делают его не таким хорошим на микротестах, но на реальных рабочих нагрузках он должен превзойти PHP5. Для максимальной выгоды рефакторинг вашего кода, чтобы вывести вещи из верхнего уровня в функции/классы, очень поможет (мы не можем JIT-код на верхнем уровне), как и настройка авторитетный режим репозитория.

Но это просто PHP на HHVM, а не Hack на HHVM. Какое ускорение вы получите от конвертации кода в Hack? Это зависит от того, как вы выполняете преобразование, но ответ, по крайней мере сейчас, «не очень». Если вы просто вставите <?hh вверху каждого файла вместо <?php и устраните все несовместимости, которые появится, когда вы запустите средство проверки типов, тогда ваш код, скорее всего, будет работать так же, как и раньше. Хакерский и PHP-код имеют одинаковое представление во время выполнения, так что на самом деле вы не сильно изменились.

Однако, если вы сделаете это, вы не воспользуетесь всеми преимуществами Hack! Если вы войдете и начнете добавлять аннотации типов, вы сможете создавать все больше и больше информации для использования HHVM во время выполнения. Этот процесс может ускорить ваш код — HHVM может генерировать специализированный по типам (т. е. более быстрый) код во многих случаях, когда раньше он не мог определить тип. Здесь также не ожидайте огромного ускорения — сейчас это в основном теоретическое, и есть много мест, где мы можем лучше использовать информацию о типах для создания более быстрого кода. (Например, прямо сейчас мы мало что делаем с возвращаемыми типами во время выполнения.) Но это та часть, которая может помочь, и может помочь больше, когда HHVM станет умнее.

Но, конечно, имейте в виду, что скорость выполнения была не целью Hack, а эффективностью разработчика. Любой прирост производительности, вероятно, не будет стоить усилий по переходу с PHP на HHVM на Hack на HHVM. Однако выигрыш в производительности разработчиков, вероятно, есть.

Значит ли это, что переход с PHP5 на HHVM ускорит ваш код? Скорее всего. Быстрое преобразование в Hack ускоряет его? Нет. Ускоряет ли добавление дополнительных типовых аннотаций? Может немного, а может и больше в будущем, но не в этом дело.

person Josh Watzman    schedule 29.09.2014
comment
Отличное резюме от инсайдера, так что, безусловно, хорошее понимание и совет о преимуществах - person Mark Baker; 29.09.2014
comment
Обновление от февраля 2015 г.: приведенный выше ответ по-прежнему в основном верен. Единственное изменение заключается в том, что мы начали лучше использовать типы возвращаемых значений для оптимизации производительности, начиная с HHVM 3.5 или около того. - person Josh Watzman; 23.02.2015
comment
Теперь, когда в PHP 7 есть подсказки скалярных типов и возвращаемые типы, я полагаю, что HHVM может выполнять аналогичные оптимизации при запуске PHP-кода? - person BenMorel; 03.05.2016
comment
Я не уверен, насколько HHVM оптимизирует типы PHP7 — они более хитры, поскольку вместо ошибок могут выполнять принуждение на основе конфигурации вызывающего объекта. Это несколько более сложная проверка, чем в Hack. - person Josh Watzman; 07.05.2016
comment
PHP 7 намного быстрее, чем PHP 5, почти так же быстро, как HHVM. И он поддерживает подсказки скалярного типа, поэтому нет необходимости использовать Hack. - person Vahid Amiri; 27.03.2017
comment
В PHP 7 отсутствует инструмент статического анализа, такой как hh_client, для поиска ошибок типов перед выполнением, что является одним из ключевых аспектов Hack. Чисто с точки зрения производительности, ему также не хватает JIT, чтобы максимально использовать преимущества специализации типов, хотя действительно ли ваш код работает быстрее на HHVM из-за этого (и многих других факторов) чрезвычайно сложно, и это вы должны определить с помощью профилирования. - person Josh Watzman; 14.04.2017