В PHP 8 будет добавлен JIT-компилятор

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

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

При этом после внедрения JIT кардинального роста производительности для web-разработчиков не предвидится, так как основным узким местом для большей части применяемых на сайтах PHP-скриптов является ввод/вывод (обработка сетевых соединений, чтение и запись файлов, обращение к СУБД, кэширование и т.п.), а не скорость выполнения на CPU. В процессе разработки прошлого набора оптимизаций было выявлено, что типичное PHP-приложение тратит примерно 20% времени на выполнение задач менеджера памяти, 10% на обработку хэш-таблиц, 30% на вызов внутренних функций и только 30% на выполнение кода в виртуальной машине.

Тем не менее, внедрение JIT не лишено смысла, так как даёт возможность вывести PHP за рамки web-разработки, благодаря повышению производительности при выполнении таких задач как машинное обучение, математические расчёты, анализ данных, 2D- и 3D-рендеринг. В ходе разработки ветки PHP 7 была проведена оптимизация методов работы с памятью и организации хранения структур данных, что позволило значительно поднять производительность. Например, в задачах, связанных с web-разработкой, PHP 7.3 догнал, а в некоторых тестах перегнал, по производительности альтернативную виртуальную машину HHVM для PHP, в которой применяется JIT-компиляция.

Теперь настал черёд оптимизации стадии выполнения. Так как интерпретатор байткода в Zend VM уже достаточно хорошо оптимизирован, предполагается, что JIT будет привлекаться только для выборочного выполнения конструкций, для обработки которых имеет значение производительность CPU, например, для кода, выполняющего интенсивные математические вычисления и обработку в циклах данных, находящихся в оперативной памяти.

©  OpenNet