一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)

百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)

2020-09-24 17:30百度工程師 HDK PHP教程

這篇文章主要介紹了百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二),本文講解了類方法、性能對比、內(nèi)置函數(shù)和用戶函數(shù)性能對比等內(nèi)容,需要的朋友可以參考下

類方法
類方法其執(zhí)行原理和用戶函數(shù)是相同的,也是翻譯成opcodes順次調(diào)用。類的實現(xiàn),zend用一個數(shù)據(jù)結(jié)構(gòu)zend_class_entry來實現(xiàn),里面保存了類相關(guān)的一些基本信息。這個entry是在php編譯的時候就已經(jīng)處理完成。
在 zend_function的common中,有一個成員叫做scope,其指向的就是當(dāng)前方法對應(yīng)類的zend_class_entry。關(guān)于php中面向?qū)ο蟮膶崿F(xiàn),這里就不在做更詳細(xì)的介紹,今后將專門寫一篇文章來詳述php中面向?qū)ο蟮膶崿F(xiàn)原理。就函數(shù)這一塊來說,method實現(xiàn)原理和 function完全相同,理論上其性能也差不多,后面我們將做詳細(xì)的性能對比。

性能對比
函數(shù)名長度對性能的影響

》》測試方法 對名字長度為1、2、4、8、16的函數(shù)進(jìn)行比較,測試比較它們每秒可執(zhí)行次數(shù),確定函數(shù)名長度對性能的影 響

》》測試結(jié)果如下圖
百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)

》》結(jié)果分析
從圖上可以看出,函數(shù)名的長度對性能還是會有一定的影響。一個長度為1的函數(shù)和長度為16的 空函數(shù)調(diào)用 ,其性能差了1倍。分析一下源碼不難找到原因,如前面敘述所說,函數(shù)調(diào)用的時候zend會先在一個全局的funtion_table中通過函數(shù)名查詢相關(guān)信息,function_table是一個哈希表。必然的,名字越長查詢所需要的時間就越多。 因此,在實際編寫程序的時候,對多次調(diào)用的函數(shù),名字建議不要太長。

雖然函數(shù)名長度對性能有一定影響,但具體有多大呢?這個問題應(yīng)該還是需要結(jié)合實際情況來考慮,如果一個函數(shù)本身比較復(fù)雜的話,那么對整體的性能影響并不大。一個建議是對于那些會調(diào)用很多次,本身功能又比較簡單的函數(shù),可以適當(dāng)取一些言簡意賅的名字。
函數(shù)個數(shù)對性能的影響

》》測試方法
在以下三種環(huán)境下進(jìn)行函數(shù)調(diào)用測試,分析結(jié)果:1.程序僅包含1個函數(shù) 2.程序包含100個函數(shù) 3.程序包含1000個函數(shù)。測試這三種情況下每秒所能調(diào)用的函數(shù)次數(shù)

》》測試結(jié)果如下圖
百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)

》》結(jié)果分析
從測試結(jié)果可以看出,這三種情況下性能幾乎相同,函數(shù)個數(shù)增加時性能下降微乎其微,可以忽略。從實現(xiàn)原理分析,幾種實現(xiàn)下唯一的區(qū)別在于函數(shù)獲取的部分。如前文所述,所有的函數(shù)都放在一個hash表中,在不同個數(shù)下查找效率都應(yīng)該還是接近于O(1),所以性能差距不大。
不同類型函數(shù)調(diào)用消耗
》》測試方法
選取用戶函數(shù)、類方法、靜態(tài)方法、內(nèi)置函數(shù)各一種,函數(shù)本身不做任何事情,直接返回,主要測試空函數(shù)調(diào)用的消耗。測試結(jié)果為每秒可執(zhí)行次數(shù) 測試中為去除其他影響,所有函數(shù)名字長度相同
》》測試結(jié)果如下圖

》》結(jié)果分析
通過測試結(jié)果可以看到,對于用戶自己編寫的php函數(shù),不管是哪種類型,其效率是差不多的,均在280w/s左右。如我們預(yù)期,即使是空調(diào),內(nèi)置函數(shù)其效率也要高很多,達(dá)到780w/s,是前者是3倍。可見,內(nèi)置函數(shù)調(diào)用的開銷還是遠(yuǎn)低于用戶函數(shù)。從前面原理分析可知主要差距在于用戶函數(shù)調(diào)用時初始化符號表、接收參數(shù)等操作。

內(nèi)置函數(shù)和用戶函數(shù)性能對比

》》測試方法
內(nèi)置函數(shù)和用戶函數(shù)的性能對比,這里我們選取幾個常用的函數(shù),然后用php實現(xiàn)相同功能的函數(shù)進(jìn)行一下性能對比。測試中,我們選取字符串、數(shù)學(xué)、數(shù)組中各一個典型進(jìn)行對比,這幾個函數(shù)分別是字符串截取(substr)、10進(jìn)制轉(zhuǎn)2進(jìn)制(decbin)、求最小值(min)和返回數(shù)組中的所以 key(array_keys)。
》》測試結(jié)果如下圖
百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)
》》結(jié)果分析
從測試結(jié)果可以看出,如我們預(yù)期,內(nèi)置函數(shù)在總體性能上遠(yuǎn)高于普通用戶函數(shù)。尤其對于涉及到字符串類操作的函數(shù),差距達(dá)到了1個數(shù)量級。因此,函數(shù)使用的一個原則就是如果某功能有相應(yīng)的內(nèi)置函數(shù),盡量使用它而不是自己編寫php函數(shù)。對于一些涉及到大量字符串操作的功能,為提高性能,可以考慮用擴展來實現(xiàn)。比如常見的富文本過濾等。
和C函數(shù)性能對比

》》測試方法
我們選取字符串操作和算術(shù)運算各3種函數(shù)進(jìn)行比對,php用擴展實現(xiàn)。三種函數(shù)是簡單的一次算法運算、字符串比較和多次的算法運算。除了本身的兩類函數(shù)外,還會測試將函數(shù)空調(diào)開銷去掉后的性能,一方面比對一下兩種函數(shù)(c和php內(nèi)置)本身的性能差異,另外就是側(cè)面印證空調(diào)函數(shù)的消耗 測試點為執(zhí)行10w次操作的時間消耗
》》測試結(jié)果如下圖
百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)

》》結(jié)果分析
內(nèi)置函數(shù)和C函數(shù)的開銷在去掉php函數(shù)空調(diào)用的影響后差距較小,隨著函數(shù)功能越來越復(fù)雜,雙方性能趨近于相同。這個從之前的函數(shù)實現(xiàn)分析中也容易得到論證,畢竟內(nèi)置函數(shù)就是C實現(xiàn)的。函數(shù)功能越復(fù)雜,c和php的性能差距越小 相對c來說,php函數(shù)調(diào)用的開銷大很多,對于簡單函數(shù)來說性能還是有一定影響。因此php中函數(shù)不宜嵌套封裝太深。
偽函數(shù)及其性能

在php中,有這樣一些函數(shù),它們在使用上是標(biāo)準(zhǔn)的函數(shù)用法,但底層實現(xiàn)卻和真正函數(shù)調(diào)用完全不同,這些函數(shù)不屬于前文提到的三種function中的任何一類,其實質(zhì)是一條單獨的opcode,這里估且叫做偽函數(shù)或者指令函數(shù)。

如上所說,偽函數(shù)使用起來和標(biāo)準(zhǔn)的函數(shù)并無二致,看起來具有相同的特征。但是他們最終執(zhí)行的時候是被zend反映成了一條對應(yīng)的指令(opcode)來調(diào)用,因此其實現(xiàn)更接近于if、 for、算術(shù)運算等操作。
》》php中的偽函數(shù)
isset
empty
unset
eval
通過上面的介紹可以看出,偽函數(shù)由于被直接翻譯成指令來執(zhí)行,和普通函數(shù)相比少了一次函數(shù)調(diào)用所帶來的開銷,因此性能會更好一些。我們通過如下測試來做一個對比。 Array_key_exists和isset兩者都可以判斷數(shù)組中某個key是否存在,看一下他們的性能
百度工程師講PHP函數(shù)的實現(xiàn)原理及性能分析(二)
從圖上可以看出,和 array_key_exists相比,isset性能要高出很多,基本是前者的4倍左右,而即使是和空函數(shù)調(diào)用相比,其性能也要高出1倍左右。由此也側(cè)面印證再次說明了php函數(shù)調(diào)用的開銷還是比較大的。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 超级乱淫变态伦短篇小说全集 | 亚洲 欧美 在线观看 | 99热这里只有精品免费 | 亚洲AV无码乱码国产麻豆穿越 | 国产精品夜色视频一级区 | 国产特级毛片aaaaaa | 情乱奶水欲| 久久一本综合 | 欧美日韩免费一区二区在线观看 | 日韩高清在线观看 | 亚洲国产精品成人综合久久久 | 国产精品吹潮香蕉在线观看 | 痴mu动漫成年动漫在线观看 | 91混血大战上海双胞胎 | 美女操穴视频 | 男人天堂网站在线 | 色综合久久夜色精品国产 | 色天天综合网色鬼综合 | 性做久久久久久久久老女人 | 男人资源站 | 亚洲天堂中文字幕 | 精品免费视在线视频观看 | 国产伦精品一区二区三区女 | 海角社区在线视频 | 亚洲色图欧美图片 | 国产精品久久国产精品99 gif | 乖女的嫩奶水h文孕妇 | 国语自产拍在线观看7m | 91麻豆精品国产 | 国产三级精品久久三级国专区 | 久久亚洲精品专区蓝色区 | 97精品国产高清在线看入口 | 大伊香蕉精品视频一区 | 99综合在线 | 狠狠狠地啪香蕉 | 精品久久伦理中文字幕 | 成 人 免费 小说在线观看 | 高清一区 | 草莓视频丝瓜 | 美女啪啪国产 | 桃色公寓 |