Home  >  Article  >  Backend Development  >  smarty template nesting include and fetch performance testing_PHP tutorial

smarty template nesting include and fetch performance testing_PHP tutorial

WBOY
WBOYOriginal
2016-07-21 15:33:17776browse

方法一、使用在父模板中使用{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
Total 47.719 53.647 54.243 1.124227247 1.136717031

In the second test, use ab -n 100000 to conduct the above three pages once, with a total of 100000 visits each time. The results are as follows.

ab -n 100000 test1.php test2.php test3.php test2/test1 test3/test1
1 5.723 7.874 8.55 1.375851826 1.493971693

ab -n 100000

test1.php test2.php

test3.php

ab -n 50000 test1.php test2.php test3.php test2/test1 test3/test1
1 5.68 6.054 6.028 1.06584507 1.061267606
test2/test1

test3/test1

1

5.723 7.874 8.55 1.375851826 1.493971693
In the first test data, test1 and test2 fluctuated more obviously, while test3 was relatively stable. This phenomenon made me feel very strange. Judging from the average data, the test results are within expectations. Test1 has the best performance. Test2 takes 12.42% more time than test1. Test3 takes 13.67% more time than test1. However, the difference between test2 and test3 is The difference is not big, only about 1.3%. The results of the second test showed that the execution time ratio of the three pages was 1:1.37:1.49. Strangely, the fluctuation was larger this time. . . Multiple sub-template tests: There are also three pages test1.php, test2.php, test3.php. All three pages output the same content. The template of test1.php is not nested, the template of test2.php uses include 10 times to embed 10 sub-templates, and test3.php uses fetch 10 times to embed 10 sub-templates. Use the ab test that comes with apache to test the average time required to access each page (unit: ms) Due to time constraints, I only conducted one ab -n 50000 test. The data is as follows
ab -n 50000 test1.php test2.php test3.php test2/test1 test3/test1 1 5.68 6.054 6.028 1.06584507 1.061267606 Although the testing methods and tools may not be very good, through the comparison of these data, I think everyone should have a good idea of ​​which method to use in actual applications. I would like to point out the deficiencies and errors, and hope that everyone can discuss and communicate more. http://www.bkjia.com/PHPjc/322601.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/322601.htmlTechArticleMethod 1. Use {include file="child.tpl"} in the parent template to directly include the child template Advantages: 1. Conducive to module division and template reuse. 2. When there are not many nesting levels...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn