smarty模板嵌套之include与fetch性能测试_PHP
方法一、使用在父模板中使用{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 |
虽然测试的方法和工具可能不是很好,但是通过这些数据的对比,在实际的应用中到底要采用哪种方法,我想大家应该心里有底了吧。
不足和错误之处还望指出,希望大家能多讨论多交流。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

最近,在使用Vue應用程式開發過程中,我遇到了一個常見的問題:「TypeError:Failedtofetch」錯誤提示。這個問題出現在使用axios進行HTTP請求時,後端伺服器沒有正確回應請求時發生。這種錯誤提示通常表示請求無法到達伺服器,可能是由於網路原因或伺服器未回應造成的。出現這個錯誤提示後,我們該怎麼辦呢?以下是一些解決方法:檢查網路連接由於

當我們在使用 PHP 編寫網頁時,有時我們需要在目前 PHP 檔案中包含其他 PHP 檔案中的程式碼。這時,就可以使用 include 或 include_once 函數來實作檔案包含。那麼,include 和 include_once 到底有什麼差別呢?

現如今,網站的開發離不了一個重要的組成部分——模板引擎。模板引擎是指一種將頁面模板和資料結合起來產生具有特定格式的html程式碼的工具。在各種網站開發框架中,模板引擎是一個必不可少的元件,因為模板引擎可以大量減少程式碼的重複性和提高頁面的動態性。其中一個最常見且流行的模板引擎是Smarty。 Smarty是基於PHP語言開發的DSL(DomainSpecif

在現代web開發中,前後端分離已經成為了一個非常流行的趨勢,它能夠讓開發者更好地組織專案並且提高了專案開發的效率。 PHP和Smarty是兩個非常常用的技術,它們可以用來實現前後端分離的開發方式。本文將會介紹如何使用PHP和Smarty來實現前後端分離開發。什麼是前後端分離開發在傳統的web開發中,前端主要負責頁面的呈現以及與後端互動的邏輯。後端則主要負責業

身為PHP開發者,使用模板引擎是理所當然的選擇。 Smarty是一種流行的模板引擎,它提供了一種將HTML/CSS/JavaScript與PHP程式碼分開的方式,使開發人員能夠更好地組織和管理專案。在本文中,我們將學習PHP開發過程中如何使用Smarty模板引擎。一、安裝Smarty在之前,我們必須安裝Smarty。在本文中,我們將使用Composer安裝

PHP是一種強大的伺服器端腳本語言,可用於開發網頁應用程式。在Web開發的早期階段,程式設計師使用了許多HTML和JavaScript程式碼來開發Web應用程式。但是,這種方法很難維護和管理,因為HTML和JavaScript程式碼可能會變得非常複雜。為了解決這個問題,Smarty模板引擎被創建出來。 Smarty是一種基於PHP開發的模板引擎,用於管理和生成W

隨著互聯網的快速發展和更新換代,PHP作為一種廣泛應用於Web應用開發的程式語言,一步步成為了業界非常受歡迎的程式語言。然而,在PHP開發過程中,傳統的程式碼實作方式往往會導致程式碼可讀性和可維護性的下降。這時,一個高效率的模板引擎便成為了解決方案之一。在眾多模板引擎中,Smarty以其強大的功能和良好的性能表現,成為了PHP開發者中的一個受歡迎的選擇。本文將詳

在Vue專案開發中,資料請求與處理是非常重要的環節。一個好的資料請求與處理策略可以大幅提升應用程式的效能和使用者體驗。本文將分享一些在Vue專案開發中的資料請求與處理的經驗。合理使用Axios庫Axios是常用的基於Promise的HTTP庫,用於發送XHR請求。在Vue專案中,可以使用Axios來傳送資料請求。使用Axios時,需要注意以下幾點:合理配置A
