В первом посте про XHProf: XHProf – профайлер PHP от Facebook, рассказывалось, что это за инструмент, как его установить, настроить и использовать. Решил провести небольшой тест производительности популярных фреймворков, используя данные XHProf.
Цель теста – посмотреть, какие данные получим по таким показателям, как:
- Wall Time (a.k.a. Elapsed time or wall clock time)
- CPU (CPU time in user space + CPU time in kernel space)
- MemUse (Memory usage)
- PeakMemUse (Peak memory usage)
- Number of Function Calls
Какие фреймворки протестировали?
- Yii 1.0.11
- Yii 1.1.rc
- Yiilite 1.0.11 / 1.1.rc (Bootstrap файл, где собраны вместе часто используемые классы. Плюс все комментарии и выражения трассировки вырезаются)
- Symfony 1.2.11
- Symfony 1.4.2
- Zend Framework 1.9.6
- DooPHP 1.2
- Codeigniter 1.7.2
- Kohana 2.3.4
- Kohana 3.0.3
- Cakephp 1.2.5 (тормозил больше всех, видно в 1.3.0 починили)
- Cakephp 1.3.0 alpha
- Recess 0.20 (был взят ради спортивного интереса, т.к. позиционирует себя как: Easy, Reliable, Fast, Extensible)
Почему именно эти PHP фреймворки? Эти проекты интересные, популярные 🙂 и все ещё развиваются.
Как проводилось тестирование?
Для получения результатов выполнялось около 10 выборок по каждому фреймворку. И в качестве данных использовались
лучшие результаты с наименьшими задержками времени.
Условия тестирования
- Операционная система: FreeBSD 8.0
- Web сервер: Apache httpd 2.2.13
- PHP 5.2.11 + APC + XHProf + много других модулей
- CPU: VIA C7 1500MHz
- Оперативная память: 1GB
- Винчестер: 250 GB 5400 RPM 8MB SATA
Режимы тестирования
- Выключенный APC
- С включенным APC (apc.stat = 1)
- С включенным APC (apc.stat = 0)
“apc.stat = 1” – штатный режим APC, проверяется дата модификации файла, и если она изменилась, то кеш для файлов обновляется. В случае, если “apc.stat = 0”, то проверка не проводится, что положительно влияет на производительность. НО в этом случае, пока не сбросите кеш вручную, данные не обновятся.
Тестируемые приложения
Для каждого фреймворка было написано свое приложение. Каждое приложение выводит строку “Hello world!”. Все настройки фреймворков использовались по умолчанию. За основу была взята идея phpmark.
Результат #1. APC выключен
Yiilite не рекомендуется использовать без кеширования байткода (APC, XCache, eAccelerator), что собственно и видно по результатам теста.
Результат #2. APC включен (apc.stat = 1)
А тут наоборот, Yiilite отрабатывает быстрее, но потребляет больше памяти.
Результат #3. APC включен (apc.stat = 0)
Очень интересные цифры получаются. Например, Wall Time (ms) у Zend Framework 1.9.6 уменьшилось практически на 50%, для других на 5-30 мс. Но режим этот не всем подойдет, и к тому же тут свои нюансы, связанные с очищением кеша.
Сравниваем результаты “Wall Time (ms)” для всех режимов
Как можно убедиться, использование APC очень положительно сказывается на производительсности, время загрузки страницы увеличивается в разы для некоторых фреймворков.
Сравниваем результаты “MemUse (kb)” для всех режимов
Тут видно положительный эффект от использование APC – потребления памяти уменьшается в раза 2-3.
Update – Yii with View
Для Yii было заменено приложение, чтобы задействовать View. Все графики обновлены. Если сравнивать с предыдущими значениями Yii, то новые увеличились на 5-10 мс.
Выводы
Вот так с помощью XHProf стало видно, кто у нас тяжеловес из PHP фреймворков :). О чем это свидетельствует? Да ровным счетом ничего – это всего лишь “Hello World!” да и железка слабовата… :). Если взять реальный сайт с БД, его сложной бизнес логикой, то цифры будут совсем другие.
Я в своей работе использую Symfony 1.2.11. Да, он тяжеловат, но его плюсы перекрывают все его минусы, по моему мнению. К тому же, если взять нормальный сервачок (Opteron X2 2.2 GHz, 8 GB + хорошие веники) вместо VIA C7 1500MHz, то тот же самый “Hello World!” вместо 177 мс загрузится на Opteron за 23 мс, а реальный сайт – 146 мс. Вот так! Но это уже другая история.
А вот Yii Framework нахожу очень интересным и серьезным проектом. Осталось его испытать в боевых условиях.