SplFixedArray 就是固定長度的陣列。
底下是 php 的 SplFixedArray 跟 array 的比較:
功能 | SplFixedArray | array |
---|---|---|
foreach | O | O |
string key | X | O |
動態長度 | X | O |
各種內建函式支援 | X | O |
ArrayIterator | X | O |
這樣看起來,好像沒有什麼用 SplFixedArray 的理由對吧 XD
但其實 SplFixedArray 最大的好處是:
<?php
// new SplFixedArray 時需要手動指定陣列長度
$fixedArray = new SplFixedArray(1000);
或
<?php
$array = range(1, 10);
$fixedArray = SplFixedArray::fromArray($array);
SplFixedArray 提供一些 array 也有的基礎語法:
$fixedArray[$key]
這種語法但它不能:
$fixedArray[] = $value
這種語法,因為SplFixedArray的長度是固定的<?php
$start = microtime(TRUE);
$array = [];
/**
* 底下一模一樣
*/
for ($i = 0; $i < 500000; $i++) {
$array[$i] = $i;
}
echo (microtime(TRUE) - $start) . PHP_EOL;
$start = microtime(TRUE);
foreach ($array as $key => $value) {
//
}
echo (microtime(TRUE) - $start) . PHP_EOL;
echo memory_get_peak_usage(TRUE);
<?php
$start = microtime(TRUE);
$array = new SplFixedArray(500000);
/**
* 底下一模一樣
*/
for ($i = 0; $i < 500000; $i++) {
$array[$i] = $i;
}
echo (microtime(TRUE) - $start) . PHP_EOL;
$start = microtime(TRUE);
foreach ($array as $key => $value) {
//
}
echo (microtime(TRUE) - $start) . PHP_EOL;
echo memory_get_peak_usage(TRUE);
測試 | SplFixedArray | array |
---|---|---|
寫入 | 0.05386 | 0.23111 |
讀取 | 0.03572 | 0.02204 |
記憶體佔用 | 28573696 | 72876032 |
測試 | SplFixedArray | array |
---|---|---|
寫入 | 0.01405 | 0.03015 |
讀取 | 0.01503 | 0.00756 |
記憶體佔用 | 10100736 | 18878464 |
看起來 SplFixedArray 並沒有完封 array。
儘管寫入速度及記憶體佔用 SplFixedArray 的巨大優勢都是毋庸置疑的,
但讀取速度在兩個版本都沒有比較快。
所以讓 SplFixedArray 大展身手的場景,
肯定不會是單純為了增進效能而改用 SplFixedArray,
應該更偏向出現「佔用過多記憶體」時需要做優化的場景。
收工~