天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

一個PHP數組應該有多大的分析

雖然通常在php中進行大量數組運算從一定程度上反應程序設計上可能存在問題,但是粗略的估計數組占用的內存是很有必要的。
首先感覺一下1000個元素的整數數組占有的內存:
復制代碼 代碼如下:
echo memory_get_usage() . “/n”;
$a = Array();
for ($i=0; $i<1000; $i++) {
$a[$i] = $i + $i;
}
echo memory_get_usage() . “/n”;
for ($i=1000; $i<2000; $i++) {
$a[$i] = $i + $i;
}
echo memory_get_usage() . “/n”;

輸出是:
58176
162956
267088
大 約可以知道 1000 個元素的整數數組需要占用 100k 內存,平均每個元素占用 100 個字節。而純 C 中整體只需要 4k。memory_get_usage() 返回的結果并不是全是被數組占用了,還要包括一些 php 運行本身分配的一些結構,可能用內置函數生成的數組更接近真實的空間:
復制代碼 代碼如下:
echo “init mem: ” . memory_get_usage() . “/n”;
$a = array_fill(0, 10000, 1);
echo “10k elements: ” . memory_get_usage() . “, system: ” . memory_get_usage(true) . “/n”;
$b = array_fill(0, 10000, 1);
echo “10k elements: ” . memory_get_usage() . “, system: ” . memory_get_usage(true) . “/n”;

得到:
init mem: 58468
10k elements: 724696, system: 786432
10k elements: 1390464, system: 1572864
從這個結果來看似乎一個數組元素大約只占用了 60 個左右的字節。再看看數組的C結構,php 中的數組變量,首先需要一個 zval 結構:
復制代碼 代碼如下:
struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
};

zvalue_value 是一個union:
復制代碼 代碼如下:
typedef union _zvalue_value {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} zvalue_value;

通常 zval 結構需要 8+6=14 個字節,php中每個變量都有對應的 zval,但是數組,字符串和對象還需要另外的存儲結構,而數組則是一個 HashTable :
復制代碼 代碼如下:
typedef struct _hashtable {
uint nTableSize;
uint nTableMask;
uint nNumOfElements;
ulong nNextFreeElement;
Bucket *pInternalPointer;
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
dtor_func_t pDestructor;
zend_bool persistent;
unsigned char nApplyCount;
zend_bool bApplyProtection;
} HashTable;

HashTable 結構需要 40 個字節,每個數組元素存儲在 Bucket 結構中:
復制代碼 代碼如下:
typedef struct bucket {
ulong h;
uint nKeyLength;
void *pData;
void *pDataPtr;
struct bucket *pListNext;
struct bucket *pListLast;
struct bucket *pNext;
struct bucket *pLast;
char arKey[1];
} Bucket;

Bucket 結構需要 36 個字節,鍵長超過四個字節的部分附加在 Bucket 后面,而元素值很可能是一個 zval 結構,另外每個數組會分配一個由 arBuckets 指向的 Bucket 指針數組, 雖然不能說每增加一個元素就需要一個指針,但是實際情況可能更糟。這么算來一個數組元素就會占用 54 個字節,與上面的估算相差不遠。
一個空數組至少會占用 14(zval) + 40(HashTable) + 32(arBuckets) = 86 個字節,作為一個變量應該在符號表中有個位置,也是一個數組元素,因此一個空數組變量需要 118 個字節來描述和存儲。從空間的角度來看,小型數組平均代價較大,當然一個腳本中不會充斥數量很大的小型數組,可以以較小的空間代價來獲取編程上的快捷。
但如果將數組當作容器來使用就是另一番景象了,實際應用經常會遇到多維數組,而且元素居多。比如10k個元素的一維數組大概消耗540k內存,而10k x 10 的二維數組理論上只需要 6M 左右的空間,但是按照 memory_get_usage 的結果則兩倍于此,[10k,5,2]的三維數組居然消耗了23M,小型數組果然是劃不來的。

php技術一個PHP數組應該有多大的分析,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 不卡人妻无码AV中文系列APP | 精品视频免费在线观看 | 精品人妻无码一区二区三区蜜桃臀 | 性夜影院爽黄A爽免费动漫 性夜夜春夜夜爽AA片A | 欧美又粗又大AAAA片 | 嫩草电影网嫩草影院 | 精品熟女少妇AV久久免费A片 | xfplay 无码专区 亚洲 | 驯服有夫之妇HD中字日本 | 一二三四在线视频社区8 | 国产精品69人妻无码久久久 | 成人国内精品久久久久影院 | 午夜性伦鲁啊鲁免费视频 | 日本熟妇乱人伦A片精品软件 | 嫩草影院未满十八岁禁止入内 | wwwxx日本| 黑人巨茎大战白人女40CMO | 久9视频这里只有精品123 | 色琪琪丁香婷婷综合久久 | 色欲久久99精品久久久久久AV | 国产AV精品一区二区三区漫画 | 高清国产激情视频在线观看 | 国产精品久久免费视频 | 老师给美女同学开嫩苞 | av视频在线免播放观看 | 亚洲精品中文字幕在线 | 解开白丝老师的短裙猛烈进入 | 国产色青青视频在线观看 | 国产露脸无码A区久久蘑菇 国产露脸无码A区久久 | 日日a.v拍夜夜添久久免费 | 欧美狂野乱码一二三四区 | 精品AV亚洲乱码一区二区 | 亚洲三级视频在线观看 | 免费无码一区二区三区蜜桃大 | 久久视热频国产这里只有精品23 | 国产交换丝雨巅峰 | 欲奴第一季在线观看全集 | 国内视频在线精品一区 | 99精品欧美一区二区三区美图 | 亚洲第一免费播放区 | 黑人巨茎vide抽搐 |