Тестируем PHP на скорость выполненияИ так начнем. Сегодня разберем интерпретатор PHP версии 5.2.4. Когда я начал разрабатывать интерпретатор Orion (собрата PHP), я параллельно начал тестировать скорость обработки сценариев в нашем подопытном. И обнаружил много интересных и нелогичных особенностей этого движка. Константы или Переменные, что быстрее?Конечно вы скажите что константы! Но в случае с PHP вы будете сильно ошибаться. Как это не парадоксально, но константы медленнее, если сравнивать их с глобальными или локальными переменными. Они медленней переменных примерно в 2-2,5 раза. Честно говоря, для меня это был шок. Для теста возьмем простой скрипт:
Инкремент переменной или присваиваниеЧто вы думаете быстрее: $i++ или $i+=1 ? Логичнее предположить, что для инкремента $i++ в пхп должна быть отдельная и быстрая инструкция, ан нет! На практике $i+=1 выходит в 1,5 раза быстрее чем $i++. Инкремент $i++ по скорости в пхп все равно что $i = $i + 1; И так выводы:
Странность с присваиваниемЕще один интересный момент был мной обнаружен. Если вы будете присваивать одну переменной другой, то этот код будет работать медленней чем, когда в присваивании имеется еще какое-нибудь выражение, например:
Эта аномалия довольно странная. Статичные и публичные методы, что быстрее?А это вообще самое странное, что я обнаружил в PHP. В идеале статичный метод должен вызываться намного быстрее публичного метода объекта, но в пхп это не так, причем далеко не так. Вызов статичного метода в PHP в 10 раз медленнее относительно публичного, БИНГО! Как было выяснено, движок перед вызовом статичного метода класса вызывает дополнительную инструкцию байт-кода, что и приводит к такому замедлению. Добавление методу ключевого слова static проблему совершенно не решает, скорость выполнения не увеличивается.
Продолжение следуетКонечно, это все мелочи, и часто они не играют роли в замедлении выполнения скриптов, но все же на некоторые стоит обратить внимание, например на статичные методы. Скоро будет опубликован еще один обзор подобных аномалий. Внимание, все тесты были произведены без ZendOptiomazer'a, как известно оригинальный движок PHP не имеет никакого оптимизатора байт кода. Если вы производите тесты на других языках, то возможно в них уже встроен оптимизатор и тогда тесты станут не справедливыми. Например у Lua очень мощный оптимизатор кода, особенно она любит обрезать мертвый код. вернутся к списку |