閱讀 Kohana 原始碼發現其 Arr::range() 並未使用 PHP 內建 range(),而是自行實作迴圈。這觸發了對「盡可能使用原生函數」這句常識的驗證:原生函數真的比自訂函數快嗎?
range($start, $end, $step) vs 自訂 _range($step, $max)function _range($step = 10, $max = 100) {
if ($step < 1) return [];
$arr = [];
for ($i = $step; $i <= $max; $i += $step) {
$arr[$i] = $i;
}
return $arr;
}
| 參數 | 內建 range() 時間 | 內建 range() 記憶體 | 自訂 _range() 時間 | 自訂 _range() 記憶體 |
|---|---|---|---|---|
| range(0, 1000000, 3) | 5.15 ms | 27.55 MB | 0.019 ms | 0.12 MB |
| range(0, 1000000, 2) | 7.48 ms | 40.27 MB | 0.018 ms | 0.12 MB |
| range(0, 1000, 1) | 0.082 ms | 0.16 MB | 0.026 ms | 0.12 MB |
range() 需建立完整連續陣列佔用大量記憶體;自訂版本僅存鍵值對,記憶體幾乎恆定。range() 支援字元序列(range('a','z')),自訂版本需額外擴展。「盡量用原生函數」並非絕對真理。針對大量數值序列生成,自訂迴圈在記憶體與速度上優勢明顯。Kohana 團隊深諳內核實作細節,才做出此優化。開發者應根據實際場景基準測試,而非盲目迷信。
測試代碼已上傳 GitHub Gist,歡迎自行驗證。