Имена топовых претендентов вспомнил сам, остальные нашел, вооружившись статистикой GitHub и обсуждениями на Reddit. Вот такой список получился:
Smarty: github.com/smarty-php/smarty
Plates: github.com/thephpleague/plates
Mustache: github.com/bobthecow/mustache.php
Twig: github.com/twigphp/Twig
Blade: github.com/jenssegers/blade
BladeOne: github.com/EFTEC/BladeOne
Latte: github.com/nette/latte
Если знаете интересный вариант — пишите, добавлю в тест. Blade довольно глубоко интегрирован в Laravel, поэтому пришлось взять пару его standalone-реализаций. К сожалению, ни одна из них не поддерживает компоненты Blade-X.
Чтобы понять суть бенчмарка, проще всего взглянуть на версию кода с чистым PHP:
$data = [
(object) [
"code" => 200,
"message" => "OK"
],
(object) [
"code" => 404,
"message" => "Not Found"
],
(object) [
"code" => 500,
"message" => "Internal Server Error"
],
];
$html = '<html><head></head><body>';
foreach ($data as $message) {
$html .= "<p>$message->code : $message->message</p>";
}
$html .= '</body></html>';
Это синтетический тест вывода в HTML-шаблон массива из трех объектов, содержащих два свойства: HTML-код и его краткое описание.
Так выглядит аналог на Twig:
<html><head></head><body>
{% for message in data %}
<p>{{ message.code }} : {{ message.message }}</p>
{% endfor %}
</body></html>
А это Blade:
<html><head></head><body>
@foreach ($data as $message)
<p>{{ $message->code }} : {{ $message->message }}</p>
@endforeach
</body></html>
Тесты прогонялись в контейнере Ubuntu 20.04 / PHP 7.4 / Comet 0.6 на виртуалке с 4 ядрами Ryzen 3600 и 4G памяти:
wrk --connections=500 --threads=2 --duration=10s http://comet:8080/php
Получился такой расклад, каждый график отражает среднее количество успешно отработанных за одну секунду запросов:
Чистый PHP — ожидаемо первый, но неожиданно, что Blade отстает аж в два раза! И почему «легковесный» Plates отстает от «мощного» Twig? Все фреймворки используют штатное кеширование, так что результаты максимально приближены к реальным.
В рамках одной статьи не хотелось перегружать читателя расширенным анализом кода, стратегий работы и кеширования движков, разбором важных для меня критериев выбора шаблонизатора. Если тема будет интересной — напишу продолжение.
На правах рекламы: посмотрите на Comet, в ближайших планах — сделать его самым быстрым и удобным PHP-фреймворком для создания restful API и микросервисов :)
mr_tron
Решил я как-то побенкмарчить шаблонизаторы на шаблонизаторе и выяснилось что сам шаблонизатор быстрее чем шаблонизаторы на шаблонизаторе.
gotz Автор
Воистину :) Но «сам шаблонизатор» не делает базовых вещей типа экранирования HTML-тегов, поэтому я даже удивлен, что наш эталон быстрее не в разы, а всего лишь на 20%
SamDark
Чего тут удивляться? Тот же Twig по факту "компилит" шаблон в PHP код, да ещё и оптимизированный и вот он уже кешируется и запускается.
gotz Автор
Здесь не очень уместно приводить скомпилированный Twig, но это внушительный файлик из восьмидесяти строк… против четырех для чистого PHP. Скорее всего, разница нивелируется архитектурой Comet, в которой все классы подгружаются один раз и остаются в памяти. В классическом FPM-приложении разница была бы более драматической. Один раздел импортов в скомпилированном шаблоне Твиг чего стоит:
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;
SamDark
Опкеш и preload никто не отменял. И да, срезать время на предзагрузке — это нормальная идея. Ещё больше удастся получить если вместо Workerman взять Swoole или RoadRunner. Мы под это дело готовим Yii 3, результаты отличные.
gotz Автор
Techempower Benchmarks считают что workerman самый быстрый :)
www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=fortune&l=zik073-1r
SamDark
О, значит у меня устаревшие данные. Спасибо.
morozovsk
Оказывается несколько дней назад рейтинги пересчитали. Я этого момента уже несколько месяцев жду. Очень круто, что workerman так высоко поднялся. С последнего пересчёта удалось ускорить в 2 раза, ну а spiral оказался даже ниже чем, я ему пророчил, в абсолютных цифрах то же самое, а в относительных — 31 место вместо 16.
Было бы круто запускать yii3 под workerman из коробки. Сейчас у меня есть свой велосипед для запуска yii2 из под workerman, но его трудно поддерживать.
gotz Автор
Эти тесты циклически гоняются по кругу каждые 5-7 дней, не надо ждать результатов несколько месяцев — надо пользоваться ссылками в описании, чтобы отслеживать свежие результаты :) Топовые позиции workerman и php-ngx наблюдаю в нем весь 2020 год. Сегодня приняли мой пулл реквест в мастер с фреймворком Comet на базе Workerman. Надеюсь к Round 20 тоже выйти в топ