Оптимизация байт-кода в PHP

Vladimir
Опубликовано в: PHP

Отсутствие всякой оптимизации кода в PHP

Я давно задавался вопросом, насколько «умным» является интерпретатор PHP в том, что касается оптимизации. В частности, меня всегда интересовала поддержка исключения неиспользуемого кода (известная как dead code elimination) и распространение константных значений (constant propagation). И теперь, когда я вплотную занялся изучением внутренностей Zend Engine, у меня такая возможность появилась.

Я взял простой тестовый файл:

[-]
View Code PHP
<?php
    $a = 2 * 2;
    $a = 3 * 3;
    print $a;
?>

В идеале выражения 2*2 и 3*3 должны вычисляться на этапе компиляции, выражение $a = 2 * 2; выбрасываться за ненужностью (ибо его вычисление не связано с побочными эффектами, а результат не используется), а print $a; заменяться print 9; (ибо значение $a известно).

Результирующий код «дизассемблировался» самопальным zend-расширением (которое пока за сыростью его исходников в общий доступ выкладывать не буду).
Результирующий код «дизассемблировался» при помощи замечательного расширения Vulcan Logic Disassembler, спасшего меня от изобретения очередного велосипеда.

На выходе получился такой результат:

[-]
View Code Text
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   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;), это вредит производительности.

Добавить в закладки

Связанные записи

15
Сен
2009

Комментарии к статье «Оптимизация байт-кода в PHP» (1)  »

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

Подписаться на RSS-ленту комментариев к статье «Оптимизация байт-кода в PHP» Trackback URL: http://blog.sjinks.org.ua/php/638-byte-code-optimization-in-php/trackback/

Оставить комментарий к записи «Оптимизация байт-кода в PHP»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя