- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток. Вышла первая стабильная версия нового шаблонизатора Fenom [1]. Для нетерпеливых, Fenom — это легковесный (статистика прилагается), быстрый (бенчмарк прилагается), гибкий (API прилагается) шаблонизатор, который может стать удачной заменой шаблонизаторам Twig или Smarty.
Заинтересовавшихся прошу под кат
Шаблонизатор Fenom является ярким примером того, как вопрос «интересно, а на что способно расширение tokenizer [2]?» может привести к чему-то большему, чем пару скриптов в песочнице. Как и многие проекты, шаблонизатор начинался just-for-fun и был создан за один вечер. Первый вариант шаблонизатора занимал всего 900 строк кода, который парсил примитивные шаблоны. Для поддержания расширяемости в код шаблонизатора пришлось добавить еще 2500 строк кода.
Если кому интересно, я могу рассказать в отдельной статье все интересные моменты и нюансы, с которыми пришлось столкнуться при создании шаблонизатора.
Когда стало ясно, что эксперимент вышел за рамки обычной игры в песочнице, появилось желание довести его до полноценного OpenSource проекта, который смог бы использоваться в highload проектах и составить конкуренцию популярным PHP шаблонизаторам. Шаблонизация в highload проектах очень сложная тема. Когда приходится иметь дело с сотнями тысяч user-space шаблонов у всех шаблонизаторов начинают появляться свои «тараканы». К моменту создания Fenom, мне удалось поработать с такими PHP шаблонизаторами как Smarty2, Smarty3, Quicky, Twig, Latte. Опыт работы с ними помог мне понять каким должен быть шаблонизатор «моей мечты» :)
При разработке шаблонизатора я старался придерживаться следующих требований:
Набор тестов я позаимствовал у товарища VEG [4] из статьи Smarty vs. Twig: производительность [5], где Twig показал себя не с лучшей стороны. С тех пор прошло не мало времени так что я решил повторить, тесты приведенные в статье, с дополнительным соперником — Fenom. Действующие лица: Smarty версии 3.1.13, Twig версии 1.13.0 + расширение twig.so, Fenom версии 1.0.3. Очень хотел протестировать Volt из нативного фреймворка Phalcon, но, увы, на первом же тесте он ушел в бесконечный цикл, поэтому его пришлось дисквалифицировать.
Каждый тест запускался в 3х разных режимах:
Тесты выполнялись на 2,6 ГГц Intel Core i7, 8 ГБ 1600 МГц DDR3, MacOS 10.8.4, PHP 5.4.15 из-под CLI. Ubuntu 12.04 показала тоже соотношение в результатах. PHP запускалось с флагом -n, что отключает все внешние расширения. С twig.so тестировал отдельно. Результат брался со второго прогона тестов, когда ОС уже закешировала [6] файлы тестов и шаблонизаторов. Op-кешеры, конечно же, отключены как и все другие расширения.
Итак, первым тестом идет вывод большого количества переменных. По сути, в этом тесте есть смысл так как все шаблоны состоят из вывода переменных в шаблон.
Вывод большого количества переменных:
Шаблонизаторы | Холодный запуск | Штатный запуск | Горячий запуск |
---|---|---|---|
Smarty3 | 4.3394 sec, 15.2 MiB | 0.0239 sec, 9.2 MiB | 0.0015 sec, 9.2 MiB |
Twig | 1.9618 sec, 68.9 MiB | 0.0341 sec, 17.0 MiB | 0.0013 sec, 17.0 MiB |
Fenom | 0.3432 sec, 8.9 MiB | 0.0157 sec, 6.6 MiB | 0.0011 sec, 6.6 MiB |
В первом же тесте Twig выделил себя — тесты упали из-за превышения ограничения памяти (по умолчанию 32MB).
Второй тест представляет из себя итерацию большого массива, что тоже частый случай в шаблонах.
Итерация большого массива:
Шаблонизаторы | Холодный запуск | Штатный запуск | Горячий запуск |
---|---|---|---|
Smarty3 | 0.0223 sec, 5.8 MiB | 0.0036 sec, 3.1 MiB | 0.0024 sec, 3.1 MiB |
Twig | 0.0300 sec, 4.0 MiB | 0.0174 sec, 2.7 MiB | 0.0166 sec, 2.7 MiB |
Twig + extension | 0.0225 sec, 4.7 MiB | 0.0064 sec, 3.2 MiB | 0.0060 sec, 3.5 MiB |
Fenom | 0.0080 sec, 3.1 MiB | 0.0022 sec, 2.5 MiB | 0.0017 sec, 2.5 MiB |
Третий тест — наследование большого числа шаблонов. Этот тест я считаю более надуманным ибо более 2-3х уровней наследований хватает за глаза, тем не менее в тесте осталось 100 уровневое наследование. Не смотря на всю надуманность тест дает общее представление о производительности наследования шаблонов.
Наследование большого числа шаблонов:
Шаблонизаторы | Холодный запуск | Штатный запуск | Горячий запуск |
---|---|---|---|
Smarty3 | 0.4165 sec, 10.1 MiB | 0.0008 sec, 3.1 MiB | 0.0001 sec, 3.1 MiB |
Twig | 0.3626 sec, 11.2 MiB | 0.0252 sec, 6.5 MiB | 0.0021 sec, 6.5 MiB |
Fenom | 0.0569 sec, 3.2 MiB | 0.0005 sec, 2.5 MiB | 0.0000 sec, 2.5 MiB |
Twig и тут выделился, тест упал из-за превышения допустимой вложенности, в данном случае рекурсии. Ошибку бросило расширение xDebug, которое в последствии для тестов отключил.
Итог
Очевидным победителем стал Fenom, который в значительной степени опередил Smarty и Twig как по скорости, так и по экономии ресурсов. На втором месте Smarty, бронзу получает Twig.
Ниже приведена таблица «жирности» кода:
Шаблонизатора | Количество файлов | Количество классов | Количество строк кода |
---|---|---|---|
Smarty (3.1.13) | 320 | 190 | 55095 |
Twig (1.13.0) | 162 | 131 | 13908 |
Fenom (1.0.4) | 9 | 13 | 3967 |
Отмечу что:
Репозиторий: github.com/bzick/fenom [1]
Packagist.org: packagist.org/packages/bzick/fenom [12]
Composer: "fenom/fenom": "1.*"
Документация: github.com/bzick/fenom/blob/master/docs/main.md [13]
Баг трекер: github.com/bzick/fenom/issues [14]
На данный момент Fenom имеет уже досточно большой набор возможностей [13]. Но в планах реализовать тег {parent} для наследования шаблонов, добавить операторы in и is, а так же дописать и перевести документацию на английский язык. Буду рад если найдутся желающие помочь.
P.S.
Шаблонизатор все еще продолжает развиваться и принимает все конструктивные предложения и критику, которые вы можете написать в комментариях ;)
Автор: Aco
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/37965
Ссылки в тексте:
[1] Fenom: https://github.com/bzick/fenom
[2] tokenizer: http://php.net/manual/en/book.tokenizer.php
[3] KISS: http://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)
[4] VEG: http://habrahabr.ru/users/veg/
[5] Smarty vs. Twig: производительность: http://habrahabr.ru/post/128083/
[6] закешировала: http://ru.wikipedia.org/wiki/Mmap
[7] BISON: http://www.gnu.org/software/bison/
[8] сидит на регулярных: https://github.com/fabpot/Twig/blob/master/lib/Twig/Lexer.php
[9] видел: https://github.com/kakserpom/quicky/blob/master/Quicky_compiler.class.php#L1363
[10] и хуже: https://github.com/kakserpom/quicky/blob/master/Quicky_compiler.class.php#L371
[11] Маркусом: http://habrahabr.ru/post/153225/
[12] packagist.org/packages/bzick/fenom: https://packagist.org/packages/bzick/fenom
[13] github.com/bzick/fenom/blob/master/docs/main.md: https://github.com/bzick/fenom/blob/master/docs/main.md
[14] github.com/bzick/fenom/issues: https://github.com/bzick/fenom/issues
[15] Источник: http://habrahabr.ru/post/169525/
Нажмите здесь для печати.