<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 百度工程師講PHP函數(shù)實現(xiàn)原理及性能分析樣本參閱

    時間:2024-10-04 11:55:59 PHP 我要投稿
    • 相關推薦

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

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

      count

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

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

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

      strlen

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

      isset和array_key_exists

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

      array_push和array

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

      rand和mt_rand

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

      sort和 usort

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

      urlencode和rawurlencode

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

      strcmp系列函數(shù)

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

      is_int和is_numeric

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

      總結及建議

      總結:

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

      1. Php的函數(shù)調(diào)用開銷相對較大。

      2. 函數(shù)相關信息保存在一個大的hash_table中,每次調(diào)用時通過函數(shù)名在hash表中查找,因此函數(shù)名長度對性能也有一定影響。

      3. 函數(shù)返回引用沒有實際意義

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

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

      6. 除去空函數(shù)調(diào)用的影響,內(nèi)置函數(shù)和同樣功能的C函數(shù)性能基本差不多。

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

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

      建議:

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

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

      2. 如果某個功能對性能要求很高,可以考慮用擴展來實現(xiàn)。

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

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

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

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

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

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

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

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

    探討PHP函數(shù)的實現(xiàn)原理及性能07-07

    PHP中的排序函數(shù)區(qū)別分析08-23

    關于php堆排序實現(xiàn)原理與應用方法10-09

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

    PHP的壓縮函數(shù)06-21

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

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

    php外部執(zhí)行命令函數(shù)10-27

    簡單介紹php構造函數(shù)用法08-31

    PHP中函數(shù)的使用說明09-01

    主站蜘蛛池模板: 精品午夜福利1000在线观看| 久久精品国产亚洲AV嫖农村妇女| 久久精品国产第一区二区| 国精品无码一区二区三区左线| 精品无人区无码乱码大片国产| 精品国产欧美另类一区| 欧洲精品99毛片免费高清观看| 久99久无码精品视频免费播放| 久久国产成人精品麻豆| 精品无码一区在线观看| 亚洲国产高清精品线久久| 国产精品无码国模私拍视频| 国产精品视频第一页| 精品久久8x国产免费观看| 亚洲精品无码专区久久久 | 97精品久久天干天天天按摩| 无码精品久久一区二区三区| wwwvr高清亚洲精品二区| 久久精品免费观看| 精品国产美女福利到在线不卡| 99精品热这里只有精品| 久久精品国产网红主播| 日产精品一线二线三线芒果| 在线精品动漫一区二区无广告| 日本精品一区二区久久久| 久久精品国产亚洲Aⅴ香蕉| 国产一在线精品一区在线观看| 国产午夜精品久久久久九九| 国产精品欧美一区二区三区| 人精品影院| 国产精品自产拍在线观看花钱看| 99久久精品九九亚洲精品| 国产成人精品一区在线| 国产成人精品无人区一区| 国产乱码伦精品一区二区三区麻豆| 国产成人精品综合久久久| 国产成人无码精品久久久免费 | 国产在线精品观看免费观看| 精品国产污污免费网站入口| 国内精品久久久久久不卡影院| 国产精品九九久久免费视频 |