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

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

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

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

[-]
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;), это вредит производительности.

Автор: ; опубликовано в: PHP; метки: PHP, Zend Engine, оптимизация, производительность
15
Сен
2009

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

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

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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

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

गते गते पारगते पारसंगते बोधि स्वाहा