Объекты тестирования
Для тестирования были выбраны шаблонизаторы, поддерживающие парадигму "pipeline":
Тестирование шаблонизаторов, работающих по принципу "callback", возможно, будут проведено позже.
Для тестирования скорости работы шаблонизаторов использовался модифицированный "Lebowski Bench", изначально разработанный Алексеем Рыбаком.
Суть теста заключается в построении "типичной" веб-страницы: списка "раскрашенных" разделов сайта, новостей, вывод набора тегов. Во время тестов шаблонизаторов использовался общий набор данных и собственный шаблон, построенный таким образом, чтобы выводимый результат маскимально совпадал с образцовым HTML.
Методика тестирования включала в себя пять измерений, два крайних по скорости результата отбрасывались, а оставшиеся три - осреднялись.
Тестирование скорости работы арифметических выражений производилось на шаблоне, выводящем в цикле результат вычисления простой формулы.
Основные характеристики исследуемых шаблонизаторов сведены в две таблицы. Первая таблица описывает свойства шаблонизатора, вторая - свойства поддерживаемого шаблонизатором диалекта.
| Шаблонизатор | Свойства |
| Написан на |
Лицензия |
Платформа |
Компиляция шаблонов |
Переносимость скомпилированных шаблонов |
Кэширование шаблонов |
| Template Toolkit |
Perl XS, C |
Perl Artistic License, GPL |
Кроссплатформенный |
Нет |
Нет |
Да |
| HTML::Template |
Perl |
Perl Artistic License |
Кроссплатформенный |
Нет |
Нет |
Да |
| HTML::Template::Pro |
Perl XS, C |
Perl Artistic Licence |
Кроссплатформенный |
Нет |
Нет |
Да |
| HTML::Template::Compiled |
Perl |
Perl Artistic License |
Кроссплатформенный |
Нет |
Нет |
Да |
| HTML::Template::JIT |
Perl XS |
Perl Artistic License |
Un*x (Linux, FreeBSD, Solaris) |
Да |
Нет |
Да |
| HTML::CTPP2 |
Perl XS, C++ |
BSD |
Кроссплатформенный |
Да |
Да |
Да |
Свойства поддерживаемого диалекта
| Шаблонизатор | Свойства диалекта |
| Вставка других шаблонов |
Циклы |
Итераторы |
Контекстные переменные |
Ветвления |
Условия в ветвлениях |
Именованные блоки |
Пользовательские функции |
| Template Toolkit |
Да |
Нет |
Да |
Да |
Да |
Да |
Да |
Да |
| HTML::Template |
Да |
Да |
Нет |
Да |
Да |
Нет |
Нет |
Нет |
| HTML::Template::Pro |
Да |
Да |
Нет |
Да |
Да |
Да |
Нет |
Нет |
| HTML::Template::Compiled |
Да |
Да |
Нет |
Да |
Да |
Да |
Нет |
Нет |
| HTML::Template::JIT |
Да |
Да |
Нет |
Да |
Да |
Нет |
Нет |
Нет |
| HTML::CTPP2 |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Следует прокомментировать понятия "цикл" и "итератор". Оба оператора последовательно проходят по элементам массива, предоставляя доступ к из содержимому, однако в ряде случаев тот или иной оператор может оказаться предпочтительнее. В качестве примера можно привести случай, когда глобальные переменные используются внутри цикла:
Доступ через цикл:
Default: <TMPL_var msg_flags>
<TMPL_loop messages>
<TMPL_var msg_flags>
</TMPL_loop>
Доступ посредством итератора:
Default: [% msg_flags %]
[% FOREACH iter IN messages %]
[% UNLESS iter.msg_flags %][% msg_flags %][% ELSE %][% iter.msg_flags %][% END %]
[% END %]
Результаты тестирования
Результаты тестирования скорости генерации страницы получены на сервере с установленной операционной системой FreeBSD 7.1 i386, и собранным из портов Perl v5.8.8 и тестируемыми модулями.
| Шаблонизатор | Скорость работы, запросы в секунду |
С контекстными переменными | Без контекстных переменных |
| Template Toolkit |
628* |
| HTML::Template |
796 |
1248 |
| HTML::Template::Pro |
4857 |
4942 |
| HTML::Template::Compiled |
6543 |
6550 |
| HTML::Template::JIT |
4411 |
7808 |
| HTML::CTPP2 | 9519* |
| * контекстные переменные не отключались |
Результаты тестирования скорости вычисления арифметического выражения.
| Шаблонизатор | Скорость работы, запросы в секунду |
| Template Toolkit |
1880 |
| HTML::Template::Pro |
9425 |
| HTML::Template::Compiled |
18070 |
| HTML::CTPP2 |
44371 |
Выводы
- Самым быстрым на данный момент шаблонизатором по всем проведенным тестам следует признать HTML::CTPP2.
- Самым медленным шаблонизатором является Template Toolkit.
- Скорость работы HTML::Template::JIT кардинальным образом зависит от использования контекстных переменных. В случае, когда контекстные переменные используются, производительность этого модуля падает драматическим образом оказываясь ниже HTML::Template::Compiled и сопоставимой с HTML::Template::Pro.
- Среди шаблонизаторов, поддерживающих арифметические и логические выражения сразу за безусловным лидером, HTML::CTPP2, второе место занимает HTML::Template::Compiled. Связано это, по всей видимости, с использованием прямого вызова Perl для вычисления значений. Несмотря на достаточно высокую скорость модуля HTML::Template::Compile, нельзя не отметить субъективную сложность его использования для подобных целей.
Код для тестов
Скачать
|