Twig — молодой шаблонизатор от разработчиков Symfony. Авторы позиционируют его как быстрый и функциональный шаблонизатор. По возможностям он во многом похож на Smarty 3. Twig отличает несколько другой синтаксис, а так же заявленная высокая производительность. Проверим?
Тестирование
При тестировании мы намеренно будем использовать достаточно сложные шаблоны, чтобы время обработки было ощутимым. Собственно это время мы и будем оценивать, для чего мы подготовим соответствующие скрипты.
Код для Smarty получился очень простым:
$data = json_decode(file_get_contents('data.json'), true); require('smarty/Smarty.class.php'); $smarty = new Smarty(); $smarty->compile_check = false; $start = microtime(true); $smarty->assign($data); $smarty->fetch('demo.tpl'); echo microtime(true)-$start;
Для Twig несколько сложнее:
$data = json_decode(file_get_contents('data.json'), true); require('twig/Autoloader.php'); Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('templates'); $twig = new Twig_Environment($loader, array( 'cache' => 'templates_c', 'autoescape' => false, 'auto_reload' => false, )); $start = microtime(true); $template = $twig->loadTemplate('demo.tpl'); $template->render($data); echo microtime(true)-$start;
Оба шаблонизатора настроены похожим образом: выключено автоматическое экранирование, отключена автоматическая перекомпиляция шаблонов при изменениях.
Получение значений переменных
Получение значений переменных — наиболее активно используемая операция. В сложных шаблонах она может использоваться по нескольку сотен раз. Поначалу может показаться, что скорость выполнения этой операции не должна зависеть от шаблонизатора, однако это не так. Для хранения шаблонных переменных должна использоваться какая-то структура. Чем она проще — тем быстрее работает получение значений переменных. Для оценки производительности этой операции сгенерируем шаблон, в котором будет просто выводиться значение 10000 переменных и ничего более.
Smarty:
{$var0} {$var1} {$var2} {$var3} {$var4} ...
Twig:
{{ var0 }} {{ var1 }} {{ var2 }} {{ var3 }} {{ var4 }} ...
Результат:
| Компиляция | Выполнение | |
|---|---|---|
| Smarty 3.1.1 | 16.320 сек. | 0.058 сек. |
| Twig 1.2.0 | 9.757 сек. | 0.083 сек. |
Обход массивов и вывод значений полей
Ни один более-менее серьёзный шаблон не обходится без foreach. Для теста напишем шаблон, который выводит по 10 полей из 1000 элементов массива.
Smarty:
{foreach $array as $item} {$item.id} {$item.title} {$item.var1} {$item.var2} {$item.var3} {$item.var4} {$item.var5} {$item.var6} {$item.var5} {$item.var6} {/foreach}
Twig:
{% for item in array %} {{ item.id }} {{ item.title }} {{ item.var1 }} {{ item.var2 }} {{ item.var3 }} {{ item.var4 }} {{ item.var5 }} {{ item.var6 }} {{ item.var5 }} {{ item.var6 }} {% endfor %}
Результат:
| Компиляция | Выполнение | |
|---|---|---|
| Smarty 3.1.1 | 0.065 сек. | 0.009 сек. |
| Twig 1.2.0 | 0.131 сек. | 0.082 сек. |
Наследование
Наследование шаблонов — это очень удобный механизм. Только из-за этого можно полюбить тестируемые шаблонизаторы :) Давайте узнаем, какие накладные расходы появляются при использовании наследования в Smarty и Twig. Для этого создадим один родительский шаблон с 500 блоками, и ещё 500 маленьких шаблонов, каждый из которых будет наследоваться друг от друга, заполняя статическими данными один из 500 блоков родительского шаблона. Шаблонизатору отдадим на растерзание последнего в цепочке.
Результат:
| Компиляция | Выполнение | |
|---|---|---|
| Smarty 3.1.1 | 1.329 сек. | 0.002 сек. |
| Twig 1.2.0 | 2.641 сек. | 0.121 сек. |
Итого
Вывод напрашивается сам собой: Smarty быстрее Twig. Компиляция больших шаблонов занимает больше времени, но в результате мы получаем лучшую производительность.
Для тестирования использовался ноутбук. Pentium Dual-Core T4200 (2 GHz), 3GB RAM — ничего сверхъестественного. Использованная версия PHP — 5.3. На случай, если у вас появится желание самостоятельно оценить производительность Smarty и Twig на вашем оборудовании, вы можете скачать исходные коды всех тестов одним архивом.

