smarty模板嵌套之include与fetch性能测试

2015-01-24信息快讯网

使用模板时难免要碰到模板嵌套的时候,大家都知道有两种方法可以实现,以下是个人早期的一些使用感受。

方法一、使用在父模板中使用{include file="child.tpl"}直接将子模板包含进来

  优点:

    1、有利于模块的划分和模板的重用。

    2、嵌套层次不多的时候,模板的结构清晰,一眼过去就知道这个模板的内容和结构。

    3、只需要一个smarty实例就能做完所有的事情,减少系统资源的占用。

  不足:

    1、子模板中的变量可能与父模板的变量发生冲突

    2、多重嵌套的时候,变量名冲突的几率增大,为所有的变量赋值的难度也加大。

    3、子模板的可操控性差,例如不能通过设置$cache_id, $compile_id,来得到多个结果。

    4、扩展性差。如果需要添加新的模板的时候需要修改模板,同时还需要修改程序。

方法二、通过$smarty->fetch()将子模板的数据当成变量assign到父模板中

  优点:

    1、同样有利于模块的划分,模板的重用

    2、模板的结构同样清晰

    3、子模板作为单独的对象,可操控性强

    4、扩展性较好 

    5、每个子模板都是单独的对象,不会出现变量名冲突的问题

  不足:

    1、如果子模板多的时候,需使用多个smarty实例来实现,PHP代码显得臃肿

    2、占用较多的系统资源

    3、......

在那个的时候,出于对性能的要求,以及在没有测试的情况下,想当然的认为include的性能一定就比fetch的性能要高,所有本人使用include这个方法,结果随着系统功能的不断的增加,感觉到越写越复杂,这有很大一部分原因是设计的问题,但是模板间的嵌套也是问题之一,于是回过头来考虑使用fetch这个方法。在重新做出决定之前对这个方法的性能做了测试,分别对单个模板的情况下和多个模板的情况进行测试

单个子模板测试:

有三个页面test1.php,test2.php,test3.php。这三个页面都输出同样的内容。test1.php的模板没有嵌套,test2.php的模板使用了一次include,test3.php使用fetch来实现子模板的嵌套。使用apache自带的ab测试访问各个页面所需要的平均时间(单位:ms)

第一次测试时,使用ab -n 10000 对以上三个页面进行10次,每次累计10000个访问,结果如下。

ab -n 10000test1.phptest2.phptest3.phptest2/test1test3/test1
15.1785.4426.0971.0509849361.177481653
25.2535.9726.0271.1368741671.147344375
35.2236.0395.9871.1562320511.146276087
45.5335.9976.021.0838604741.08801735
55.5576.3086.031.1351448621.085117869
65.2486.0025.9981.143673781.142911585
75.2115.9336.0031.1385530611.151986183
85.3036.0316.0481.1372807841.140486517
95.2135.9236.0331.1361979671.15729906
总计47.71953.64754.2431.1242272471.136717031

第二次测试时,使用ab -n 100000 对以上三个页面进行1次,每次累计100000个访问,结果如下。

ab -n 100000test1.phptest2.phptest3.phptest2/test1test3/test1
15.7237.8748.551.3758518261.493971693

第一次测试的数据中,test1和test2的波动比较明显,test3则比较稳定,这个现象让我感到十分的奇怪。从平均数据来看,测试结果还是在预期之内的,test1的性能最好,test2比test1多耗费了12.42%的时间,test3比test1多耗费了13.67%的时间,但是test2和test3之间的差距并不大,仅仅只有1.3%左右的差别。

第二次测试的结果,三个页面的执行时间比为1:1.37:1.49,奇怪的是这次的波动更大。。。

多个子模板测试:

同样有三个页面test1.php,test2.php,test3.php。这三个页面都输出同样的内容。test1.php的模板没有嵌套,test2.php的模板使用了10次include嵌入了10个子模板,test3.php使用10次fetch嵌入了10个子模板。使用apache自带的ab测试访问各个页面所需要的平均时间(单位:ms)

因为时间的关系我只进行了一次ab -n 50000的测试,数据如下

ab -n 50000test1.phptest2.phptest3.phptest2/test1test3/test1
15.686.0546.0281.065845071.061267606

 

虽然测试的方法和工具可能不是很好,但是通过这些数据的对比,在实际的应用中到底要采用哪种方法,我想大家应该心里有底了吧。

不足和错误之处还望指出,希望大家能多讨论多交流。

TMDPHP 模板引擎使用教程
PHP中将字符串转化为整数(int) intval() printf() 性能测试
php中echo()和print()、require()和include()等易混淆函数的区别
PHP测试程序运行时间的类
PHP Web木马扫描器代码 v1.0 安全测试工具
PHP中创建空文件的代码[file_put_contents vs touch]
shopex主机报错误请求解决方案(No such file or directory)
PHP性能优化工具篇Benchmark类调试执行时间
php的chr和ord函数实现字符加减乘除运算实现代码
Pain 全世界最小最简单的PHP模板引擎 (普通版)
php中Smarty模板初体验
模板引擎正则表达式调试小技巧
从康盛产品(discuz)提取出来的模板类
PHP中的函数嵌套层数限制分析
php中将地址生成迅雷快车旋风链接的代码[测试通过]
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
PHP执行zip与rar解压缩方法实现代码
php 学习资料零碎东西
PHP类中Static方法效率测试代码
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
windows中PHP5.2.14以及apache2.2.16安装配置方法第1/2页
PHPnow安装服务[apache_pn]失败的问题的解决方法
php下正则来匹配dede模板标签的代码
利用Memcached在php下实现session机制 替换PHP的原生session支持
php checkbox 取值详细说明
php自动获取目录下的模板的代码
破解图片防盗链的代码(asp/php)测试通过
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
PHP 开发环境配置(测试开发环境)
PHP 文件缓存的性能测试
php Smarty模板生成html文档的方法
Blitz templates 最快的PHP模板引擎
PHP 替换模板变量实现步骤
PHP树的代码,可以嵌套任意层
©2014-2024 dbsqp.com