首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP SPL SplFixedArray:固定長度陣列的高效能替代方案

     編輯:PHP 綜合知識

SplFixedArray 是 SPL 提供的**固定長度、整數鍵**陣列實作,底層為 C 陣列,記憶體緊湊、存取速度快,是大量數值型資料處理的利器。

效能實測(百萬級)

<?php
ini_set('memory_limit', '128M');
for ($size = 10000; $size < 10000000; $size *= 4) {
    echo "Testing size: $size\n";

    $s = microtime(true);
    $arr = [];
    for ($i = 0; $i < $size; $i++) $arr[$i] = null;
    echo "Array(): " . (microtime(true) - $s) . "s\n";

    $s = microtime(true);
    $sfa = new SplFixedArray($size);
    for ($i = 0; $i < $size; $i++) $sfa[$i] = null;
    echo "SplFixedArray(): " . (microtime(true) - $s) . "s\n";
}

典型結果:

Testing size: 10000
Array(): 0.0040s
SplFixedArray(): 0.0020s

Testing size: 2560000
Array(): 0.7570s
SplFixedArray(): 0.6730s

結論:建構與寫入速度快 **20%~30%**,記憶體佔用約 **1/3 ~ 1/2**(無雜湊表開銷)。

核心 API

方法說明
__construct(int $size = 0)建立指定長度陣列
setSize(int $size)動態調整長度(擴增補 null,縮減截斷)
getSize()取得當前長度
offsetSet/Get/Exists/UnsetArrayAccess 介面,支援 $arr[3] = 'x'
current/key/next/rewind/validIterator 介面,支援 foreach
count()Countable 介面,等同 getSize()
toArray()轉為標準陣列
fromArray(array, $save_indexes=true)靜態工廠,從陣列建立

實戰範例

<?php
$arr = new SplFixedArray(4);
$arr[0] = 'php';
$arr[1] = 1;
$arr[3] = 'python'; // 索引 2 為 null

foreach ($arr as $v) {
    echo $v . PHP_EOL; // php, 1, , python
}

echo $arr->getSize(); // 4

$arr->setSize(5);
$arr[4] = 'new one';

// 越界存取拋 RuntimeException
try {
    echo $arr[10];
} catch (RuntimeException $e) {
    echo "Out of bounds: " . $e->getMessage();
}

適用場景與限制

  • ✅ 大量定長數值陣列(座標、像素、時間序列、矩陣運算)
  • ✅ 高頻寫入/讀取、記憶體敏感環境
  • ❌ 鍵名需為字串/負數/非連續整數 → 用標準陣列
  • ❌ 頻繁增減長度 → 標準陣列 [] 擴容機制更靈活
  • ❌ 需關聯式存取 → 用標準陣列或 ArrayObject

進階:搭配 JIT(PHP 8.0+)

PHP 8 JIT 對 SplFixedArray 的 C 級迴圈優化極佳,數值運算迴圈速度可逼近 C 擴展,適合科學計算、遊戲邏輯、訊號處理等高效能場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved