源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
楼主: ttx9n

[PHP编程] smarty模板嵌套之include与fetch性能测试

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2010-12-5 13:34:58 | 显示全部楼层 |阅读模式
使用模板时难免要碰到模板嵌套的时候,大家都知道有两种方法可以实现,以下是个人早期的一些使用感受。

方法一、使用在父模板中使用{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万

回帖

59

积分

注册会员

Rank: 2

积分
59
发表于 2022-9-13 22:18:19 | 显示全部楼层
还可以不错
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

376

积分

中级会员

Rank: 3Rank: 3

积分
376
发表于 2022-11-15 22:13:42 | 显示全部楼层
看看看看
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

172

积分

注册会员

Rank: 2

积分
172
发表于 2023-1-28 11:24:09 | 显示全部楼层
需要很久了终于找到了
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-6-23 21:08:02 | 显示全部楼层
哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

4

主题

2万

回帖

262

积分

中级会员

Rank: 3Rank: 3

积分
262
发表于 2023-8-2 20:41:12 | 显示全部楼层
看到这帖子真是高兴!
回复 支持 反对

使用道具 举报

29

主题

2万

回帖

194

积分

注册会员

Rank: 2

积分
194
发表于 2023-9-20 00:56:44 | 显示全部楼层
下载来瞧瞧
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-10-15 09:23:51 | 显示全部楼层
hi哦回复iOS就看见
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-10-18 11:35:37 | 显示全部楼层
来看看怎么样
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-10-22 18:14:40 | 显示全部楼层
天天源码社区www.tiantianym.com
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2025-1-22 18:54 , Processed in 0.191181 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表