中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      百度工程師講PHP函數的實現原理及性能分析

      時間:2024-09-07 20:44:25 PHP 我要投稿
      • 相關推薦

      百度工程師講PHP函數的實現原理及性能分析

        類方法

        類方法其執行原理和用戶函數是相同的,也是翻譯成opcodes順次調用。類的實現,zend用一個數據結構zend_class_entry來實現,里面保存了類相關的一些基本信息。這個entry是在php編譯的時候就已經處理完成。

        在 zend_function的common中,有一個成員叫做scope,其指向的就是當前方法對應類的zend_class_entry。關于php中面向對象的實現,這里就不在做更詳細的介紹,今后將專門寫一篇文章來詳述php中面向對象的實現原理。就函數這一塊來說,method實現原理和 function完全相同,理論上其性能也差不多,后面我們將做詳細的性能對比。

        性能對比

        函數名長度對性能的影響

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

        》》測試結果如下圖

        》》結果分析

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

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

        函數個數對性能的影響

        》》測試方法

        在以下三種環境下進行函數調用測試,分析結果:1.程序僅包含1個函數 2.程序包含100個函數 3.程序包含1000個函數。測試這三種情況下每秒所能調用的函數次數

        》》測試結果如下圖

        》結果分析

        從測試結果可以看出,這三種情況下性能幾乎相同,函數個數增加時性能下降微乎其微,可以忽略。從實現原理分析,幾種實現下唯一的區別在于函數獲取的部分。如前文所述,所有的函數都放在一個hash表中,在不同個數下查找效率都應該還是接近于O(1),所以性能差距不大。

        不同類型函數調用消耗

        》》測試方法

        選取用戶函數、類方法、靜態方法、內置函數各一種,函數本身不做任何事情,直接返回,主要測試空函數調用的消耗。測試結果為每秒可執行次數 測試中為去除其他影響,所有函數名字長度相同

        》》測試結果如下圖

        》》結果分析

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

        內置函數和用戶函數性能對比

        》》測試方法

        內置函數和用戶函數的性能對比,這里我們選取幾個常用的函數,然后用php實現相同功能的函數進行一下性能對比。測試中,我們選取字符串、數學、數組中各一個典型進行對比,這幾個函數分別是字符串截取(substr)、10進制轉2進制(decbin)、求最小值(min)和返回數組中的所以 key(array_keys)。

        》》測試結果如下圖

        》》結果分析

        從測試結果可以看出,如我們預期,內置函數在總體性能上遠高于普通用戶函數。尤其對于涉及到字符串類操作的函數,差距達到了1個數量級。因此,函數使用的一個原則就是如果某功能有相應的內置函數,盡量使用它而不是自己編寫php函數。對于一些涉及到大量字符串操作的功能,為提高性能,可以考慮用擴展來實現。比如常見的富文本過濾等。

        和C函數性能對比

        》》測試方法

        我們選取字符串操作和算術運算各3種函數進行比對,php用擴展實現。三種函數是簡單的一次算法運算、字符串比較和多次的算法運算。除了本身的兩類函數外,還會測試將函數空調開銷去掉后的性能,一方面比對一下兩種函數(c和php內置)本身的性能差異,另外就是側面印證空調函數的消耗 測試點為執行10w次操作的時間消耗

        》》測試結果如下圖

        》》結果分析

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

        偽函數及其性能

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

        如上所說,偽函數使用起來和標準的函數并無二致,看起來具有相同的特征。但是他們最終執行的時候是被zend反映成了一條對應的指令(opcode)來調用,因此其實現更接近于if、 for、算術運算等操作。

        》》php中的偽函數

        isset

        empty

        unset

        eval

        通過上面的介紹可以看出,偽函數由于被直接翻譯成指令來執行,和普通函數相比少了一次函數調用所帶來的開銷,因此性能會更好一些。我們通過如下測試來做一個對比。 Array_key_exists和isset兩者都可以判斷數組中某個key是否存在,看一下他們的性能

        從圖上可以看出,和 array_key_exists相比,isset性能要高出很多,基本是前者的4倍左右,而即使是和空函數調用相比,其性能也要高出1倍左右。由此也側面印證再次說明了php函數調用的開銷還是比較大的。

      【百度工程師講PHP函數的實現原理及性能分析】相關文章:

      探討PHP函數的實現原理及性能07-07

      PHP中的排序函數區別分析08-23

      關于php堆排序實現原理與應用方法10-09

      php中session的實現原理以及大網站應用應注意的問題分析07-26

      PHP的壓縮函數06-21

      淺析php函數的實例06-08

      PHP路由技術的原理與實踐10-15

      php外部執行命令函數10-27

      簡單介紹php構造函數用法08-31

      PHP中函數的使用說明09-01

      主站蜘蛛池模板: 国产成人精品一区二免费网站 | 视频精品熟女一区二区三区 | 亚洲日产AV中文字幕无码偷拍| 黑丝美女被内射在线观看| 99久久免费精品色老| 封开县| 久久dvd| 亚洲激情人体艺术视频| 国产精品自拍视频免费| 日本黄色一区二区三区视频| 免青青草免费观看视频在线| 亚洲无码啊啊啊免费体验| 青青草视频华人绿色在线| 精品中文字幕一二三四区人妻| 日本最新在线一区二区| 久久精品天堂一区二区三区| 商洛市| 亚洲av岛国片在线观看| 国产成人夜色在线视频观看| 91精品日本久久久久久牛牛| av国产剧情一区二区三区| 久久中文字幕av第二页| 偷拍区亚洲区一区二区| 偷拍激情视频一区二区| 高潮社区51视频在线观看| 亚洲视频在线播放免费视频| 亚洲福利av一区二区| 国产区二区三区在线观看| 久久99精品久久久久九色 | 国产三级三级三级看三级日本| 亚洲欧美香港在线观看三级片| 国产人成在线免费视频| 偷拍亚洲一区二区三区| 国产精品av在线一区二区三区| 亚洲黄色一级片在线观看| 国产女主播福利一区在线观看| 亚洲精品尤物av在线网站| 好爽要高潮了在线观看| 亚洲一区日本一区二区| 亚洲一区二区三区熟女少妇| 精品一区二区三区乱码中文|