Разработчики PHP представили интерпретатор нового поколения (PHPNG)

В списке рассылки разработчиков PHP объявлено о начале тестирования проекта phpng, в рамках которого ведётся работа над следующим поколением интерпретатора для языка программирования PHP, отличающегося переходом на новый вариант движка Zend Engine, в котором будут воплощены новые идеи по организации работы с памятью и применению технологий JIT-компиляции. Итогом разработки станет выпуск PHP 5.7, примечательный существенным увеличением производительности выполнения скриптов. В настоящее время начальная версия phpng уже доступна для сборки и тестирования. Сообщается, что с момента выпуска PHP 5.0 наблюдается значительный прогресс в области увеличения производительности PHP — скорость выполнения синтетических тестов увеличилась в 6 раз, а ускорение выполнения реальных приложений оценивается в два раза. При разработке новой ветки большое внимание уделяется экспериментам с технологиями JIT-компиляции. В частности, на базе LLVM подготовлен прототип встроенного в OPCache JIT-компилятора, что позволило по сравнению с PHP 5.5 увеличить скорость выполнения тестового набора в 10 раз, но в реальных приложениях ускорение составило всего несколько процентов.

Различия в показателях тестов и реальных приложений заставили задуматься разработчиков и провести более глубокую ревизию возможных узких мест, устранение которых позволило бы добиться более ощутимого прогресса в оптимизации. Сама по себе виртуальная машина уже достаточно хорошо оптимизирована, но проблема оказалась в методах работы с памятью и организации хранения структур данных. В текущем виде, работа со структурами данных приводит к большому числу операций выделения и перераспределения памяти, а также подсчёта ссылок на структуры для работы сборщика мусора. В итоге, типичное PHP-приложение тратит примерно 20% времени на выполнение задач менеджера памяти, 10% на обработку хэш-таблиц, 30% на вызов внутренних функций и только 30% на выполнение кода в виртуальной машине.

При подготовке PHPNG основное внимание уделено изменению методов работы с памятью и переходу на новые структуры хранения данных, которые минимизируют число операций в куче. Идея переработки структур была сопряжена с определённым риском, связанным с появлением непредсказуемых результатов глобального рефакторинга. Сейчас уже доступны первые результаты проделанной работы, которые показали, что разработчиками был выбран правильный путь, который привёл к существенному повышению производительности, снижению потребления памяти и стал хорошей предпосылкой к внедрению новых JIT-технологий для дальнейшего ускорения работы PHP.

В среднем изменения позволили добиться увеличения производительности реальных приложений на 10–30%:

Wordpress 3.6 — 20.0% (было 211, стало 253 запросов в секунду) Drupal 6.1 — 11.7% (1585/1770 запросов в секунду) Qdig — 15.3% (482/555 запросов в секунду) ZF test app — 30.5% (166/217 запросов в секунду) Из идей по проведению дальнейших оптимизаций отмечается:

Оптимизация вызова и возврата из функций; Замена Zend Memory Manager на xx_malloc, что позволит увеличить производительность приблизительно на 2%; Переработка очень медленного API zend_parse_parameters (); Сокращение объёма данных, копируемых из областей разделяемой памяти OPCache в память процесса; Переход на libpcre с поддержкой JIT-компиляции регулярных выражений; Замена ext/json на pecl/jsond.

©  OpenNet