Heim Backend-Entwicklung PHP-Tutorial Analyse der PHP-Array-Speichernutzung

Analyse der PHP-Array-Speichernutzung

Dec 09, 2019 pm 05:54 PM
php数组

Wie viel Speicher wird der folgende Ansatz beanspruchen?

list($appid,$openid) = ["testcontent","test"];
Nach dem Login kopieren

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";
Nach dem Login kopieren

Die Ausgabe der obigen Operation lautet wie folgt:

27.9404MB
51.3041MB
9.1553MB
Nach dem Login kopieren

Es ist ersichtlich, dass der vom Array belegte Speicher beträgt viel größer als der normalerweise zugewiesene Inhalt

Prinzip

In PHP wird der Typ long zur Darstellung von Zahlen verwendet, der Typ int wird nicht verwendet. Jeder versteht, dass PHP eine schwach typisierte Sprache ist, die den Typ der Variablen nicht unterscheidet und keine Konzepte wie int float char * hat. Werfen wir einen Blick auf die Variablen, die PHP in Zend speichert. Jede Variable in PHP ist in Zend/zend.h definiert. Ihre Struktur:

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字节*/  
};
Nach dem Login kopieren

PHP verwendet eine UNION-Struktur zum Speichern Der Wert der Variablen, d. h. zvalue_value, ist eine Union. Der von der UNION-Variablen belegte Speicher wird durch den maximalen Mitgliedsdatenraum bestimmt.

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;
Nach dem Login kopieren

Der maximale Mitgliedsdatenraum ist struct str, der Zeiger belegt 4 Bytes für *val und INT belegt 4 Bytes, also insgesamt 8 Bytes.

Der von struct zval belegte Platz beträgt 8+4+1+1 = 14 Bytes. Tatsächlich erfordern Arrays, Strings und Objekte in zval zusätzliche Speicherstrukturen, und das Array ist eine HashTable:

HashTable-Struktur ist in Zend/zend_hash.h definiert.

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;
Nach dem Login kopieren

HashTable-Struktur erfordert 39 Bytes, und jedes Array-Element wird in Bucket-Struktur gespeichert:

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;
Nach dem Login kopieren

Bucket-Struktur Es erfordert 33 Bytes, und der Teil mit einer Schlüssellänge von mehr als vier Bytes wird an das Ende des Buckets angehängt, und der Elementwert ist wahrscheinlich eine zval-Struktur. Darüber hinaus wird jedem Array ein Array von Bucket-Zeigern zugewiesen, auf die arBuckets zeigt. Man kann zwar nicht sagen, dass jede Erhöhung eines Elements einen Zeiger erfordert, aber die Situation könnte schlimmer sein. Dadurch wird berechnet, dass ein Array-Element 54 Bytes belegt, was fast der obigen Schätzung entspricht.

Ein leeres Array belegt mindestens 14(zval) + 39(HashTable) + 33(arBuckets) = 86 Bytes. Als Variable sollte es eine Position in der Symboltabelle haben und ist auch ein Array-Element , also erfordert eine leere Array-Variable 118 Bytes zum Beschreiben und Speichern. Aus Platzgründen sind kleine Arrays im Durchschnitt teurer. Natürlich wird ein Skript nicht mit einer großen Anzahl kleiner Arrays gefüllt, und der Programmierkomfort kann bei geringeren Platzkosten erreicht werden. Wenn Sie jedoch ein Array als Container verwenden, sieht das anders aus. In praktischen Anwendungen stößt man häufig auf mehrdimensionale Arrays mit vielen Elementen. Beispielsweise verbraucht ein eindimensionales Array mit 10.000 Elementen ungefähr 540 KB Speicher, während ein zweidimensionales Array mit 10.000 Elementen tatsächlich 23 MB verbraucht, und kleine Arrays lohnen sich wirklich nicht.

Das obige ist der detaillierte Inhalt vonAnalyse der PHP-Array-Speichernutzung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie PHP-Arrays zum Generieren und Anzeigen von Diagrammen und statistischen Grafiken So verwenden Sie PHP-Arrays zum Generieren und Anzeigen von Diagrammen und statistischen Grafiken Jul 15, 2023 pm 12:24 PM

So verwenden Sie PHP-Arrays zum Generieren und Anzeigen von Diagrammen und statistischen Grafiken. PHP ist eine weit verbreitete serverseitige Skriptsprache mit leistungsstarken Datenverarbeitungs- und Grafikgenerierungsfunktionen. In der Webentwicklung müssen wir häufig Diagramme und statistische Diagramme von Daten anzeigen. Mithilfe von PHP-Arrays können wir diese Funktionen problemlos implementieren. In diesem Artikel wird die Verwendung von PHP-Arrays zum Generieren und Anzeigen von Diagrammen und statistischen Grafiken vorgestellt und relevante Codebeispiele bereitgestellt. Einführung der notwendigen Bibliotheksdateien und Stylesheets Bevor wir beginnen, müssen wir einige notwendige Bibliotheksdateien in die PHP-Datei einführen

So verwenden Sie PHP-Arrays zum Generieren dynamischer Diashows und Bildanzeigen So verwenden Sie PHP-Arrays zum Generieren dynamischer Diashows und Bildanzeigen Jul 15, 2023 pm 01:17 PM

So verwenden Sie PHP-Arrays zum Generieren dynamischer Diashows und Bildanzeigen. Diashows und Bildanzeigen sind gängige Funktionen im Webdesign und werden häufig in Szenarien wie Karussells und Galerieanzeigen verwendet. Als beliebte serverseitige Skriptsprache verfügt PHP über die Fähigkeit, Daten zu verarbeiten und dynamische HTML-Seiten zu generieren, und eignet sich sehr gut für die Erstellung dynamischer Diashows und Bildanzeigen. In diesem Artikel wird die Verwendung von PHP-Arrays zum Generieren dynamischer Diashows und Bildanzeigen vorgestellt und entsprechende Codebeispiele gegeben. Bilddaten vorbereiten Zuerst müssen wir einen Satz Bildpfaddaten vorbereiten

Welche Funktionen gibt es für die Mittelung von Arrays in PHP? Welche Funktionen gibt es für die Mittelung von Arrays in PHP? Jul 17, 2023 pm 04:03 PM

Zu den PHP-Array-Mittelungsfunktionen gehören: 1. array_sum(), mit dem die Summe aller Werte im Array berechnet wird. Um den Durchschnitt zu berechnen, können Sie alle Werte im Array addieren und dann durch dividieren die Anzahl der Array-Elemente; 2, array_reduce(), wird verwendet, um das Array zu iterieren und jeden Wert mit einem Anfangswert zu berechnen. 3. array_mean(), wird verwendet, um den Durchschnitt des Arrays zurückzugeben, zuerst die Summe des Arrays zu berechnen und Berechnen Sie die Anzahl der Array-Elemente und dividieren Sie dann die Summe durch die Anzahl der Array-Elemente, um den Durchschnitt zu erhalten.

So verwenden Sie PHP-Arrays zur Implementierung von Benutzeranmeldungs- und Berechtigungsverwaltungsfunktionen So verwenden Sie PHP-Arrays zur Implementierung von Benutzeranmeldungs- und Berechtigungsverwaltungsfunktionen Jul 15, 2023 pm 08:55 PM

Verwendung von PHP-Arrays zur Implementierung von Benutzeranmeldungs- und Berechtigungsverwaltungsfunktionen Bei der Entwicklung einer Website sind Benutzeranmeldung und Berechtigungsverwaltung eine der sehr wichtigen Funktionen. Durch die Benutzeranmeldung können wir Benutzer authentifizieren und die Sicherheit der Website schützen. Durch das Berechtigungsmanagement können die Bedienberechtigungen der Benutzer auf der Website gesteuert werden, um sicherzustellen, dass Benutzer nur auf die Funktionen zugreifen können, für die sie berechtigt sind. In diesem Artikel stellen wir vor, wie Sie PHP-Arrays verwenden, um Benutzeranmeldungs- und Berechtigungsverwaltungsfunktionen zu implementieren. Wir werden diesen Prozess anhand eines einfachen Beispiels demonstrieren. Zuerst müssen wir erstellen

Eine Untersuchung der Leistungsoptimierungstechniken für PHP-Arrays Eine Untersuchung der Leistungsoptimierungstechniken für PHP-Arrays Mar 13, 2024 pm 03:03 PM

PHP-Array ist eine sehr häufige Datenstruktur, die häufig während des Entwicklungsprozesses verwendet wird. Mit zunehmender Datenmenge kann die Array-Leistung jedoch zu einem Problem werden. In diesem Artikel werden einige Techniken zur Leistungsoptimierung für PHP-Arrays untersucht und spezifische Codebeispiele bereitgestellt. 1. Verwenden Sie geeignete Datenstrukturen. In PHP gibt es zusätzlich zu gewöhnlichen Arrays einige andere Datenstrukturen wie SplFixedArray, SplDoublyLinkedList usw., die in bestimmten Situationen möglicherweise eine bessere Leistung als gewöhnliche Arrays erbringen.

Was sind PHP-Array-Schlüssel-Wert-Paare? Was sind PHP-Array-Schlüssel-Wert-Paare? Aug 03, 2023 pm 02:20 PM

Das Schlüssel-Wert-Paar eines PHP-Arrays ist eine Datenstruktur, die aus einem Schlüssel und einem entsprechenden Wert besteht. Der Schlüssel ist die Kennung des Array-Elements und der Wert sind die mit dem Schlüssel verknüpften Daten. Es ermöglicht uns, Daten mithilfe von Schlüsseln als Bezeichner zu speichern und darauf zuzugreifen. Durch die Verwendung von Schlüssel-Wert-Paaren können wir Elemente im Array einfacher bedienen und verwalten, was die Programmentwicklung flexibler und effizienter macht.

So konvertieren Sie ein zweidimensionales PHP-Array in ein eindimensionales Array So konvertieren Sie ein zweidimensionales PHP-Array in ein eindimensionales Array Aug 03, 2023 am 11:14 AM

So konvertieren Sie ein PHP-Array von zwei Dimensionen in ein eindimensionales Array: 1. Verwenden Sie die Schleifendurchquerung, um das zweidimensionale Array zu durchlaufen und jedes Element zum eindimensionalen Array hinzuzufügen. 2. Verwenden Sie die Funktion „array_merge“, um mehrere zusammenzuführen Arrays in ein Array, übergeben Sie das zweidimensionale Array als Parameter an die Funktion „array_merge“, um es in ein eindimensionales Array umzuwandeln. 3. Mit der Funktion „array_reduce“ können alle Werte im Array verarbeitet werden über eine Rückruffunktion und gab schließlich ein Ergebnis zurück.

So bestimmen Sie, wie viele Arrays es in PHP gibt So bestimmen Sie, wie viele Arrays es in PHP gibt Aug 04, 2023 pm 05:40 PM

Es gibt mehrere Möglichkeiten, ein Array in PHP zu ermitteln: 1. Verwenden Sie die Funktion count(), die für alle Arten von Arrays geeignet ist. Es ist jedoch zu beachten, dass die Funktion count() 0 zurückgibt, wenn der übergebene Parameter kein Array ist. Verwenden Sie die Funktion sizeof(), die eher zur Aufrechterhaltung der Kompatibilität mit anderen Programmiersprachen verwendet wird Funktionen: Durch die Verwendung einer Schleife zum Durchlaufen des Arrays wird der Zähler bei jedem Durchlaufen um 1 erhöht und schließlich die Länge des Arrays ermittelt. Benutzerdefinierte Funktionen können entsprechend den tatsächlichen Anforderungen geändert und erweitert werden, wodurch sie flexibler werden.

See all articles