В списке рассылки разработчиков 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.


Источник: http://www.opennet.ru/opennews/art.shtml?num=39724