激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

百度工程師講PHP函數實(shí)現原理及性能分析樣本參閱

時(shí)間:2024-10-04 11:55:59 PHP 我要投稿
  • 相關(guān)推薦

百度工程師講PHP函數實(shí)現原理及性能分析樣本參閱

  百度工程師講PHP函數實(shí)現原理及性能分析樣本參閱

  count

  count是我們經(jīng)常用到的一個(gè)函數,其功能是返回一個(gè)數組的長(cháng)度。

  count這個(gè)函數,其復雜度是多少呢? 一種常見(jiàn)的說(shuō)法是count函數會(huì )遍歷整個(gè)數組然后求出元素個(gè)數,因此復雜度是O(n)。那實(shí)際情況是不是這樣呢?我們回到count的實(shí)現來(lái)看一下,通過(guò)源碼可以發(fā)現,對于數組的count操作,函數最終的路徑是zif_count-> php_count_recursive-> zend_hash_num_elements,而zend_hash_num_elements的行為是 return ht->nNumOfElements,可見(jiàn),這是一個(gè)O(1)而不是O(n)的操作。實(shí)際上,數組在php底層就是一個(gè)hash_table,對于hash表,zend中專(zhuān)門(mén)有一個(gè)元素nNumOfElements記錄了當前元素的個(gè)數,因此對于一般的count實(shí)際上直接就返回了這個(gè)值。由此,我們得出結論: count是O(1)的復雜度,和具體數組的大小無(wú)關(guān)。

  非數組類(lèi)型的變量,count的行為時(shí)怎樣?對于未設置變量返回0,而像int、double、string等則會(huì )返回1

  strlen

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

  isset和array_key_exists

  這兩個(gè)函數最常見(jiàn)的用法都是判斷一個(gè) key是否在數組中存在。但是前者還可以用于判斷一個(gè)變量是否被設置過(guò)。如前文所述,isset并非真正的函數,因此它的效率會(huì )比后者高很多。推薦用它代替array_key_exists。

  array_push和array

  兩者都是往數組尾部追加一個(gè)元素。不同的是前者可以一次push多個(gè)。他們最大的區別在于一個(gè)是函數一個(gè)是語(yǔ)言結構,因此后者效率要更高。因此如果只是普通的追加元素,建議使用array []。

  rand和mt_rand

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

  sort和 usort

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

  urlencode和rawurlencode

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

  strcmp系列函數

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

  is_int和is_numeric

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

  總結及建議

  總結:

  通過(guò)對函數實(shí)現的原理分析和性能測試,我們總結出以下一些結論

  1. Php的函數調用開(kāi)銷(xiāo)相對較大。

  2. 函數相關(guān)信息保存在一個(gè)大的hash_table中,每次調用時(shí)通過(guò)函數名在hash表中查找,因此函數名長(cháng)度對性能也有一定影響。

  3. 函數返回引用沒(méi)有實(shí)際意義

  4. 內置php函數性能比用戶(hù)函數高很多,尤其對于字符串類(lèi)操作。

  5. 類(lèi)方法、普通函數、靜態(tài)方法效率幾乎相同,沒(méi)有太大差異

  6. 除去空函數調用的影響,內置函數和同樣功能的C函數性能基本差不多。

  7. 所有的參數傳遞都是采用引用計數的淺拷貝,代價(jià)很小。

  8. 函數個(gè)數對性能影響幾乎可以忽略

  建議:

  因此,對于php函數的使用,有如下一些建議

  1. 一個(gè)功能可以用內置函數完成,盡量使用它而不是自己編寫(xiě)php函數。

  2. 如果某個(gè)功能對性能要求很高,可以考慮用擴展來(lái)實(shí)現。

  3. Php函數調用開(kāi)銷(xiāo)較大,因此不要過(guò)分封裝。有些功能,如果需要調用的次數很多本身又只用1、2行代碼就行實(shí)現的,建議就不要封裝調用了。

  4. 不要過(guò)分迷戀各種設計模式,如上一條描述,過(guò)分的封裝會(huì )帶來(lái)性能的下降。需要考慮兩者的權衡。Php有自己的特點(diǎn),切不可東施效顰,過(guò)分效仿java的模式。

  5. 函數不宜嵌套過(guò)深,遞歸使用要謹慎。

  6. 偽函數性能很高,同等功能實(shí)現下優(yōu)先考慮。比如用isset代替array_key_exists

  7. 函數返回引用沒(méi)有太大意義,也起不到實(shí)際作用,建議不予考慮。

  8. 類(lèi)成員方法效率不比普通函數低,因此不用擔心性能損耗。建議多考慮靜態(tài)方法,可讀性及安全性都更好。

  9. 如不是特殊需要,參數傳遞都建議使用傳值而不是傳引用。當然,如果參數是很大的數組且需要修改時(shí)可以考慮引用傳遞。

【百度工程師講PHP函數實(shí)現原理及性能分析樣本參閱】相關(guān)文章:

探討PHP函數的實(shí)現原理及性能07-07

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

關(guān)于php堆排序實(shí)現原理與應用方法10-09

php中session的實(shí)現原理以及大網(wǎng)站應用應注意的問(wèn)題分析07-26

PHP的壓縮函數06-21

淺析php函數的實(shí)例06-08

PHP路由技術(shù)的原理與實(shí)踐10-15

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

簡(jiǎn)單介紹php構造函數用法08-31

PHP中函數的使用說(shuō)明09-01

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频