В списке рассылки разработчиков PHP объявлено [3] о начале тестирования проекта phpng [4], в рамках которого ведётся работа над следующим поколением интерпретатора для языка программирования PHP, отличающегося переходом на новый вариант движка Zend Engine, в котором будут воплощены новые идеи по организации работы с памятью и применению технологий JIT-компиляции. Итогом разработки станет выпуск PHP 5.7, примечательный существенным увеличением производительности выполнения скриптов. В настоящее время начальная версия phpng уже доступна [4] для сборки и тестирования.
Сообщается, что с момента выпуска PHP 5.0 наблюдается значительный прогресс в области увеличения производительности PHP - скорость выполнения синтетических тестов увеличилась в 6 раз, а ускорение выполнения реальных приложений оценивается в два раза. При разработке новой ветки большое внимание уделяется экспериментам с технологиями JIT-компиляции. В частности, на базе LLVM подготовлен прототип встроенного в OPCache JIT-компилятора, что позволило по сравнению с PHP 5.5 увеличить скорость выполнения тестового набора в 10 раз, но в реальных приложениях ускорение составило всего несколько процентов.
Различия в показателях тестов и реальных приложений заставили задуматься разработчиков и провести более глубокую ревизию возможных узких мест, устранение которых позволило бы добиться более ощутимого прогресса в оптимизации. Сама по себе виртуальная машина уже достаточно хорошо оптимизирована, но проблема оказалась в методах работы с памятью и организации хранения структур данных. В текущем виде, работа со структурами данных приводит к большому числу операций выделения и перераспределения памяти, а также подсчёта ссылок на структуры для работы сборщика мусора. В итоге, типичное PHP-приложение тратит примерно 20% времени на выполнение задач менеджера памяти, 10% на обработку хэш-таблиц, 30% на вызов внутренних функций и только 30% на выполнение кода в виртуальной машине.
При подготовке PHPNG основное внимание уделено изменению методов работы с памятью и переходу на новые структуры [5] хранения данных, которые минимизируют число операций в куче. Идея переработки структур была сопряжена с определённым риском, связанным с появлением непредсказуемых результатов глобального рефакторинга. Сейчас уже доступны первые результаты проделанной работы, которые показали, что разработчиками был выбран правильный путь, который привёл к существенному повышению производительности, снижению потребления памяти и стал хорошей предпосылкой к внедрению новых JIT-технологий для дальнейшего ускорения работы PHP.
В среднем изменения позволили добиться увеличения производительности реальных приложений на 10-30%:
Из идей по проведению дальнейших оптимизаций отмечается:
Ссылки:
[1] http://htfl.ru/cat-news-php
[2] http://htfl.ru/cat-news-novosti
[3] /out.php?link=http://news.php.net/php.internals/73888
[4] /out.php?link=https://wiki.php.net/phpng
[5] /out.php?link=https://wiki.php.net/phpng-int