Smarty Против Twig: Производительность

Умник — один из старейших шаблонизаторов PHP. Если вы программируете на PHP, скорее всего, вы с ним работали.

В 2010 году была выпущена третья версия этого шаблонизатора.

Smarty 3 был написан с нуля, с широким использованием PHP5. В то же время Smarty получил обновленный синтаксис и современные функции, в том числе наследование , песочница и так далее.

Ветка — молодой шаблонизатор от разработчиков 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;

Оба шаблонизатора настроены одинаково: автоматическое экранирование отключено, а автоматическая перекомпиляция шаблонов при внесении изменений отключена.



Получение значений переменных

Получение значений переменных — наиболее часто используемая операция.

В сложных шаблонах его можно использовать несколько сотен раз.

На первый взгляд может показаться, что скорость этой операции не должна зависеть от шаблонизатора, но это не так.

Для хранения переменных шаблона должна использоваться какая-то структура.

Чем проще, тем быстрее можно получить значения переменных.

Чтобы оценить производительность этой операции, мы сгенерируем шаблон, который будет просто отображать значение 10 000 переменных и не более того.

Умник:

{$var0} {$var1} {$var2} {$var3} {$var4} .



Ветка:

{{ var0 }} {{ var1 }} {{ var2 }} {{ var3 }} {{ var4 }} .



Результат:

Сборник Производительность
Смарти 3.1.1 16.320 сек.

0,058 сек.

Веточка 1.2.0 9,757 сек.

0,083 сек.

В таблице приведены средние значения из нескольких последовательных тестов.

Как видите, десять тысяч синтаксических конструкций компилировались очень долго обоими участниками теста.

В этом отношении Smarty сильно отстает от Twig. Однако компиляция выполняется только один раз, а затем запускается уже скомпилированная версия шаблона, поэтому время работы последнего гораздо важнее.

И здесь Смарти уверенно опережает своего оппонента на ≈30%.



Обход массивов и отображение значений полей

Без foreach не обходится ни один более-менее серьёзный шаблон.

Для теста напишем шаблон, отображающий 10 полей из 1000 элементов массива.

Умник:

{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}

Ветка:

{% 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 %}

Результат:

Сборник Производительность
Смарти 3.1.1 0,065 сек.

0,009 сек.

Веточка 1.2.0 0,131 сек.

0,082 сек.

Здесь происходит нечто невероятное: скомпилированный шаблон Smarty работает почти в 10 раз быстрее, чем версия Twig! Более того, даже компиляция+выполнение в Smarty происходит быстрее, чем выполнение готового скомпилированного шаблона в Twig. Отсюда можно сделать вывод, что компилятор шаблонов Smarty инициализируется быстрее, чем Twig, но судя по предыдущему тесту работает медленнее, что практически незаметно на маленьких шаблонах.



Наследование

Наследование шаблонов — очень удобный механизм.

Это единственная причина, по которой можно полюбить тестируемые шаблонизаторы :) Давайте выясним, какие накладные расходы возникают при использовании наследования в Smarty и Twig. Для этого мы создадим один родительский шаблон с 500 блоками и еще 500 маленьких шаблонов, каждый из которых будет наследовать друг от друга, заполняя один из 500 блоков родительского шаблона статическими данными.

Последнего в цепочке мы отдадим шаблонизатору на растерзание.

Результат:

Сборник Производительность
Смарти 3.1.1 1,329 сек.

0,002 сек.

Веточка 1.2.0 2,641 сек.

0,121 сек.

Smarty работал в 60 раз быстрее.

Если посмотреть на скомпилированный код, то легко увидеть, что это не предел.

Smarty объединил всю цепочку унаследованных шаблонов в один большой файл, как будто наследования вообще не было.

То есть в результате при использовании наследования вообще нет потери производительности! Twig тщательно создал красивый класс и файл для каждого шаблона, и каждый раз, когда страница генерируется, он загружает все это.



Общий

Вывод напрашивается сам собой: Smarty быстрее Twig. Компиляция более крупных шаблонов занимает больше времени, но приводит к повышению производительности.

Для тестирования использовался ноутбук.

Pentium Dual-Core T4200 (2 ГГц), 3 ГБ ОЗУ – ничего сверхъестественного.

Используемая версия PHP — 5.3. Если вы хотите самостоятельно оценить производительность Smarty и Twig на своем оборудовании, вы можете скачать исходные коды всех тестов.

один архив .

Теги: #php #smarty #twig #Разработка сайтов #php

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.