ホームページ > php教程 > php手册 > PHP 配列の大きさの分析

PHP 配列の大きさの分析

WBOY
リリース: 2016-06-13 12:22:19
オリジナル
979 人が閲覧しました

一般的に 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
1000 個の要素を知ることができます。整数配列は 100k のメモリを使用し、各要素は平均して 100 バイトを使用します。純粋な C では全体的に 4k しか必要としません。 Memory_get_usage() によって返される結果は、すべてが配列によって占められるわけではなく、PHP 自体によって割り当てられるいくつかの構造も含まれます。組み込み関数によって生成される配列は、実空間に近い場合があります:

コードをコピーします コードは次のとおりです:

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 構造が必要です。



コードをコピーします。

コードは次のとおりです。

struct _zval_struct {

zvalue_value 値; zend_uchar is_ref__gc; > > コードは次のとおりです:


typedef Union _zvalue_value {
long lval;
struct {
char *val
} str;
HashTable *ht;
zend_object_value obj;

通常、この構造には 8 6 = 14 バイトが必要です。対応する zval ですが、配列、文​​字列、オブジェクトにも追加のストレージ構造が必要で、配列は HashTable です:

コードをコピー コードは次のとおりです:

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 を消費し、小さな配列には実際には価値がありません。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート