Про HHVM уже писали на Хабре. Вкратце: HHVM — это виртуальная машина от Facebook, которая за счет трансляции и JIT-компиляции кода позволяет ускорить PHP в несколько раз. Разработчики также обещают практически полную совместимость с PHP 5.4.
Я решил сравнить HHVM с нативным интерпретатором на нескольких тестах, а также попробовать запустить на нем CMS.
Условия тестирования
Тестирование проводилось в виртуальной машине с конфигурацией процессор 2 ядра Core i5 @ 3,3 ГГц, 8 Гб ОЗУ.
ОС: Ubuntu 12.04 x86_64.
PHP: 5.3.10-1ubuntu3.7
Nginx: 1.1.19
Apache: 2.2.22
HHVM: 2.1.0-dev
В настройках были увеличены таймауты выполнения и memory_limit, включен APC. Никакого дополнительного тюнинга не производилось.
HHVM установлена из исходников по инструкции.
Бенчмарки
Было подготовлено несколько скриптов, каждый из которых был запущен 50 раз: по 10 раз в PHP CLI, HHVM CLI, Apache+mod_php, nginx+php-fpm, и nginx+HHVM. Средняя продолжительность выполнения представлена в таблице.
CLI | HTTP | Прирост скорости по сравнению | |||||
Тест | PHP | HHVM | Apache+mod_php | Nginx+php_fpm | Nginx+HHVM | PHP CLI | PHP-FPM |
asort | 42,4 | 17,9 | N/A1 | 40,9 | 18,9 | 137,0% | 116,7% |
bcmath_factorial | 3,4 | 3,0 | 3,4 | 3,4 | 2,8 | 13,9% | 21,5% |
curl_multi | 8,6 | 8,4 | 9,7 | 9,0 | 9,7 | 2,3% | -7,0% |
domdocument | 50,2 | 51,0 | 54,3 | 50,1 | 50,1 | -1,5% | 0,0% |
for | 60,5 | 36,9 | 60,8 | 61,0 | 211,2 | 63,7% | -71,1% |
geoip | 14,4 | 15,6 | 14,7 | 14,9 | 5,0 | -7,8% | 198,0% |
getid3 | 46,5 | 26,9 | 46,2 | 45,6 | 8,5 | 72,4% | 435,5% |
mb_strings | 22,8 | 16,8 | 7,0 | 22,2 | 17,0 | 35,8% | 31,0% |
md5 | 36,8 | 35,7 | 37,0 | 37,2 | 27,2 | 3,2% | 36,7% |
preg | 11,6 | 10,9 | 11,6 | 11,7 | 10,9 | 6,1% | 7,9% |
prime | 4,2 | 5,6 | 4,2 | 4,3 | 2,5 | -24,1% | 71,8% |
sort | 46,3 | 17,8 | N/A1 | 44,1 | 17,5 | 160,1% | 151,8% |
sqlite | 12,4 | 10,0 | 12,6 | 12,2 | 15,2 | 23,7% | -19,9% |
strings | 38,6 | 37,5 | 37,8 | 38,2 | 36,0 | 3,0% | 6,3% |
tcp_client | 15,4 | 13,2 | 15,5 | 17,3 | 13,6 | 16,9% | 27,7% |
tcpdf | 3,3 | 2,4 | 3,4 | 4,4 | 1,4 | 38,7% | 215,1% |
thumbnail | 100,8 | 94,8 | 93,7 | 99,9 | 94,2 | 6,3% | 6,1% |
1 — Apache не смог выполнить asort.php и sort.php — падал с out of memory
asort — сортировка ассоциативного массива строк с 10 млн. элементов
bcmath_factorial — вычисление факториала числа 1000 функцией bcmul
curl_multi — скачивание 100 файлов по 1 Мб в 10 потоков из Интернет
domdocument — разбор большого XML (122 тыс. тегов) — для примера взял sitemap ag.ru
for — 3 вложенных for по 1000 итераций (всего 1 млрд.)
geoip — 100 тыс. поисков IP по базе GeoIP
getid3 — получение ID3 тегов из MP3 с помощью библиотеки getID3() — 10 тыс. раз
mb_strings — использование mb_strlen, mb_ereg_replace, mb_substr, mb_strpos, mb_strtolower 1000 раз на первом томе «Войны и мира»
md5 — генерация md5 от чисел от 1 до 100 млн
preg — поиск preg_match_all hex-кодов цветов, тегов и URL на HTML-странице — 1000 раз (для примера взята главная Хабра)
prime — получение всех простых чисел от 2 до 1 млн. перебором «в лоб»
sort — сортировка массива строк 10 млн. элементов с числовыми индексами
sqlite — 10 тыс. запросов SELECT к БД sqlite3
strings — использование strlen, str_replace, substr, strpos, strtolower 10 тыс. раз на первом томе «Войны и мира»
tcp_client — 10 тыс. конектов к localhost и чтение 2 Мб по TCP (CHARGEN)
tcpdf — генерация многостраничной PDF библиотекой TCPDF — 10 раз (взят пример example_061.php)
thumbnail — 10 тыс. созданий thumbnail изображения с помощью GD imagecopyresized()
Также я хотел прогнать тест со Smarty, но HHVM не смог его исполнить.
Интерпретация результатов
Конечно, бенчмарки не могут полностью показать ситуацию с производительностью. Но все-таки кое-какие выводы можно сделать.
- Время выполнения каждого прогона теста от среднего отличалось ненамного — значит результат можно считать стабильным.
- Аномальных результата два: слишком быстрое выполнение теста mb_string на Apache+mod_php и слишком медленное выполнение for на nginx+HHVM. Тесты я перепроверил, но не знаю, в чем дело.
- Что в CLI-версии, что при использовании для веб HHVM дает преимущество в половине тестов.
- В некоторых случаях использование HHVM как бекенда nginx (т.е. не как CLI) дает еще больший прирост — видимо, за счет активации JIT. Обратите внимание насколько быстрее работают сложные библиотеки getid3 и TCPDF.
Тестирование CMS
WordPress
То, что WordPress запускается на HHVM было известно заранее. Нужна лишь небольшая корректировка в одном файле.
Простой тест: загрузка главной страницы 100 раз в один поток.
nginx+HHVM: 4.498 с
Apache+mod_php: 9.997 c
Apache+mod_php+APC: 6.567 c
nginx+php-fpm+APC: 5.460 с
Обращаю ваше внимание, что это был тест именно времени отклика страницы, а не нагрузочное тестирование в несколько потоков.
Битрикс и Joomla
Битрикс и Joomla на HHVM запускаться отказались, выдав фатальную ошибку. Я подозреваю, что Битрикс надежды запустить вообще нет, т.к. там используются deprecated функции и mbstring.func_overload.
Обзор Интернета показал, что пока именно Worpress проще всего запустить под HHVM. С другими CMS и фреймворками все не так радужно, например в недавнем топике на Хабре Symfony2 не взлетела.
Возможно, тем, кому производительность ну очень важна, стоит сразу писать фреймворк под HHVM?
Выводы
1) HHVM дает хороший прирост производительности на некоторых задачах — возможно использовать его для запуска процессов фоновой обработки чего-либо. Помните, что HHVM не эффективен при использовании глобальным переменных.
2) В настоящий момент использование существующих библиотек, фреймворков и CMS с HHVM затруднено. HHVM заточена под производительность и может не поддерживать различные красивые конструкции. Однако в будущем ситуация будет улучшаться, т.к. и HHVM, возможно, начнет поддерживать лучше язык и разработчики могут озадачиться адаптацией своего кода под HHVM.
3) На WordPress HHVM показала впечатляющий рост производительности — в 2 раза по сравнению с mod_php.
Автор: gag_fenix