Rumah pembangunan bahagian belakang tutorial php PHP 数组占用内存分析

PHP 数组占用内存分析

Dec 09, 2019 pm 05:54 PM
tatasusunan php

下面的做法会占用多大的内存?

list($appid,$openid) = ["testcontent","test"];
Salin selepas log masuk

测试

$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";
Salin selepas log masuk

上面运行输出的结果如下:

27.9404MB
51.3041MB
9.1553MB
Salin selepas log masuk

可见数组占用的内存远大于正常分配的内容

原理

在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字节*/  
};
Salin selepas log masuk

PHP使用一种UNION结构来存储变量的值,即zvalue_value 是一个union,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;
Salin selepas log masuk

最大成员数据空间是struct str,指针占*val用4字节,INT占用4字节,共8字节。

struct zval占用的空间为8+4+1+1 = 14字节,其实呢,在zval中数组,字符串和对象还需要另外的存储结构,数组则是一个 HashTable:

HashTable结构体定义在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;
Salin selepas log masuk

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;
Salin selepas log masuk

Bucket 结构需要 33 个字节,键长超过四个字节的部分附加在 Bucket 后面,而元素值很可能是一个 zval 结构,另外每个数组会分配一个由 arBuckets 指向的 Bucket 指针数组, 虽然不能说每增加一个元素就需要一个指针,但是实际情况可能更糟。这么算来一个数组元素就会占用 54 个字节,与上面的估算几乎一样。

一个空数组至少会占用 14(zval) + 39(HashTable) + 33(arBuckets) = 86 个字节,作为一个变量应该在符号表中有个位置,也是一个数组元素,因此一个空数组变量需要 118 个字节来描述和存储。从空间的角度来看,小型数组平均代价较大,当然一个脚本中不会充斥数量很大的小型数组,可以以较小的空间代价来获取编程上的快捷。但如果将数组当作容器来使用就是另一番景象了,实际应用经常会遇到多维数组,而且元素居多。比如10k个元素的一维数组大概消耗540k内存,而10k x 10 的二维数组理论上只需要 6M 左右的空间,但是按照 memory_get_usage 的结果则两倍于此,[10k,5,2]的三维数组居然消耗了23M,小型数组果然是划不来的。

Atas ialah kandungan terperinci PHP 数组占用内存分析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan tatasusunan PHP untuk menjana dan memaparkan carta dan graf statistik Cara menggunakan tatasusunan PHP untuk menjana dan memaparkan carta dan graf statistik Jul 15, 2023 pm 12:24 PM

Cara menggunakan tatasusunan PHP untuk menjana dan memaparkan carta dan graf statistik PHP ialah bahasa skrip bahagian pelayan yang digunakan secara meluas dengan keupayaan pemprosesan data dan penjanaan grafik. Dalam pembangunan web, kita selalunya perlu memaparkan carta dan graf statistik data Melalui tatasusunan PHP, kita boleh melaksanakan fungsi ini dengan mudah. Artikel ini akan memperkenalkan cara menggunakan tatasusunan PHP untuk menjana dan memaparkan carta dan graf statistik, serta menyediakan contoh kod yang berkaitan. Memperkenalkan fail perpustakaan yang diperlukan dan helaian gaya Sebelum bermula, kita perlu memperkenalkan beberapa fail perpustakaan yang diperlukan ke dalam fail PHP

Cara menggunakan tatasusunan PHP untuk menjana tayangan slaid dinamik dan paparan imej Cara menggunakan tatasusunan PHP untuk menjana tayangan slaid dinamik dan paparan imej Jul 15, 2023 pm 01:17 PM

Cara menggunakan tatasusunan PHP untuk menjana tayangan slaid dinamik dan paparan gambar Tayangan slaid dan paparan gambar adalah fungsi biasa dalam reka bentuk web dan sering digunakan dalam senario seperti karusel dan paparan galeri. Sebagai bahasa skrip sebelah pelayan yang popular, PHP mempunyai keupayaan untuk memproses data dan menjana halaman HTML dinamik, dan sangat sesuai untuk menjana tayangan slaid dinamik dan paparan gambar. Artikel ini akan memperkenalkan cara menggunakan tatasusunan PHP untuk menjana tayangan slaid dinamik dan paparan gambar, serta memberikan contoh kod yang sepadan. Sediakan data imej Mula-mula, kita perlu menyediakan satu set data laluan imej

Cara menggunakan tatasusunan PHP untuk melaksanakan log masuk pengguna dan fungsi pengurusan kebenaran Cara menggunakan tatasusunan PHP untuk melaksanakan log masuk pengguna dan fungsi pengurusan kebenaran Jul 15, 2023 pm 08:55 PM

Cara menggunakan tatasusunan PHP untuk melaksanakan log masuk pengguna dan fungsi pengurusan kebenaran Apabila membangunkan laman web, log masuk pengguna dan pengurusan kebenaran adalah salah satu fungsi yang sangat penting. Log masuk pengguna membolehkan kami mengesahkan pengguna dan melindungi keselamatan tapak web. Pengurusan kebenaran boleh mengawal kebenaran pengendalian pengguna di tapak web untuk memastikan pengguna hanya boleh mengakses fungsi yang mereka dibenarkan. Dalam artikel ini, kami akan memperkenalkan cara menggunakan tatasusunan PHP untuk melaksanakan log masuk pengguna dan fungsi pengurusan kebenaran. Kami akan menggunakan contoh mudah untuk menunjukkan proses ini. Mula-mula kita perlu mencipta

Apakah fungsi untuk purata tatasusunan dalam php? Apakah fungsi untuk purata tatasusunan dalam php? Jul 17, 2023 pm 04:03 PM

Fungsi purata tatasusunan PHP termasuk: 1. array_sum(), yang digunakan untuk mengira jumlah semua nilai dalam tatasusunan Untuk mengira purata, anda boleh menambah semua nilai dalam tatasusunan dan kemudian membahagi dengan bilangan elemen tatasusunan; 2, array_reduce(), digunakan untuk mengulang tatasusunan dan mengira setiap nilai dengan nilai awal 3. array_mean(), digunakan untuk mengembalikan purata tatasusunan, mula-mula mengira jumlah tatasusunan, dan hitung bilangan elemen tatasusunan, kemudian Jumlahnya dibahagikan dengan bilangan elemen tatasusunan untuk mendapatkan purata.

Penerokaan teknik pengoptimuman prestasi untuk tatasusunan PHP Penerokaan teknik pengoptimuman prestasi untuk tatasusunan PHP Mar 13, 2024 pm 03:03 PM

Tatasusunan PHP ialah struktur data yang sangat biasa yang sering digunakan semasa proses pembangunan. Walau bagaimanapun, apabila jumlah data meningkat, prestasi tatasusunan boleh menjadi isu. Artikel ini akan meneroka beberapa teknik pengoptimuman prestasi untuk tatasusunan PHP dan memberikan contoh kod khusus. 1. Gunakan struktur data yang sesuai Dalam PHP, sebagai tambahan kepada tatasusunan biasa, terdapat beberapa struktur data lain, seperti SplFixedArray, SplDoublyLinkedList, dll., yang mungkin berprestasi lebih baik daripada tatasusunan biasa dalam situasi tertentu.

Apakah pasangan nilai kunci tatasusunan php? Apakah pasangan nilai kunci tatasusunan php? Aug 03, 2023 pm 02:20 PM

Pasangan nilai kunci tatasusunan PHP ialah struktur data yang terdiri daripada kunci dan nilai yang sepadan Kuncinya ialah pengecam elemen tatasusunan, dan nilainya ialah data yang dikaitkan dengan kunci. Ia membolehkan kami menyimpan dan mengakses data menggunakan kunci sebagai pengecam Dengan menggunakan pasangan nilai kunci, kami boleh mengendalikan dan mengurus elemen dalam tatasusunan dengan lebih mudah, menjadikan pembangunan program lebih fleksibel dan cekap.

Bagaimana untuk menukar tatasusunan php dua dimensi kepada tatasusunan satu dimensi Bagaimana untuk menukar tatasusunan php dua dimensi kepada tatasusunan satu dimensi Aug 03, 2023 am 11:14 AM

Cara menukar tatasusunan php daripada dua dimensi kepada tatasusunan satu dimensi: 1. Gunakan traversal gelung untuk melintasi tatasusunan dua dimensi dan tambah setiap elemen pada tatasusunan satu dimensi 2. Gunakan fungsi "array_merge" untuk menggabungkan berbilang; tatasusunan ke dalam Tatasusunan, hantar tatasusunan dua dimensi sebagai parameter kepada fungsi "array_merge" untuk menukarnya menjadi tatasusunan satu dimensi 3. Menggunakan fungsi "array_reduce", semua nilai dalam tatasusunan boleh diproses melalui fungsi panggil balik, dan akhirnya mengembalikan hasil.

Bagaimana untuk menentukan berapa banyak tatasusunan yang terdapat dalam php Bagaimana untuk menentukan berapa banyak tatasusunan yang terdapat dalam php Aug 04, 2023 pm 05:40 PM

Terdapat beberapa cara untuk menentukan tatasusunan dalam PHP: 1. Gunakan fungsi count(), yang sesuai untuk semua jenis tatasusunan. Walau bagaimanapun, perlu diambil perhatian bahawa jika parameter yang dimasukkan bukan tatasusunan, fungsi count() akan mengembalikan 0. Gunakan fungsi sizeof(), yang lebih digunakan untuk mengekalkan keserasian dengan bahasa pengaturcaraan lain; fungsi, Dengan menggunakan gelung untuk melintasi tatasusunan, setiap kali ia dilalui, pembilang ditambah dengan 1, dan akhirnya panjang tatasusunan diperoleh. Fungsi tersuai boleh diubah suai dan dikembangkan mengikut keperluan sebenar, menjadikannya lebih fleksibel.

See all articles