一般的に 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";
58176
162956
267088
1000 個の要素を知ることができます。整数配列は 100k のメモリを使用し、各要素は平均して 100 バイトを使用します。純粋な C では全体的に 4k しか必要としません。 Memory_get_usage() によって返される結果は、すべてが配列で占有されているわけではなく、PHP 自体によって割り当てられた一部の構造も含まれており、組み込み関数によって生成された配列は実際の空間に近い場合があります。
コードをコピーします。は次のとおりです:
echo "init mem: " .memory_get_usage() . "n";
$a = array_fill(0, 10000, 1); : " .memory_get_usage(true) . “n”;
$b = array_fill(0, 10000, 1);
echo “10k 要素: ” .memory_get_usage() . “, system: ” .memory_get_usage(true) . “n ”; Get: init mem: 58468
10k elements: 724696, system: 786432
10k elements: 1390464, system: 1572864
この結果から、配列の1つの要素は60バイト程度しか占有していないように見えます。配列の C 構造体を見てください。まず、Zval 構造体が必要です。
{
zvalue_value value;
zvalue_value は共用体です:
コードをコピーします。 コードは次のとおりです。 レントレン;
} str;
zend_object_value obj;
通常、zval 構造には 8+6=14 バイトが必要ですが、配列、文字列、オブジェクトも必要です。追加のストレージ構造が必要で、配列は HashTable です:
コードをコピーします。 コードは次のとおりです。
typedef struct _hashtable {
uint nTableMask; nN extFreeElement ;バケット *pInternalPointer; バケット *pListTail; zend_bool 永続的; } HashTable;
HashTable 構造には 40 バイトが必要です。各配列要素は Bucket 構造に格納されます。
コードをコピーします。 コードは次のとおりです。
ulong h;
void *pDataPtr;構造体バケット *pListLast;
構造体バケット *pLast;
Bucket構造体は36バイト必要で、キー長が4バイトを超える部分はBucketの末尾に追加され、要素の値はzval構造体になる可能性が高く、また各配列にはBucketポインタが割り当てられます。追加の各要素にはポインタが必要であると言われていますが、実際の状況はさらに悪い可能性があります。これは、1 つの配列要素が 54 バイトを占有することを計算します。これは、上記の推定値からそれほど遠くありません。
空の配列は、変数として少なくとも 14(zval) + 40(HashTable) + 32(arBuckets) = 86 バイトを占め、シンボル テーブル内に位置が必要であり、配列要素でもあるため、空の配列となります。変数の記述と格納には 118 バイトが必要です。スペースの観点から見ると、小さな配列の方が平均してコストが高くなります。もちろん、スクリプトが多数の小さな配列で埋め尽くされることはなく、より少ないスペースコストでプログラミングの利便性が得られます。
しかし、配列をコンテナとして使用する場合は別の話になります。実際のアプリケーションでは、多くの要素を含む多次元配列に遭遇することがよくあります。たとえば、10k 要素の 1 次元配列は約 540k のメモリを消費しますが、10k の 2 次元配列は実際には 23M を消費し、小さな配列には実際には価値がありません。
http://www.bkjia.com/PHPjc/320469.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/320469.html技術記事一般に、PHP で多数の配列操作を実行する場合、プログラミング設計の問題がある程度反映される可能性がありますが、配列が占有するメモリを大まかに見積もる必要があります。 まず、私は...