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


Posted in PHP onDecember 05, 2010

方法一、使用在父模板中使用{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 10000 test1.php test2.php test3.php test2/test1 test3/test1
1 5.178 5.442 6.097 1.050984936 1.177481653
2 5.253 5.972 6.027 1.136874167 1.147344375
3 5.223 6.039 5.987 1.156232051 1.146276087
4 5.533 5.997 6.02 1.083860474 1.08801735
5 5.557 6.308 6.03 1.135144862 1.085117869
6 5.248 6.002 5.998 1.14367378 1.142911585
7 5.211 5.933 6.003 1.138553061 1.151986183
8 5.303 6.031 6.048 1.137280784 1.140486517
9 5.213 5.923 6.033 1.136197967 1.15729906
总计 47.719 53.647 54.243 1.124227247 1.136717031

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

ab -n 100000 test1.php test2.php test3.php test2/test1 test3/test1
1 5.723 7.874 8.55 1.375851826 1.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 50000 test1.php test2.php test3.php test2/test1 test3/test1
1 5.68 6.054 6.028 1.06584507 1.061267606

 

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

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

PHP 相关文章推荐
一些PHP写的小东西
Dec 06 PHP
PHP 危险函数解释 分析
Apr 22 PHP
PHP开发的一些注意点总结
Oct 12 PHP
C/S和B/S两种架构区别与优缺点分析
Oct 23 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PHP+MySQL实现消息队列的方法分析
May 09 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 PHP
php 学习资料零碎东西
Dec 04 #PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 #PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 #PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 #PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 #PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 #PHP
PHP分页函数代码(简单实用型)
Dec 02 #PHP
You might like
php GUID生成函数和类
2014/03/10 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
Django中处理出错页面的方法
2015/07/15 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python接口开发实现步骤详解
2020/04/26 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
Python爬虫开发与项目实战
2020/12/16 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
大专生自荐书范文
2014/06/22 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
怎么写工作检讨书
2014/11/16 职场文书
诚实守信主题班会
2015/08/13 职场文书
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android
Redis基本数据类型Set常用操作命令
2022/06/01 Redis