最快的PHP模板引擎

Comet项目选择模板引擎,我决定比较PHP社区中所有流行的引擎。通常,这种选择是由框架决定的:交响乐手将模板包装在Twig中,Laravel程序员将用Blade武装自己。但是我对这个问题感兴趣-这些选项在性能方面有何不同?在测试了七个引擎和纯PHP之后,我得到了答案。数据,时间表,冠军和失败者-减少了!



他回顾了顶级申请人的名字;他找到了其余的人,这些人都拥有GitHub的统计数据和有关Reddit的讨论。这是列表:

Smarty:github.com/smarty-php/smarty
盘子:github.com/thephpleague/plates
小胡子:github.com/bobthecow/mustache.php
树枝:github.com/twigphp/Twig
刀片:github.com / jenssegers / blade
BladeOne:github.com/EFTEC/BladeOne
拿铁咖啡:github.com/nette/latte

如果您知道一个有趣的选择-写,我将添加到测试中。 Blade已非常深入地集成到Laravel中,因此我不得不采用几个独立的实现。不幸的是,它们都不支持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>

测试在具有4个Ryzen 3600内核和4G内存的虚拟机上的Ubuntu 20.04 / PHP 7.4 / Comet 0.6容器中运行:

wrk --connections=500 --threads=2 --duration=10s http://comet:8080/php

事实证明,每种情况下的图表反映了在一秒钟内成功处理的请求的平均数量:



纯PHP-首先,但是出乎意料的是,Blade已经落后了一半!为什么“轻量级”板块落后于“功能强大”的Twig?所有框架都使用常规缓存,因此结果尽可能接近真实框架。

在一篇文章的框架内,我不想让读者对代码,工作策略和引擎缓存,对选择模板引擎的标准进行分析的扩展分析对我来说很重要。如果这个话题很有趣-我会写续集。

作为广告:请看Comet,在不久的将来-使它成为创建宁静的API和微服务的最快,最方便的PHP框架:)

All Articles