PHP 7.4 vs. PHP 8.0a

Резюме — в моём частном случае стало ощутимо быстрее, PHP 7.4 работал 63,9 секунд, 8.0a — 42,6.

Как многие знают, основной фишкой восьмой версии интерпретатора ПХП будет JIT. Обещают ускорение вычислительных задач, что немного не про веб, где в основном используется этот язык, но всё равно выглядит интересно.

В официальном репозитории альфа восьмой версии лежит уже давно, стало интересно сравнить её с «семёркой» — много ли даёт JIT приросту. Для подобных тестов я давно использую свой оптимизирующий транслятор «Брейнфака», с загруженной в него задачей вычисления числа Пи.

Восьмой ПХП собрался на моём «Макбуке» следующей последовательностью команд:

PATH=/usr/local/Cellar/bison/3.5.3/bin/:$PATH ./buildconf
./configure --prefix=/opt/php-bin/ --without-iconv --disable-xml \
--without-libxml --disable-simplexml --disable-xmlwriter --disable-dom --disable-xmlreader
make -j4
make install

Версию 7.4 ставил через «брю», сборочную конфигурацию оставил как есть, ничего не менял.

После небольшой коррекции php.ini в информации об интерпретаторе появились OPcache и JIT:

Скриншот вывода phpinfo: Zend Engine v4.0.0-dev, Zend OPcache v8.0.0-dev; Opcache Up and Running, Optimization Enabled, SHM Cache Enabled, File Cache Disabled, JIT Enabled.
Скомпилированная версия PHP 8.0a со включенным JIT

Вообще свой брейфаковский транслятор когда-то давно я умудрился сломать, но с быстрым фиксом он выплюнул некую калечную программу, которая, тем не менее, выдала результат, похожий на правду и довольно бодро нагрузила одно ядро процессора.

Столбчатая диаграмма: PHP 7.4 — 72,3; PHP 7.4 + opcache — 63,9; PHP 8.0a — 60,8; PHP 8.0a + JIT — 42,6.
Сравнение PHP 7.4 и 8.0a, со включённым и выключенным opcache (меньше — лучше)

Каждую версию интерпретатора я тестировал со включенным и выключенным OPcache десять раз, а результаты усреднил. Как видите, JIT существенно ускорил выполнение программы в моём случае (там огромное количество циклов и ветвлений) — 63,9 секунды против 42,6.

Что интересно — PHP 8.a без OPcache обогнал версию 7.4 со включенным opcache, это примечательный результат— значит сам «голый» интерпретатор тоже оптимизируют.

Комментарии 4

Кирилл Несмеянов № 3
Кажется ведь OpCache вообще для JIT противопоказан?

JIT является частью расширения опкеша. Шах и мат, аметисты)

Rn In № 4
На мое железе php8/cli ускорился на 45% Макс(простые вычислительные задачи и при работе с циклами). Однако, как бы я не настраивал jit, скорость с ним и без него варьировалась от 1-5%. Особой выгоды не увидел. Возможно jit себя проявит в крупных проектах, где много зависимостей. А на текущей момент, лично у меня, сложилось впечатление, что Jit серой. И вообще, хотелось бы, что разработчики посмотрели в сторону graalvm