ホームページ バックエンド開発 PHPチュートリアル PHP 配列のメモリ使用量の分析

PHP 配列のメモリ使用量の分析

Dec 09, 2019 pm 05:54 PM
PHP配列

次のアプローチではどれくらいのメモリが必要になりますか?

list($appid,$openid) = ["testcontent","test"];
ログイン後にコピー

Test

$m0 = memory_get_usage();
$k = range(1,200000);
$m1 = memory_get_usage();
echo round(($m1-$m0)/pow(1024,2),4) ."MB\n";
foreach ($k as $i){
    $n1 = "kk$i";
    $n2 = "tt$i";
    list($$n1,$$n2) = [$i,$i*3];
}
$m2 = memory_get_usage();
echo round(($m2-$m1)/pow(1024,2),4) ."MB\n";
$m1 = memory_get_usage();
foreach ($k as $i){
    $n1 = "kk$i";
    $n2 = "tt$i";
    $$n1 = $i+time();
    $$n2 = 2*time();
}
$m2 = memory_get_usage();
echo round(($m2-$m1)/pow(1024,2),4) ."MB\n";
ログイン後にコピー

上記の演算出力の結果は次のとおりです:

27.9404MB
51.3041MB
9.1553MB
ログイン後にコピー

メモリが配列によって占有されていることがわかります。通常割り当てられるコンテンツよりもはるかに大きいです

原則

PHP では、数値を表すために long 型が使用され、int 型は使用されません。 PHP が弱い型指定言語であることは誰もが理解していますが、変数の型を区別せず、int float char * などの概念がありません。 PHP が zend に保存する変数を見てみましょう。PHP の各変数には、対応する zval があります。Zval 構造は Zend/zend.h で定義されています。その構造:

typedef struct _zval_struct zval;  
struct _zval_struct {  
    /* Variable information */  
    zvalue_value value;     /* The value 1 12字节(32位机是12,64位机需要8+4+4=16) */  
    zend_uint refcount__gc; /* The number of references to this value (for GC) 4字节 */  
    zend_uchar type;        /* The active type 1字节*/  
    zend_uchar is_ref__gc;  /* Whether this value is a reference (&) 1字节*/  
};
ログイン後にコピー

PHP は UNION 構造を使用して保存します変数の値、つまり zvalue_value は共用体です。UNION 変数が占有するメモリは、最大メンバー データ スペースによって決まります。

typedef union _zvalue_value {  
    long lval;                  /* long value */  
    double dval;                /* double value */  
    struct {                    /* string value */  
        char *val;  
        int len;  
    } str;   
    HashTable *ht;              /* hash table value */  
    zend_object_value obj;      /*object value */  
} zvalue_value;
ログイン後にコピー

最大のメンバー データ スペースは struct str で、ポインターは *val に 4 バイト、INT は 4 バイト、合計 8 バイトを占めます。

構造体 zval が占めるスペースは 8 4 1 1 = 14 バイトです。実際、zval 内の配列、文字列、オブジェクトには追加のストレージ構造が必要です。配列はハッシュテーブルです:

ハッシュテーブル構造体は Zend/zend_hash.h で定義されています。

typedef struct _hashtable {  
    uint nTableSize;//4  
    uint nTableMask;//4  
    uint nNumOfElements;//4  
    ulong nNextFreeElement;//4  
    Bucket *pInternalPointer;   /* Used for element traversal 4*/  
    Bucket *pListHead;//4  
    Bucket *pListTail;//4  
    Bucket **arBuckets;//4  
    dtor_func_t pDestructor;//4  
    zend_bool persistent;//1  
    unsigned char nApplyCount;//1  
    zend_bool bApplyProtection;//1  
#if ZEND_DEBUG  
    int inconsistent;//4  
#endif  
} HashTable;
ログイン後にコピー

HashTable 構造体には 39 バイトが必要で、各配列要素は Bucket 構造体に格納されます。

typedef struct bucket {  
    ulong h;    /* Used for numeric indexing                4字节 */  
    uint nKeyLength;    /* The length of the key (for string keys)  4字节 */  
    void *pData;        /* 4字节*/  
    void *pDataPtr;         /* 4字节*/  
    struct bucket *pListNext;  /* PHP arrays are ordered. This gives the next element in that order4字节*/  
    struct bucket *pListLast;  /* and this gives the previous element           4字节 */  
    struct bucket *pNext;      /* The next element in this (doubly) linked list     4字节*/  
    struct bucket *pLast;      /* The previous element in this (doubly) linked list     4字节*/  
    char arKey[1];            /* Must be last element   1字节*/  
} Bucket;
ログイン後にコピー

Bucket 構造体には 33 バイトが必要です。 Bucket の末尾にキー長が 4 バイトを超える部分が追加され、要素の値が zval 構造体になる可能性が高く、また、各配列には arBuckets が指す Bucket ポインタの配列が割り当てられますが、これは割り当てられません。要素が追加されるたびにポインターが必要になると言われていますが、状況はさらに悪化する可能性があります。これは、1 つの配列要素が 54 バイトを占有することを計算し、これは上記の見積もりとほぼ同じです。

空の配列は、少なくとも 14(zval) 39(HashTable) 33(arBuckets) = 86 バイトを占めます。変数として、シンボル テーブル内に位置が必要であり、配列要素でもあるため、空の配列 配列変数の記述と格納には 118 バイトが必要です。スペースの観点から見ると、小さな配列は平均して高価ですが、もちろん、スクリプトが多数の小さな配列で埋め尽くされることはなく、より少ないスペースコストでプログラミングの利便性が得られます。しかし、配列をコンテナとして使用する場合は別の話になり、実際のアプリケーションでは、多くの要素を含む多次元配列に遭遇することがよくあります。たとえば、10k 要素の 1 次元配列は約 540k のメモリを消費しますが、10k の配列は実際には 23M を消費し、小さな配列には実際には価値がありません。

以上がPHP 配列のメモリ使用量の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP 配列を使用してチャートや統計グラフを生成および表示する方法 PHP 配列を使用してチャートや統計グラフを生成および表示する方法 Jul 15, 2023 pm 12:24 PM

PHP 配列を使用してチャートや統計グラフを生成および表示する方法 PHP は、強力なデータ処理機能とグラフィック生成機能を備えた、広く使用されているサーバーサイド スクリプト言語です。 Web 開発では、データのグラフや統計グラフを表示する必要がよくありますが、PHP 配列を使用すると、これらの機能を簡単に実装できます。この記事では、PHP 配列を使用してチャートや統計グラフを生成および表示する方法を紹介し、関連するコード例を示します。必要なライブラリ ファイルとスタイル シートの導入 開始する前に、いくつかの必要なライブラリ ファイルを PHP ファイルに導入する必要があります

PHP 配列を使用して動的なスライドショーと画像表示を生成する方法 PHP 配列を使用して動的なスライドショーと画像表示を生成する方法 Jul 15, 2023 pm 01:17 PM

PHP 配列を使用して動的なスライドショーと画像表示を生成する方法 スライドショーと画像表示は Web デザインの一般的な機能であり、カルーセルやギャラリー表示などのシナリオでよく使用されます。一般的なサーバーサイド スクリプト言語として、PHP にはデータを処理して動的な HTML ページを生成する機能があり、動的なスライドショーや画像表示の生成に非常に適しています。この記事では、PHP 配列を使用して動的なスライドショーと画像表示を生成する方法と、対応するコード例を紹介します。画像データを準備する まず、画像パス データのセットを準備する必要があります。

PHPで配列を平均化する関数は何ですか? PHPで配列を平均化する関数は何ですか? Jul 17, 2023 pm 04:03 PM

PHP 配列平均関数には次のものが含まれます: 1. array_sum()、配列内のすべての値の合計を計算するために使用されます平均を計算するには、配列内のすべての値を加算してから除算します。配列要素の数; 2、array_reduce()、配列を反復し、初期値を使用して各値を計算するために使用されます; 3. array_mean()、配列の平均を返し、最初に配列の合計を計算するために使用されます。配列要素の数を計算し、合計を配列要素の数で割って平均を取得します。

PHP 配列を使用してユーザー ログインおよび権限管理機能を実装する方法 PHP 配列を使用してユーザー ログインおよび権限管理機能を実装する方法 Jul 15, 2023 pm 08:55 PM

PHP 配列を使用してユーザーのログインと権限の管理機能を実装する方法 Web サイトを開発する場合、ユーザーのログインと権限の管理は非常に重要な機能の 1 つです。ユーザー ログインにより、ユーザーを認証し、Web サイトのセキュリティを保護することができます。権限管理では、Web サイト上でのユーザーの操作権限を制御し、ユーザーが許可されている機能のみにアクセスできるようにします。この記事では、PHP 配列を使用してユーザーのログインと権限の管理機能を実装する方法を紹介します。簡単な例を使用してこのプロセスを説明します。まず作成する必要があります

PHP 配列のパフォーマンス最適化手法の探求 PHP 配列のパフォーマンス最適化手法の探求 Mar 13, 2024 pm 03:03 PM

PHP 配列は、開発プロセス中によく使用される非常に一般的なデータ構造です。ただし、データ量が増加すると、アレイのパフォーマンスが問題になる可能性があります。この記事では、PHP 配列のパフォーマンス最適化手法をいくつか検討し、具体的なコード例を示します。 1. 適切なデータ構造を使用する PHP には、通常の配列に加えて、SplFixedArray、SplDoublyLinkedList など、特定の状況で通常の配列よりもパフォーマンスが優れたデータ構造がいくつかあります。

PHP配列のキーと値のペアとは何ですか? PHP配列のキーと値のペアとは何ですか? Aug 03, 2023 pm 02:20 PM

PHP の配列キーと値のペアは、キーと対応する値で構成されるデータ構造です。キーは配列要素の識別子であり、値はキーに関連付けられたデータです。キーを識別子として使用してデータを保存およびアクセスできるようになり、キーと値のペアを使用することで、配列内の要素の操作と管理がより簡単になり、プログラム開発がより柔軟かつ効率的になります。

PHPの二次元配列を一次元配列に変換する方法 PHPの二次元配列を一次元配列に変換する方法 Aug 03, 2023 am 11:14 AM

PHP 配列を 2 次元から 1 次元配列に変換する方法: 1. ループ トラバーサルを使用して 2 次元配列を走査し、各要素を 1 次元配列に追加します; 2. 「array_merge」関数を使用して複数の要素をマージします配列を配列に. 二次元配列を「array_merge」関数にパラメータとして渡して一次元配列に変換; 3. 「array_reduce」関数を使用すると、配列内のすべての値を処理できますコールバック関数を介して、最終的に結果を返します。

PHPに存在する配列の数を確認する方法 PHPに存在する配列の数を確認する方法 Aug 04, 2023 pm 05:40 PM

PHP で配列を決定するには、いくつかの方法があります。 1. すべてのタイプの配列に適した count() 関数を使用します。ただし、渡されたパラメータが配列でない場合、count() 関数は 0 を返すことに注意してください。2. 他のプログラミング言語との互換性を維持するために使用される sizeof() 関数を使用します。3. カスタム関数では、ループを使用して配列を走査することにより、配列を走査するたびにカウンターが 1 ずつ増加し、最終的に配列の長さが取得されます。カスタム関数は実際のニーズに応じて変更および拡張できるため、より柔軟になります。

See all articles