smarty模板嵌套之include與fetch性能測(cè)試
方法一、使用在父模板中使用{include file="child.tpl"}直接將子模板包含進(jìn)來(lái)
優(yōu)點(diǎn):
1、有利于模塊的劃分和模板的重用。
2、嵌套層次不多的時(shí)候,模板的結(jié)構(gòu)清晰,一眼過(guò)去就知道這個(gè)模板的內(nèi)容和結(jié)構(gòu)。
3、只需要一個(gè)smarty實(shí)例就能做完所有的事情,減少系統(tǒng)資源的占用。
不足:
1、子模板中的變量可能與父模板的變量發(fā)生沖突
2、多重嵌套的時(shí)候,變量名沖突的幾率增大,為所有的變量賦值的難度也加大。
3、子模板的可操控性差,例如不能通過(guò)設(shè)置$cache_id, $compile_id,來(lái)得到多個(gè)結(jié)果。
4、擴(kuò)展性差。如果需要添加新的模板的時(shí)候需要修改模板,同時(shí)還需要修改程序。
方法二、通過(guò)$smarty->fetch()將子模板的數(shù)據(jù)當(dāng)成變量assign到父模板中
優(yōu)點(diǎn):
1、同樣有利于模塊的劃分,模板的重用
2、模板的結(jié)構(gòu)同樣清晰
3、子模板作為單獨(dú)的對(duì)象,可操控性強(qiáng)
4、擴(kuò)展性較好
5、每個(gè)子模板都是單獨(dú)的對(duì)象,不會(huì)出現(xiàn)變量名沖突的問(wèn)題
不足:
1、如果子模板多的時(shí)候,需使用多個(gè)smarty實(shí)例來(lái)實(shí)現(xiàn),PHP代碼顯得臃腫
2、占用較多的系統(tǒng)資源
3、......
在那個(gè)的時(shí)候,出于對(duì)性能的要求,以及在沒(méi)有測(cè)試的情況下,想當(dāng)然的認(rèn)為include的性能一定就比f(wàn)etch的性能要高,所有本人使用include這個(gè)方法,結(jié)果隨著系統(tǒng)功能的不斷的增加,感覺(jué)到越寫(xiě)越復(fù)雜,這有很大一部分原因是設(shè)計(jì)的問(wèn)題,但是模板間的嵌套也是問(wèn)題之一,于是回過(guò)頭來(lái)考慮使用fetch這個(gè)方法。在重新做出決定之前對(duì)這個(gè)方法的性能做了測(cè)試,分別對(duì)單個(gè)模板的情況下和多個(gè)模板的情況進(jìn)行測(cè)試
單個(gè)子模板測(cè)試:
有三個(gè)頁(yè)面test1.php,test2.php,test3.php。這三個(gè)頁(yè)面都輸出同樣的內(nèi)容。test1.php的模板沒(méi)有嵌套,test2.php的模板使用了一次include,test3.php使用fetch來(lái)實(shí)現(xiàn)子模板的嵌套。使用apache自帶的ab測(cè)試訪問(wèn)各個(gè)頁(yè)面所需要的平均時(shí)間(單位:ms)
第一次測(cè)試時(shí),使用ab -n 10000 對(duì)以上三個(gè)頁(yè)面進(jìn)行10次,每次累計(jì)10000個(gè)訪問(wèn),結(jié)果如下。
| 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 |
| 總計(jì) | 47.719 | 53.647 | 54.243 | 1.124227247 | 1.136717031 |
第二次測(cè)試時(shí),使用ab -n 100000 對(duì)以上三個(gè)頁(yè)面進(jìn)行1次,每次累計(jì)100000個(gè)訪問(wèn),結(jié)果如下。
| ab -n 100000 | test1.php | test2.php | test3.php | test2/test1 | test3/test1 |
| 1 | 5.723 | 7.874 | 8.55 | 1.375851826 | 1.493971693 |
第一次測(cè)試的數(shù)據(jù)中,test1和test2的波動(dòng)比較明顯,test3則比較穩(wěn)定,這個(gè)現(xiàn)象讓我感到十分的奇怪。從平均數(shù)據(jù)來(lái)看,測(cè)試結(jié)果還是在預(yù)期之內(nèi)的,test1的性能最好,test2比test1多耗費(fèi)了12.42%的時(shí)間,test3比test1多耗費(fèi)了13.67%的時(shí)間,但是test2和test3之間的差距并不大,僅僅只有1.3%左右的差別。
第二次測(cè)試的結(jié)果,三個(gè)頁(yè)面的執(zhí)行時(shí)間比為1:1.37:1.49,奇怪的是這次的波動(dòng)更大。。。
多個(gè)子模板測(cè)試:
同樣有三個(gè)頁(yè)面test1.php,test2.php,test3.php。這三個(gè)頁(yè)面都輸出同樣的內(nèi)容。test1.php的模板沒(méi)有嵌套,test2.php的模板使用了10次include嵌入了10個(gè)子模板,test3.php使用10次fetch嵌入了10個(gè)子模板。使用apache自帶的ab測(cè)試訪問(wèn)各個(gè)頁(yè)面所需要的平均時(shí)間(單位:ms)
因?yàn)闀r(shí)間的關(guān)系我只進(jìn)行了一次ab -n 50000的測(cè)試,數(shù)據(jù)如下
| ab -n 50000 | test1.php | test2.php | test3.php | test2/test1 | test3/test1 |
| 1 | 5.68 | 6.054 | 6.028 | 1.06584507 | 1.061267606 |
雖然測(cè)試的方法和工具可能不是很好,但是通過(guò)這些數(shù)據(jù)的對(duì)比,在實(shí)際的應(yīng)用中到底要采用哪種方法,我想大家應(yīng)該心里有底了吧。
不足和錯(cuò)誤之處還望指出,希望大家能多討論多交流。
相關(guān)文章
PHP備份數(shù)據(jù)庫(kù)生成SQL文件并下載的函數(shù)代碼
這是一個(gè)將指定數(shù)據(jù)庫(kù)里的所有表備份為一個(gè)SQL文件,可下載。這個(gè)源碼來(lái)自dedecms程序,功能挺多,也很實(shí)用,但是代碼的質(zhì)量還有待提高2012-02-02
PHP隨機(jī)字符串生成代碼(包括大小寫(xiě)字母)
PHP生成隨機(jī)字符串包括大小寫(xiě)字母,這里介紹兩種方法,需要的朋友可以參考下2013-06-06
php檢查日期函數(shù)checkdate用法實(shí)例
這篇文章主要介紹了php檢查日期函數(shù)checkdate用法,實(shí)例分析了php中checkdate函數(shù)的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之二 對(duì)象之間搬移特性
承接上文PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之 重新組織你的函數(shù) ,繼續(xù)說(shuō)重構(gòu)方面的內(nèi)容2012-04-04
PHP實(shí)現(xiàn)根據(jù)設(shè)備類(lèi)型自動(dòng)跳轉(zhuǎn)相應(yīng)頁(yè)面的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)根據(jù)設(shè)備類(lèi)型自動(dòng)跳轉(zhuǎn)相應(yīng)頁(yè)面的方法,是非常實(shí)用的功能,需要的朋友可以參考下2014-07-07
PHP郵件發(fā)送類(lèi)PHPMailer用法實(shí)例詳解
這篇文章主要介紹了PHP郵件發(fā)送類(lèi)PHPMailer用法,詳細(xì)的講述了安裝及配置的方法與功能實(shí)現(xiàn)代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
php實(shí)現(xiàn)的Curl封裝類(lèi)Curl.class.php用法實(shí)例分析
這篇文章主要介紹了php實(shí)現(xiàn)的Curl封裝類(lèi)Curl.class.php用法,以完整實(shí)例形式較為詳細(xì)的分析了Curl封裝類(lèi)的定義及相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
php時(shí)區(qū)轉(zhuǎn)換轉(zhuǎn)換函數(shù)
godaddy主機(jī)在國(guó)外。把站點(diǎn)建站國(guó)外,顯示時(shí)間時(shí)可能需要時(shí)區(qū)轉(zhuǎn)換,下面是個(gè)方便的工具函數(shù),用于時(shí)區(qū)轉(zhuǎn)換2014-01-01
PHP最常用的ini函數(shù)分析 針對(duì)PHP.ini配置文件
php的配置函數(shù)就是幾個(gè)ini_*的函數(shù),主要是針對(duì)配置文件的操作,其實(shí)就四個(gè)函數(shù):ini_get、ini_set、ini_get_all、ini_restore。個(gè)人感覺(jué)最有用的就是ini_set和ini_get。2010-04-04

