Оптимизация байт-кода в PHP
Отсутствие всякой оптимизации кода в PHP
Я давно задавался вопросом, насколько «умным» является интерпретатор PHP в том, что касается оптимизации. В частности, меня всегда интересовала поддержка исключения неиспользуемого кода (известная как dead code elimination) и распространение константных значений (constant propagation). И теперь, когда я вплотную занялся изучением внутренностей Zend Engine, у меня такая возможность появилась.
Я взял простой тестовый файл:
$a = 2 * 2;
$a = 3 * 3;
print $a;
?>
В идеале выражения 2*2 и 3*3 должны вычисляться на этапе компиляции, выражение $a = 2 * 2; выбрасываться за ненужностью (ибо его вычисление не связано с побочными эффектами, а результат не используется), а print $a; заменяться print 9; (ибо значение $a известно).
Результирующий код «дизассемблировался» самопальным zend-расширением (которое пока за сыростью его исходников в общий доступ выкладывать не буду).
Результирующий код «дизассемблировался» при помощи замечательного расширения Vulcan Logic Disassembler, спасшего меня от изобретения очередного велосипеда.
На выходе получился такой результат:
-------------------------------------------------------------------------------
2 0 MUL ~0 2, 2
1 ASSIGN $a, ~0
3 2 MUL ~2 3, 3
3 ASSIGN $a, ~2
4 4 PRINT ~4 $a
5 FREE ~4
5 6 RETURN 1
7* ZEND_HANDLE_EXCEPTION
Из чего следует, что все константные выражения вычисляются непосредственно в ходе выполнения кода; как следствие, константы, получаемые в ходе вычисления константных выражений, не распространяются. И мёртвый код не удаляется. Обидно.
Поэтому когда китайские программисты наблюдают дао присваивания ($a = $a;), это вредит производительности.
Сен
2009
Комментарии к статье «Оптимизация байт-кода в PHP» (2) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Оптимизация байт-кода в PHP»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


[...] я для себя открыл, что PHP не умеет оптимизировать код, а тут новый удар: оказывается, что красота кода [...]
[...] А также: [...]