一般的に PHP で多数の配列操作を実行する場合、プログラミング設計の問題がある程度反映される可能性がありますが、配列が占有するメモリを大まかに見積もる必要があります。
まず、1000 要素の整数配列が占めるメモリを感じてください:
コードをコピーします コードは次のとおりです:
echomemory_get_usage () . “n”;
$a = Array();
for ($i=0; $i$a[$i] = $i $i ;
}
echomemory_get_usage() .
for ($i=1000; $i$a[$i] = $i $i ;
}
echomemory_get_usage() . "n";
コードをコピーします コードは次のとおりです:
echo “init mem: ” .memory_get_usage() “n”;
$a = array_fill(0, 10000, 1 );
エコー "10k 要素: " .memory_get_usage(true) "; 🎜>echo "10k 要素: " .memory_get_usage() "、システム: " .memory_get_usage(true)";
init mem: 58468 elements: 724696 , system: 786432
10k elements: 1390464, system: 1572864
この結果から、配列の 1 つの要素は約 60 バイトしか占有しないように見えます。 PHP の配列変数の C 構造を見てみましょう。まず、zval 構造が必要です。
zvalue_value 値; zend_uchar is_ref__gc; > > コードは次のとおりです:
typedef Union _zvalue_value {
long lval;
struct {
char *val
} str;
HashTable *ht;
zend_object_value obj;
コードをコピー コードは次のとおりです:
typedef struct _hashtable {
uint nTableSize;
ulong nNextFreeElement;
Bucket *pListHead;
Bucket **arBuckets;
zend_bool bApplyProtection;
ハッシュテーブル構造体には 40 バイトが必要で、各配列要素は Bucket 構造体に格納されます:
typedef struct バケット { ulong h; void *pData;
struct バケット *pListNext;構造体バケット *pNext;構造体バケット
arKey[1];
Bucket 構造体には 36 バイトが必要です。キー長が 4 バイトを超える部分は、Bucket 構造体の最後に追加されます。また、各配列には Bucket ポインタが割り当てられます。追加の各要素にポインターが必要であるとは言えませんが、実際の状況はさらに悪い可能性があります。これは、1 つの配列要素が 54 バイトを占有することを計算します。これは、上記の推定値からそれほど遠くありません。
空の配列は、変数として少なくとも 14(zval) 40(HashTable) 32(arBuckets) = 86 バイトを占め、シンボル テーブル内に位置が必要であり、配列要素でもあるため、空の配列となります。変数の記述と格納には 118 バイトが必要です。スペースの観点から見ると、小さな配列の方が平均してコストが高くなります。もちろん、スクリプトが多数の小さな配列で埋め尽くされることはなく、より少ないスペースコストでプログラミングの利便性が得られます。
しかし、配列をコンテナとして使用する場合は別の話になります。実際のアプリケーションでは、多くの要素を含む多次元配列に遭遇することがよくあります。たとえば、10k 要素の 1 次元配列は約 540k のメモリを消費しますが、10k の 2 次元配列は実際には 23M を消費し、小さな配列には実際には価値がありません。