smarty模板嵌套之include与fetch性能测试
2010-12-05 00:00
399 查看
方法一、使用在父模板中使用{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
虽然测试的方法和工具可能不是很好,但是通过这些数据的对比,在实际的应用中到底要采用哪种方法,我想大家应该心里有底了吧。
不足和错误之处还望指出,希望大家能多讨论多交流。
优点:
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
虽然测试的方法和工具可能不是很好,但是通过这些数据的对比,在实际的应用中到底要采用哪种方法,我想大家应该心里有底了吧。
不足和错误之处还望指出,希望大家能多讨论多交流。
相关文章推荐
- smarty模板嵌套之include与fetch性能测试
- [C++] 测试硬件popcnt(位1计数)指令与各种软件算法,利用模板实现静态多态优化性能
- 《Web性能测试实战》性能测试报告模板
- 《Web性能测试实战》性能测试报告模板
- 《Web性能测试实战》性能测试计划模板
- 【转】性能测试报告模板 V1.0
- SQL Server 2012使用OFFSET/FETCH NEXT分页及性能测试
- C#性能测试模板和洗牌的随机排序算法
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 《Web性能测试实战》性能测试计划模板
- 全面测试嵌套多层For循环的性能和优化方案
- 《Web性能测试实战》性能测试用例模板
- 《Web性能测试实战》性能测试报告模板
- 《Web性能测试实战》性能测试报告模板
- 《Web性能测试实战》性能测试计划模板
- 《Web性能测试实战》性能测试计划模板
- 性能测试计划模板
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 性能测试案例模板 性能测试用例模板 测试案例 性能用例 模板 容我想想之性能测试系列培训
- 《Web性能测试实战》性能测试用例模板