系列完結篇,逐一剖析高頻函數內部實現、時間複雜度、常見誤區,並給出「用內置、避免重造、善用偽函數」的黃金法則。
| 函數 | 實現要點 | 複雜度 | 常見誤區 | 建議 |
|---|---|---|---|---|
| count() | 直接返回 ht->nNumOfElements | O(1) | 以為遍歷數組 O(n) | 放心在循環條件中使用 |
| strlen() | 直接返回字符串結構體 len 字段 | O(1) | 以為像 C 一樣遍歷 | 非字符串會強制轉換,注意類型 |
| isset() | 偽函數,編譯為 Opcode,無調用開銷 | O(1) | 當作普通函數用 | 替代 array_key_exists(),快 4 倍 |
| array_push() | 函數調用開銷 | O(n) n為壓入元素數 | 以為比 $arr[] 快 | 單個追加用 $arr[] = $val,語言結構更快 |
| rand() vs mt_rand() | mt_rand 基於梅森旋轉,速度快 4 倍,周期長 | - | 混用 srand/mt_srand | 高性能隨機用 mt_rand,配套 mt_srand |
| sort() vs usort() | 均為快速排序,usort 允許自定義比較 | O(n log n) | 自己寫排序 | 內置排序經過優化,勿重造 |
| urlencode vs rawurlencode | 空格編碼:+ vs %20 | - | 混用 encode/decode | 非搜索引擎場景用 rawurlencode |
| strcmp 系列 | 底層用 memcmp,支援 \0 字符,先比長度快速失敗 | O(n) | 以為同 C 的 strcmp | 利用長度優先優化,大數據量顯著 |
| is_int vs is_numeric | is_int 直接檢查 zval type;is_numeric 掃描字符串 | O(1) vs O(n) | 混淆類型檢查與值檢查 | 嚴格類型判斷用 is_int,數值字符串用 is_numeric |