日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP數組實際占用內存大小原理解析

瀏覽:213日期:2022-09-08 14:34:37

一般來說,PHP數組的內存利用率只有 1/10, 也就是說,一個在C語言里面100M 內存的數組,在PHP里面就要1G。下面我們可以粗略的估算PHP數組占用內存的大小,首先我們測試1000個元素的整數占用的內存:

<?php echo memory_get_usage() , ’<br>’; $start = memory_get_usage(); $a = Array(); for ($i=0; $i<1000; $i++) { $a[$i] = $i + $i; } $mid = memory_get_usage(); echo memory_get_usage() , ’<br>’; for ($i=1000; $i<2000; $i++) { $a[$i] = $i + $i; } $end = memory_get_usage(); echo memory_get_usage() , ’<br>’; echo ’argv:’, ($mid - $start)/1000 ,’bytes’ , ’<br>’; echo ’argv:’,($end - $mid)/1000 ,’bytes’ , ’<br>’;

輸出是:

353352437848522024argv:84.416bytesargv:84.176bytes

大概了解1000 個元素的整數數組需要占用 82k 內存,平均每個元素占用 84 個字節。而純 C 中整體只需要 4k(一個整型占用4byte * 1000 )。memory_get_usage() 返回的結果并不是全是被數組占用了,還要包括一些 PHP 運行本身分配的一些結構,可能用內置函數生成的數組更接近真實的空間:

<?php $start = memory_get_usage(); $a = array_fill(0, 10000, 1); $mid = memory_get_usage(); //10k elements array; echo ’argv:’, ($mid - $start )/10000,’byte’ , ’<br>’; $b = array_fill(0, 10000, 1); $end = memory_get_usage(); //10k elements array; echo ’argv:’, ($end - $mid)/10000 ,’byte’ , ’<br>’;

得到:

argv:54.5792byteargv:54.5784byte

從這個結果來看似乎一個數組元素大約占用了54個字節左右。

首先看一下32位機C語言各種類型占用的字節:

#include 'stdafx.h' //#include <stdio.h> int main() { printf('int:%dnlong:%dndouble:%dnchar*:%dnsize_t:%dn', sizeof(int), sizeof(long), sizeof(double), sizeof(char *), sizeof(size_t)); return 0; }

int:4long:4double:8har*:4size_t:4

在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,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字節。

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;

HashTable 結構需要 39 個字節,每個數組元素存儲在 Bucket 結構中:

typedef struct bucket { ulong h; /* Used for numeric indexing4字節 */ 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 后面,而元素值很可能是一個 zval 結構,另外每個數組會分配一個由 arBuckets 指向的 Bucket 指針數組, 雖然不能說每增加一個元素就需要一個指針,但是實際情況可能更糟。這么算來一個數組元素就會占用 54 個字節,與上面的估算幾乎一樣。

一個空數組至少會占用 14(zval) + 39(HashTable) + 33(arBuckets) = 86 個字節,作為一個變量應該在符號表中有個位置,也是一個數組元素,因此一個空數組變量需要 118 個字節來描述和存儲。從空間的角度來看,小型數組平均代價較大,當然一個腳本中不會充斥數量很大的小型數組,可以以較小的空間代價來獲取編程上的快捷。但如果將數組當作容器來使用就是另一番景象了,實際應用經常會遇到多維數組,而且元素居多。比如10k個元素的一維數組大概消耗540k內存,而10kx 10 的二維數組理論上只需要 6M 左右的空間,但是按照 memory_get_usage 的結果則兩倍于此,[10k,5,2]的三維數組居然消耗了23M,小型數組果然是劃不來的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区有码| 麻豆视频观看网址久久| 天堂av在线一区| 国产精品观看| 亚洲在线成人| av资源亚洲| 久久国内精品自在自线400部| 自拍日韩欧美| 麻豆中文一区二区| 午夜久久av | 91亚洲无吗| 国产不卡av一区二区| 青草av.久久免费一区| 中文字幕一区二区三区在线视频| 国产亚洲一级| 亚洲免费影院| 蜜臀久久99精品久久久久宅男 | 另类亚洲自拍| 欧美日韩国产欧| 久久要要av| 国产一区欧美| 日韩精品一二三四| 99在线观看免费视频精品观看| 亚洲一区观看| 欧美精品三级在线| 成人台湾亚洲精品一区二区| 日韩精品久久久久久久电影99爱| 在线日韩av| 美女精品网站| 欧美日本精品| 九九99久久精品在免费线bt| 日韩一区二区三区免费播放| 在线国产一区二区| 亚洲乱码一区| 日本aⅴ亚洲精品中文乱码| 国产精品一区二区三区四区在线观看| 欧美成人aaa| 秋霞影院一区二区三区| 欧美福利一区| 综合视频一区| 久久精品国产在热久久| 午夜精品免费| 国产欧美日韩视频在线| 婷婷综合六月| 中文字幕亚洲精品乱码| 精品免费视频| 午夜欧美视频| 97久久亚洲| 日本蜜桃在线观看视频| 亚洲作爱视频| 国产日产精品_国产精品毛片 | 麻豆成全视频免费观看在线看| 欧美久久精品一级c片| 日韩有码av| 成人午夜在线| 亚洲精品成人| 国产欧美日韩在线一区二区| 日韩免费福利视频| 在线国产日韩| 成人亚洲欧美| 亚洲影院天堂中文av色| 国产精品videosex极品| 欧美成人午夜| 国产精品久一| 亚洲美洲欧洲综合国产一区 | 7m精品国产导航在线| 成人亚洲一区二区| 视频一区二区三区入口| 国产精品s色| 黄色成人精品网站| 久久久久久亚洲精品美女| 亚洲国产日韩欧美在线| 国产精选一区| 日韩一区二区免费看| 精品视频在线一区二区在线| 久久成人亚洲| а√天堂8资源中文在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 136国产福利精品导航网址| 91嫩草精品| 尤物网精品视频| 精品久久美女| 亚洲精品一二三**| 激情婷婷综合| 日本久久黄色| 欧美午夜三级| 亚洲狼人精品一区二区三区| 成人久久一区| 精品久久久久久久| 欧美三区不卡| 日韩一区精品字幕| 欧美福利一区| 黄毛片在线观看| 欧美亚洲三区| 首页国产欧美久久| 色吊丝一区二区| 久久精品一区二区国产| 无码日韩精品一区二区免费| 欧美成人日韩| 亚洲涩涩在线| 精品久久电影| 国产精品99久久免费| 日韩精品视频在线看| 欧美另类专区| 久久高清免费| av免费不卡国产观看| 嫩草伊人久久精品少妇av杨幂| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产主播一区| 欧美韩日一区| 免费一级欧美片在线观看网站 | 亚洲精品美女| 亚洲激情av| 亚洲精品a级片| 亚洲www啪成人一区二区| 久久一区欧美| 精品99在线| 久久超级碰碰| 久久99影视| 国产日产精品_国产精品毛片| 日本视频一区二区| 日韩精品视频在线看| 亚洲另类黄色| 日韩欧美中文字幕电影| 亚洲精品第一| 日韩av电影一区| 91成人小视频| 国产精品大片免费观看| 欧美国产中文高清| 国产精品日本一区二区不卡视频| 亚洲欧美网站在线观看| 在线看片日韩| 欧美日韩中文| 欧美日一区二区在线观看| 国产精品亚洲欧美一级在线| 国产日韩一区二区三区在线| 国产精品欧美一区二区三区不卡| 国产精品白丝久久av网站| 牛牛精品成人免费视频| 成人午夜毛片| 群体交乱之放荡娇妻一区二区| 欧美日韩在线二区| 国产亚洲欧洲| 日本免费在线视频不卡一不卡二| 日韩午夜视频在线| 日本h片久久| 国产精品视频3p| 黄色网一区二区| 色88888久久久久久影院| 一本一道久久a久久精品蜜桃| 免费久久99精品国产| 日韩欧美精品一区二区综合视频| 欧美日本精品| 97人人精品| 亚洲欧洲日本mm| 日韩一区精品| 国产在线视频欧美一区| 久久国产欧美| 亚洲一区二区免费看| 日韩在线卡一卡二| 日韩高清不卡在线| 国产一区二区三区四区五区 | 亚洲最大av| 国产激情一区| 免费成人网www| 天堂俺去俺来也www久久婷婷| 国产日韩高清一区二区三区在线| 欧美激情另类| 日韩中文字幕区一区有砖一区| 欧美日韩一区二区国产| av资源中文在线| 亚洲激情中文| 91嫩草精品| 日韩三区在线| 亚欧洲精品视频在线观看| 黄色欧美在线| 日韩影院免费视频| 精品国产aⅴ| 亚洲二区三区不卡| 欧美日韩一区二区三区不卡视频| 伊人久久视频| 中文字幕一区二区av| 成午夜精品一区二区三区软件| 午夜在线视频一区二区区别| 久久不卡国产精品一区二区| 国内激情久久| 国产精品一线| 婷婷成人在线| 国产精品毛片久久久| 午夜av一区| 国产激情久久| 国产精品毛片一区二区三区| 精品一区二区三区中文字幕在线| 免费国产自久久久久三四区久久 | 九九久久婷婷| 亚洲视频二区| 韩国三级一区| 综合一区在线| 精品视频一二| 只有精品亚洲|