Тестируем PHP на скорость выполнения

Тестируем PHP на скорость выполнения

Сегодня разберем интерпретатор PHP версии 5.2.4. Когда я начал разрабатывать интерпретатор Orion (собрата PHP), я параллельно начал тестировать скорость обработки сценариев в нашем подопытном. И обнаружил много интересных и нелогичных особенностей этого движка.

Константы или Переменные, что быстрее?

Конечно вы скажите что константы! Но в случае с PHP вы будете сильно ошибаться. Как это не парадоксально, но константы медленнее, если сравнивать их с глобальными или локальными переменными. Они медленней переменных примерно в 2-2,5 раза. Честно говоря, для меня это был шок. Для теста возьмем простой скрипт:

define('MY_CONST',100);
$x = 100;
$i = 0;
while ($i < 1000000){
$i++;
$d = MY_CONST + 1; // а этот медленней
$d = $x + 1; // этот код быстрее
}

Инкремент переменной или присваивание

Что вы думаете быстрее: $i++ или $i+=1 ? Логичнее предположить, что для инкремента $i++ в пхп должна быть отдельная и быстрая инструкция, ан нет! На практике $i+=1 выходит в 1,5 раза быстрее чем $i++. Инкремент $i++ по скорости в пхп все равно что $i = $i + 1; И так выводы:

$i++;
$i = $i + 1;
// по скорости верхние строчки одинаковы
$i += 1;
// а вот эта быстрее предыдущих 2х

Странность с присваиванием

Еще один интересный момент был мной обнаружен. Если вы будете присваивать одну переменной другой, то этот код будет работать медленней чем, когда в присваивании имеется еще какое-нибудь выражение, например:

$x = 20;
$d = $x;
// это работает быстрее предыдущего кода $d = $x в среднем на 20%
$d = $x+0;

Эта аномалия довольно странная.

Статичные и публичные методы, что быстрее?

А это вообще самое странное, что я обнаружил в PHP. В идеале статичный метод должен вызываться намного быстрее публичного метода объекта, но в пхп это не так, причем далеко не так. Вызов статичного метода в PHP в 10 раз медленнее относительно публичного, БИНГО! Как было выяснено, движок перед вызовом статичного метода класса вызывает дополнительную инструкцию байт-кода, что и приводит к такому замедлению. Добавление методу ключевого слова static проблему совершенно не решает, скорость выполнения не увеличивается.

class ABC {
function Any(){ }
}
ABC::Any();
// следующий код работает быстрее, не учитывая создание объекта
$obj = new ABC;
$obj->Any();

Продолжение следует

Конечно, это все мелочи, и часто они не играют роли в замедлении выполнения скриптов, но все же на некоторые стоит обратить внимание, например на статичные методы. Скоро будет опубликован еще один обзор подобных аномалий.

Внимание, все тесты были произведены без ZendOptiomazer’a, как известно оригинальный движок PHP не имеет никакого оптимизатора байт кода. Если вы производите тесты на других языках, то возможно в них уже встроен оптимизатор и тогда тесты станут не справедливыми. Например у Lua очень мощный оптимизатор кода, особенно она любит обрезать мертвый код.

Добавить комментарий

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