- 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。這個時候會周遊字元串進行判斷。
版權聲明:本文為CSDN部落客「weixin_34128534」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34128534/article/details/91536951