PHP函數(shù)的實(shí)現(xiàn)原理是什么?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括泰寧網(wǎng)站建設(shè)、泰寧網(wǎng)站制作、泰寧網(wǎng)頁(yè)制作以及泰寧網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,泰寧網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到泰寧省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!類(lèi)方法
類(lèi)方法其執(zhí)行原理和用戶函數(shù)是相同的,也是翻譯成opcodes順次調(diào)用。類(lèi)的實(shí)現(xiàn),zend用一個(gè)數(shù)據(jù)結(jié)構(gòu)zend_class_entry來(lái)實(shí)現(xiàn),里面保存了類(lèi)相關(guān)的一些基本信息。這個(gè)entry是在php編譯的時(shí)候就已經(jīng)處理完成。
在 zend_function的common中,有一個(gè)成員叫做scope,其指向的就是當(dāng)前方法對(duì)應(yīng)類(lèi)的zend_class_entry。關(guān)于php中面向?qū)ο蟮膶?shí)現(xiàn),這里就不在做更詳細(xì)的介紹,今后將專(zhuān)門(mén)寫(xiě)一篇文章來(lái)詳述php中面向?qū)ο蟮膶?shí)現(xiàn)原理。就函數(shù)這一塊來(lái)說(shuō),method實(shí)現(xiàn)原理和 function完全相同,理論上其性能也差不多,后面我們將做詳細(xì)的性能對(duì)比。
性能對(duì)比
函數(shù)名長(zhǎng)度對(duì)性能的影響
》》測(cè)試方法 對(duì)名字長(zhǎng)度為1、2、4、8、16的函數(shù)進(jìn)行比較,測(cè)試比較它們每秒可執(zhí)行次數(shù),確定函數(shù)名長(zhǎng)度對(duì)性能的影 響
》》測(cè)試結(jié)果如下圖
》》結(jié)果分析
從圖上可以看出,函數(shù)名的長(zhǎng)度對(duì)性能還是會(huì)有一定的影響。一個(gè)長(zhǎng)度為1的函數(shù)和長(zhǎng)度為16的 空函數(shù)調(diào)用 ,其性能差了1倍。分析一下源碼不難找到原因,如前面敘述所說(shuō),函數(shù)調(diào)用的時(shí)候zend會(huì)先在一個(gè)全局的funtion_table中通過(guò)函數(shù)名查詢(xún)相關(guān)信息,function_table是一個(gè)哈希表。必然的,名字越長(zhǎng)查詢(xún)所需要的時(shí)間就越多。 因此,在實(shí)際編寫(xiě)程序的時(shí)候,對(duì)多次調(diào)用的函數(shù),名字建議不要太長(zhǎng)。
雖然函數(shù)名長(zhǎng)度對(duì)性能有一定影響,但具體有多大呢?這個(gè)問(wèn)題應(yīng)該還是需要結(jié)合實(shí)際情況來(lái)考慮,如果一個(gè)函數(shù)本身比較復(fù)雜的話,那么對(duì)整體的性能影響并不大。一個(gè)建議是對(duì)于那些會(huì)調(diào)用很多次,本身功能又比較簡(jiǎn)單的函數(shù),可以適當(dāng)取一些言簡(jiǎn)意賅的名字。
函數(shù)個(gè)數(shù)對(duì)性能的影響
》》測(cè)試方法
在以下三種環(huán)境下進(jìn)行函數(shù)調(diào)用測(cè)試,分析結(jié)果:1.程序僅包含1個(gè)函數(shù) 2.程序包含100個(gè)函數(shù) 3.程序包含1000個(gè)函數(shù)。測(cè)試這三種情況下每秒所能調(diào)用的函數(shù)次數(shù)
》》測(cè)試結(jié)果如下圖
》》結(jié)果分析
從測(cè)試結(jié)果可以看出,這三種情況下性能幾乎相同,函數(shù)個(gè)數(shù)增加時(shí)性能下降微乎其微,可以忽略。從實(shí)現(xiàn)原理分析,幾種實(shí)現(xiàn)下的區(qū)別在于函數(shù)獲取的部分。如前文所述,所有的函數(shù)都放在一個(gè)hash表中,在不同個(gè)數(shù)下查找效率都應(yīng)該還是接近于O(1),所以性能差距不大。
不同類(lèi)型函數(shù)調(diào)用消耗
》》測(cè)試方法
選取用戶函數(shù)、類(lèi)方法、靜態(tài)方法、內(nèi)置函數(shù)各一種,函數(shù)本身不做任何事情,直接返回,主要測(cè)試空函數(shù)調(diào)用的消耗。測(cè)試結(jié)果為每秒可執(zhí)行次數(shù) 測(cè)試中為去除其他影響,所有函數(shù)名字長(zhǎng)度相同
》》測(cè)試結(jié)果如下圖
》》結(jié)果分析
通過(guò)測(cè)試結(jié)果可以看到,對(duì)于用戶自己編寫(xiě)的php函數(shù),不管是哪種類(lèi)型,其效率是差不多的,均在280w/s左右。如我們預(yù)期,即使是空調(diào),內(nèi)置函數(shù)其效率也要高很多,達(dá)到780w/s,是前者是3倍??梢?jiàn),內(nèi)置函數(shù)調(diào)用的開(kāi)銷(xiāo)還是遠(yuǎn)低于用戶函數(shù)。從前面原理分析可知主要差距在于用戶函數(shù)調(diào)用時(shí)初始化符號(hào)表、接收參數(shù)等操作。
內(nèi)置函數(shù)和用戶函數(shù)性能對(duì)比
》》測(cè)試方法
內(nèi)置函數(shù)和用戶函數(shù)的性能對(duì)比,這里我們選取幾個(gè)常用的函數(shù),然后用php實(shí)現(xiàn)相同功能的函數(shù)進(jìn)行一下性能對(duì)比。測(cè)試中,我們選取字符串、數(shù)學(xué)、數(shù)組中各一個(gè)典型進(jìn)行對(duì)比,這幾個(gè)函數(shù)分別是字符串截取(substr)、10進(jìn)制轉(zhuǎn)2進(jìn)制(decbin)、求最小值(min)和返回?cái)?shù)組中的所以 key(array_keys)。
》》測(cè)試結(jié)果如下圖
》》結(jié)果分析
從測(cè)試結(jié)果可以看出,如我們預(yù)期,內(nèi)置函數(shù)在總體性能上遠(yuǎn)高于普通用戶函數(shù)。尤其對(duì)于涉及到字符串類(lèi)操作的函數(shù),差距達(dá)到了1個(gè)數(shù)量級(jí)。因此,函數(shù)使用的一個(gè)原則就是如果某功能有相應(yīng)的內(nèi)置函數(shù),盡量使用它而不是自己編寫(xiě)php函數(shù)。對(duì)于一些涉及到大量字符串操作的功能,為提高性能,可以考慮用擴(kuò)展來(lái)實(shí)現(xiàn)。比如常見(jiàn)的富文本過(guò)濾等。
和C函數(shù)性能對(duì)比
》》測(cè)試方法
我們選取字符串操作和算術(shù)運(yùn)算各3種函數(shù)進(jìn)行比對(duì),php用擴(kuò)展實(shí)現(xiàn)。三種函數(shù)是簡(jiǎn)單的一次算法運(yùn)算、字符串比較和多次的算法運(yùn)算。除了本身的兩類(lèi)函數(shù)外,還會(huì)測(cè)試將函數(shù)空調(diào)開(kāi)銷(xiāo)去掉后的性能,一方面比對(duì)一下兩種函數(shù)(c和php內(nèi)置)本身的性能差異,另外就是側(cè)面印證空調(diào)函數(shù)的消耗 測(cè)試點(diǎn)為執(zhí)行10w次操作的時(shí)間消耗
》》測(cè)試結(jié)果如下圖
》》結(jié)果分析
內(nèi)置函數(shù)和C函數(shù)的開(kāi)銷(xiāo)在去掉php函數(shù)空調(diào)用的影響后差距較小,隨著函數(shù)功能越來(lái)越復(fù)雜,雙方性能趨近于相同。這個(gè)從之前的函數(shù)實(shí)現(xiàn)分析中也容易得到論證,畢竟內(nèi)置函數(shù)就是C實(shí)現(xiàn)的。函數(shù)功能越復(fù)雜,c和php的性能差距越小 相對(duì)c來(lái)說(shuō),php函數(shù)調(diào)用的開(kāi)銷(xiāo)大很多,對(duì)于簡(jiǎn)單函數(shù)來(lái)說(shuō)性能還是有一定影響。因此php中函數(shù)不宜嵌套封裝太深。
偽函數(shù)及其性能
在php中,有這樣一些函數(shù),它們?cè)谑褂蒙鲜菢?biāo)準(zhǔn)的函數(shù)用法,但底層實(shí)現(xiàn)卻和真正函數(shù)調(diào)用完全不同,這些函數(shù)不屬于前文提到的三種function中的任何一類(lèi),其實(shí)質(zhì)是一條單獨(dú)的opcode,這里估且叫做偽函數(shù)或者指令函數(shù)。
如上所說(shuō),偽函數(shù)使用起來(lái)和標(biāo)準(zhǔn)的函數(shù)并無(wú)二致,看起來(lái)具有相同的特征。但是他們最終執(zhí)行的時(shí)候是被zend反映成了一條對(duì)應(yīng)的指令(opcode)來(lái)調(diào)用,因此其實(shí)現(xiàn)更接近于if、 for、算術(shù)運(yùn)算等操作。
》》php中的偽函數(shù)
isset
empty
unset
eval
通過(guò)上面的介紹可以看出,偽函數(shù)由于被直接翻譯成指令來(lái)執(zhí)行,和普通函數(shù)相比少了一次函數(shù)調(diào)用所帶來(lái)的開(kāi)銷(xiāo),因此性能會(huì)更好一些。我們通過(guò)如下測(cè)試來(lái)做一個(gè)對(duì)比。 Array_key_exists和isset兩者都可以判斷數(shù)組中某個(gè)key是否存在,看一下他們的性能
關(guān)于PHP函數(shù)的實(shí)現(xiàn)原理是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
本文標(biāo)題:PHP函數(shù)的實(shí)現(xiàn)原理是什么-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article32/ceeesc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站排名、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站策劃、標(biāo)簽優(yōu)化、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容