Smarty是PHP语言里面最经典的模板引擎,如果你曾经开发过PHP程序,那么或多或少都有使用过它。Smarty在2010年发布了第三版,Smarty 3用当下最新的PHP5进行了重构。它保留了原有的语法并加入了一些更现代的特性。
Twig是来自Symfony开发者,Twig作者将其定位成一个快速及功能强大的现代模板引擎。Twig有着许多与Smarty 3相似的特性,但为了提高性能而稍微有些不同。
现在我们来将两者进行一下性能对比测试:
测试
我们准备了较复杂的模板以便可以明显看出程序执行的时间,以下是我们的代码:
相同的功能,看起来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 }} ...
|
Result:
|
Compiling |
Execution |
Smarty 3.1.1 |
16.320 seconds |
0.058 seconds |
Twig 1.2.0 |
9.757 seconds |
0.083 seconds |
上面的表格演示了多次连续测试的平均值。我们可以看到程序已经编译生成了1万个变量的模板,Smarty在编译的时候是远远落后于Twig。不过编译仅仅是第一次访问的时候执行,之后会一直使用编译后的页面,所以编译后的页面执行速度才是更重要的。编译后的执行时间,Smarty是比Twig快速了30%左右,
使用多次foreach来测试
一般开发中模板经常用到foreach,这里我们用了1000个带有十个元素的数组,来测试一下两个模板引擎的foreach性能。
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 %}
Result: .
|
Compiling |
Execution |
Smarty 3.1.1 |
0.065 seconds |
0.009 seconds |
Twig 1.2.0 |
0.131 seconds |
0.082 seconds |
这里有个令人惊讶的情况:编译后的Smarty模板比Twig执行快近10倍以上。与此同时,就算是编译+执行一起计算,Smarty还是会比Twig快。我们可以推测模板编译器而言,Smarty初始化比Twig要快许多。Smarty在上个测试中执行中稍微慢些,但在小型模板中几乎无法察觉。
继承
模板中继承是一个很方便的机制。或者可以认为继承是在使用已经过严格测试的模板引擎吧。让我们来看看当Smarty和Twig执行继承的时候会有多少性能上的负载。
我们建立了一个父模板,它拥有500个块(blocks)的子模板,每个子模板都继承于上一个子模板,同时子模板中都有静态的数据提供给父模板来调用。我们将通过模板引擎处理该继承链条的执行。
Result:
|
Compiling |
Execution |
Smarty 3.1.1 |
1.329 seconds |
0.002 seconds |
Twig 1.2.0 |
2.641 seconds |
0.121 seconds |
Smarty快60倍以上。如果我们查看编译后的代码,会很容易明白还不止60倍。Smarty将整个模板的xx联合起来放到一个大文件中存放起来,执行起来就如同并不存在嵌套一样。也就是说,Smarty的xx机制计划没有任何的性能损失,Twig是小心地为每个xx模板建立类文件,并在执行期间一个个地嵌入并执行。
总结
结论很清晰:Smarty比Twig要更快,仅在一次性编译较大模板时耗费了更多的时间,但除此之外其他的操作均有更高的性能。
我们测试的环境是:奔腾双核T4200 (2 GHz),3GB内存,PHP5.3版本。如果你想在自己电脑上进行上述的性能测试,你可以在本文的最后下载全部代码。
分享到:
相关推荐
除此之外,新支持字符串类型的模板,感觉比较生猛,离模板之路也是渐行渐远: 代码片断: $smarty->display('string:This is my template, {$foo}!'); smarty3的相关链接 Smarty 3 Alpha with SVN-- 选择googlecode...
php Smarty 模板 版本:Smarty 2.6.24
Slim Framework 4 Smarty视图 这是一个基于Smarty模板组件的Slim Framework 4视图帮助器。 您可以使用此组件在Slim Framework应用程序中创建和呈现模板。 对于Slim Framework 3,请参阅安装通过$ composer require ...
用于Visual Studio代码的Smarty模板 此扩展为Visual Studio Code提供支持。 支持{...}和{{...}}分隔符。 特征 语法高亮 片段完成 代码格式 代码折叠 代码导航 评论切换 支架自动关闭 支架自动环绕 悬停文档 自动...
本文实例讲述了Twig模板引擎用法。...高效:Twig将模板编译成了优化了的PHP文件,与原生的PHP代码比较而言,性能损耗非常小。 安全:Twig使用沙箱(sandbox)模式去运行模板中不被信任的代码。这使得我们可以选择Twi
Smarty4Js (Smarty For Javascript) 什么? JavaScript 模板引擎 支持smarty模板语法 在 nodejs 中使用 创建和渲染模板的简单而强大的方法 为什么? 强大的 不想在您的项目中有两个或多个模板。 深爱聪明 什么...
RequireJSJavaScript模板插件,带有Smarty和Twig语言语法的子集。 安装方式 npm install glide-templates --save 配置 需要RequireJS的最小配置。 插件名称是硬编码的,因此,现在RequireJS paths配置变量必须包括...
PPI Smarty模块用于模板引擎模块。聪明的 Smarty是PHP的模板引擎,有助于将表示形式(HTML / CSS)与应用程序逻辑分离。 这意味着PHP代码是应用程序逻辑,并且与表示分离。 Smarty的一些功能: 这是非常快的。 由于...
Klein.php-Smarty 带有Smarty模板引擎的Klein.php。安装通过作曲家安装。 composer create-project f3l1x/kleinsmarty: ~ 0.2 创建应用程序/缓存文件夹。 打开KleinPHP-Smarty根文件夹,然后运行server.php 。...
Fenom 的 Smarty 回退 句法 在修饰符之前忽略@ 。 修饰符始终应用于变量, {$array|@count} 、 {$array|count} 、 count($array)是相同的。 不支持的Smarty3 {foreach}属性是 @index、@iteration、@first、@last、@...
从 JSON 为 Javascript、Node.js、PHP(Smarty,Twig)、Ruby 构建 html 表单 主要条款: 从行构建表单。 行有一个标签(单个)、控件(多个)和消息(多个)。 行本质(标签、控件、消息)呈现的顺序相同。 标签是...
1、Smarty介绍及应用的优缺点 Smarty是一个使用...2、Smarty的配置3、Smarty的应用:变量,循环…数组是最常用的方式,可以帮助我们循环列表,和快速访问打理数据,如果要循环数组我们可以使用Smarty内置的方法section
PHP-Smarty-MVC PHP 的基本 MVC 框架,它使用 Smarty 模板引擎和开放模式数据库(基于数据模型)。 将以下内容添加到您的 .htaccess 或 Apache 配置中: 重写引擎开启 RewriteCond %{REQUEST_FILENAME} !-f ...
聪明的解析器 简单的JS库,用于将smarty模板解析为AST
1、Smarty介绍及应用的优缺点 2、Smarty的配置 3、Smarty的应用:变量,循环…
软件介绍 1、Smarty介绍及应用的优缺点 Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的...
React / Redux / Router入门项目 提供给的学生 前叉
SocialBox是一个由Smarty Singh编码的Bruteforce攻击框架[Facebook,Gmail] 安装 sudo apt-get install git git clone https://github.com/TunisianEagles/SocialBox.git cd SocialBox chmod +x SocialBox.sh chmod ...
Smarty库文件 :(在/libs/目录里的库文件) Smarty.class.php Smarty_Compiler.class.php Config_File.class.php debug.tpl /core/*.php (all of them) /plugins/*.php (all of them)
Gettext对Smarty2 / Smarty3的支持 为流行PHP模板引擎提供了gettext(i18n)支持,以实现NLS(本国语言支持)API,该API可用于对PHP应用程序进行国际化和翻译。 本自述文件假定您已经知道什么是以及如何在PHP中...