亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

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

2024-05-04 23:35:12
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了百度工程師講PHP函數的實現原理及性能分析(三),本文講解了常用php函數實現及介紹,并作了總結及建議,需要的朋友可以參考下
 

常用php函數實現及介紹

count
count是我們經常用到的一個函數,其功能是返回一個數組的長度。
count這個函數,其復雜度是多少呢? 一種常見的說法是count函數會遍歷整個數組然后求出元素個數,因此復雜度是O(n)。那實際情況是不是這樣呢?我們回到count的實現來看一下,通過源碼可以發現,對于數組的count操作,函數最終的路徑是zif_count-> php_count_recursive-> zend_hash_num_elements,而zend_hash_num_elements的行為是 return ht->nNumOfElements,可見,這是一個O(1)而不是O(n)的操作。實際上,數組在php底層就是一個hash_table,對于hash表,zend中專門有一個元素nNumOfElements記錄了當前元素的個數,因此對于一般的count實際上直接就返回了這個值。由此,我們得出結論: count是O(1)的復雜度,和具體數組的大小無關。
非數組類型的變量,count的行為時怎樣?對于未設置變量返回0,而像int、double、string等則會返回1

strlen
Strlen用于返回一個字符串的長度。那么,他的實現原理是如何的呢?我們都知道在c中strlen是一個o(n)的函數,會順序遍歷字符串直到遇到/0,然后出長度。Php中是否也這樣呢?答案是否定的,php里字符串是用一個復合結構來描述,包括指向具體數據的指針和字符串長度(和c++中string類似),因此 strlen就直接返回字符串長度了,是常數級別的操作。另外,對于非字符串類型的變量調用strlen,它會首先將變量強制轉換為字符串再求長度,這點需要注意。

isset和array_key_exists
這兩個函數最常見的用法都是判斷一個 key是否在數組中存在。但是前者還可以用于判斷一個變量是否被設置過。如前文所述,isset并非真正的函數,因此它的效率會比后者高很多。推薦用它代替array_key_exists。
array_push和array[]
兩者都是往數組尾部追加一個元素。不同的是前者可以一次push多個。他們最大的區別在于一個是函數一個是語言結構,因此后者效率要更高。因此如果只是普通的追加元素,建議使用array []。

rand和mt_rand
兩者都是提供產生隨機數的功能,前者使用 libc標準的rand。后者用了 Mersenne Twister 中已知的特性作為隨機數發生器,它可以產生隨機數值的平均速度比 libc 提供的 rand() 快四倍。因此如果對性能要求較高,可以考慮用mt_rand代替前者。我們都知道,rand產生的是偽隨機數,在C中需要用srand顯示指定種子。但是在php中,rand會自己幫你默認調用一次srand,一般情況下不需要自己再顯示的調用。需要注意的是,如果特殊情況下需要調用srand時,一定要配套調用。就是說srand對于rand,mt_srand對應srand,切不可混合使用,否則是無效的。

sort和 usort
兩者都是用于排序,不同的是前者可以指定排序策略,類似我們C里面的qsort和C++的sort。在排序上兩者都是采用標準的快排來實現,對于有排序需求的,如非特殊情況調用php提供的這些方法就可以了,不用自己重新實現一遍,效率會低很多。原因見前文對于用戶函數和內置函數的分析比對。

urlencode和rawurlencode
這兩個都是用于 url編碼, 字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)后跟兩位十六進制數。兩者唯一的區別在于對于空格,urlencode會編碼為+,而 rawurlencode會編碼為%20。一般情況下除了搜索引擎,我們的策略都是空格編碼為%20。因此采用后者的居多。注意的是encode和 decode系列一定要配套使用。

strcmp系列函數
這一系列的函數包括strcmp、 strncmp、strcasecmp、strncasecmp,實現功能和C函數相同。但也有不同,由于php的字符串是允許/0出現,因此在判斷的時候底層使用的是memcmp系列而非strcmp,理論上來說更快。另外由于php直接能獲取到字符串長度,因此會首先這方面的檢查,很多情況下效率就會高很多了。

is_int和is_numeric
這兩個函數功能相似又不完全相同,使用的時候一定需要注意他們的區別。Is_int:判斷一個變量類型是否是整數型,php變量中專門有一個字段表征類型,因此直接判斷這個類型即可,是一個絕對 O(1)的操作 Is_numeric:判斷一個變量是否是整數或數字字符串,也就是說除了整數型變量會返回true之外,對于字符串變量,如果形如”1234”,”1e4”等也會被判為true。這個時候會遍歷字符串進行判斷。

總結及建議

總結:
通過對函數實現的原理分析和性能測試,我們總結出以下一些結論
1. Php的函數調用開銷相對較大。
2. 函數相關信息保存在一個大的hash_table中,每次調用時通過函數名在hash表中查找,因此函數名長度對性能也有一定影響。
3. 函數返回引用沒有實際意義
4. 內置php函數性能比用戶函數高很多,尤其對于字符串類操作。
5. 類方法、普通函數、靜態方法效率幾乎相同,沒有太大差異
6. 除去空函數調用的影響,內置函數和同樣功能的C函數性能基本差不多。
7. 所有的參數傳遞都是采用引用計數的淺拷貝,代價很小。
8. 函數個數對性能影響幾乎可以忽略

建議:

因此,對于php函數的使用,有如下一些建議
1. 一個功能可以用內置函數完成,盡量使用它而不是自己編寫php函數。
2. 如果某個功能對性能要求很高,可以考慮用擴展來實現。
3. Php函數調用開銷較大,因此不要過分封裝。有些功能,如果需要調用的次數很多本身又只用1、2行代碼就行實現的,建議就不要封裝調用了。
4. 不要過分迷戀各種設計模式,如上一條描述,過分的封裝會帶來性能的下降。需要考慮兩者的權衡。Php有自己的特點,切不可東施效顰,過分效仿java的模式。
5. 函數不宜嵌套過深,遞歸使用要謹慎。
6. 偽函數性能很高,同等功能實現下優先考慮。比如用isset代替array_key_exists
7. 函數返回引用沒有太大意義,也起不到實際作用,建議不予考慮。
8. 類成員方法效率不比普通函數低,因此不用擔心性能損耗。建議多考慮靜態方法,可讀性及安全性都更好。
9. 如不是特殊需要,參數傳遞都建議使用傳值而不是傳引用。當然,如果參數是很大的數組且需要修改時可以考慮引用傳遞。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲片在线资源| 久久亚洲精品毛片| 欧美三级欧美成人高清www| 欧美大尺度激情区在线播放| 久久五月天综合| 欧美国产日产韩国视频| 国产欧美在线看| 欧美在线一级视频| 日韩精品黄色网| 一夜七次郎国产精品亚洲| 亚洲精品国产精品久久清纯直播| 久久久久久久久久久国产| 2018国产精品视频| 国产精品久久99久久| 亚洲第一男人av| 亚洲福利视频二区| 欧美在线激情网| 欧美日韩在线一区| 久久视频免费在线播放| 日韩免费观看网站| 国产精品无av码在线观看| 98视频在线噜噜噜国产| 大桥未久av一区二区三区| 亚洲福利视频久久| 亚洲国产欧美一区二区丝袜黑人| 日韩av中文字幕在线播放| 亚洲国产91精品在线观看| 欧美激情国内偷拍| 国产激情久久久久| 97人人模人人爽人人喊中文字| 51久久精品夜色国产麻豆| 欧美性视频网站| 日韩福利伦理影院免费| 国产精品美女www爽爽爽视频| 国产精品第七十二页| 国产精彩精品视频| 国产精品18久久久久久麻辣| 欧美成aaa人片在线观看蜜臀| 国产+人+亚洲| 久久这里只有精品99| 亚洲成人激情图| 午夜精品www| 久久久成人av| 日韩av在线网| 爽爽爽爽爽爽爽成人免费观看| 欧美激情第一页xxx| 欧美激情手机在线视频| 国产欧美日韩丝袜精品一区| 中文字幕亚洲欧美一区二区三区| 欧美色视频日本高清在线观看| 4k岛国日韩精品**专区| 久精品免费视频| 91免费国产网站| 51视频国产精品一区二区| 日韩中文在线观看| 成人网页在线免费观看| 美日韩精品免费观看视频| 欧美韩日一区二区| 欧洲午夜精品久久久| 亚洲高清一二三区| 精品一区二区亚洲| 精品视频偷偷看在线观看| 欧美国产日韩xxxxx| 国产精品美女无圣光视频| 亚洲成人精品视频| 日韩精品在线第一页| 亚洲电影成人av99爱色| 亚洲男女自偷自拍图片另类| 中文字幕亚洲欧美日韩在线不卡| 国产美女精品视频| 精品久久久久久国产91| 91九色单男在线观看| 国产美女久久久| 亚洲午夜激情免费视频| 亚洲精品国偷自产在线99热| 亚洲欧美国产日韩天堂区| 欧美另类69精品久久久久9999| 国产精品视频不卡| 亚洲欧美制服中文字幕| 91麻豆国产精品| 久久精品视频在线| 日韩av在线一区| 国产精品91视频| 欧美激情二区三区| 91在线高清视频| 成人黄色免费在线观看| 最近日韩中文字幕中文| 国产精品私拍pans大尺度在线| 美日韩精品免费观看视频| 久久精品视频99| 97视频国产在线| 久久久亚洲成人| 亚洲国产91色在线| 中文字幕日韩av| 亚洲少妇激情视频| 亚洲色图综合久久| 成人免费午夜电影| 久久精品这里热有精品| 欧美极品少妇xxxxⅹ喷水| 国产大片精品免费永久看nba| 久久伊人91精品综合网站| 国产精品99一区| 久久精品视频在线| 爽爽爽爽爽爽爽成人免费观看| 日韩电视剧免费观看网站| 欧美日本亚洲视频| 国产精品9999| 欧美激情国产日韩精品一区18| 欧洲美女免费图片一区| 欧美另类在线观看| 国产午夜一区二区| 亚洲激情视频在线观看| 亚洲精品日产aⅴ| 国产精品流白浆视频| 国产欧美精品日韩| 欧美激情一区二区三区成人| 51精品国产黑色丝袜高跟鞋| 久久天天躁日日躁| 在线精品91av| 日韩欧美有码在线| 成人激情视频小说免费下载| 一区二区日韩精品| 亚洲第一黄色网| 欧洲亚洲在线视频| zzjj国产精品一区二区| 91亚洲国产成人久久精品网站| 日本久久久久久久久久久| 亚洲欧美在线磁力| 午夜精品在线视频| 国模精品系列视频| 欧美极品xxxx| 日韩专区中文字幕| 欧美成人中文字幕| 日韩国产激情在线| 欧美xxxx18性欧美| 欧美日韩国产影院| 国产精品亚洲一区二区三区| 激情av一区二区| 亚洲最大福利视频网| 在线国产精品视频| 中文欧美日本在线资源| 成人激情视频小说免费下载| 欧美一区二区视频97| 日韩视频第一页| 国产视频久久久久久久| 另类图片亚洲另类| 精品久久久久久久久久久久| 久久视频这里只有精品| 欧美床上激情在线观看| 中文字幕精品一区二区精品| 久久网福利资源网站| 国产视频一区在线| 精品亚洲一区二区| 亚洲精品国精品久久99热一| 久久久久久久av| 久久在线免费视频| 欧美日韩成人黄色| 久久久www成人免费精品张筱雨| 精品国产福利视频| 91国产精品视频在线| 国产精品久久久久久久久久| 成人欧美在线观看| 久久久免费电影| 亚洲欧美日韩网|