国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
一個PHP數(shù)組應該有多大的分析
PHP在數(shù)組處理上非常低效,尤其是內(nèi)存占用較多,常常使得httpd進程消耗太多資源。
 
雖然通常在PHP中進行大量數(shù)組運算從一定程度上反應程序設計上可能存在問題,但是粗略的估計數(shù)組占用的內(nèi)存是很有必要的。
首先感覺一下1000個元素的整數(shù)數(shù)組占有的內(nèi)存:
 

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 個元素的整數(shù)數(shù)組需要占用 100k 內(nèi)存,平均每個元素占用 100 個字節(jié)。而純 C 中整體只需要 4k。memory_get_usage() 返回的結果并不是全是被數(shù)組占用了,還要包括一些 PHP 運行本身分配的一些結構,可能用內(nèi)置函數(shù)生成的數(shù)組更接近真實的空間:

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

 

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
深入理解PHP之數(shù)組(遍歷順序) | 風雪之隅
1.深入PHP變量存儲結構
[php擴展開發(fā)和嵌入式]-在數(shù)組和哈希表上工作
PHP內(nèi)核探索:PHP中的哈希表
php7和PHP5對比的新特性和性能優(yōu)化
PHP底層的運行機制與原理
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服