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

您的位置:首頁技術(shù)文章
文章詳情頁

PHP數(shù)組實(shí)際占用內(nèi)存大小原理解析

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

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

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

<?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

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

首先看一下32位機(jī)C語言各種類型占用的字節(jié):

#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類型來代表數(shù)字,沒有使用int類型

大家都明白PHP是一種弱類型的語言,它不會去區(qū)分變量的類型,沒有int float char *之類的概念。

我們看看php在zend里面存儲的變量,PHP中每個變量都有對應(yīng)的 zval, Zval結(jié)構(gòu)體定義在Zend/zend.h里面,其結(jié)構(gòu):

typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* The value 1 12字節(jié)(32位機(jī)是12,64位機(jī)需要8+4+4=16) */ zend_uint refcount__gc; /* The number of references to this value (for GC) 4字節(jié) */ zend_uchar type; /* The active type 1字節(jié)*/ zend_uchar is_ref__gc; /* Whether this value is a reference (&) 1字節(jié)*/ };

PHP使用一種UNION結(jié)構(gòu)來存儲變量的值,即zvalue_value 是一個union,UNION變量所占用的內(nèi)存是由最大

成員數(shù)據(jù)空間決定。

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;

最大成員數(shù)據(jù)空間是struct str,指針占*val用4字節(jié),INT占用4字節(jié),共8字節(jié)。

struct zval占用的空間為8+4+1+1 = 14字節(jié),

其實(shí)呢,在zval中數(shù)組,字符串和對象還需要另外的存儲結(jié)構(gòu),數(shù)組則是一個 HashTable:

HashTable結(jié)構(gòu)體定義在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 結(jié)構(gòu)需要 39 個字節(jié),每個數(shù)組元素存儲在 Bucket 結(jié)構(gòu)中:

typedef struct bucket { ulong h; /* Used for numeric indexing4字節(jié) */ uint nKeyLength; /* The length of the key (for string keys) 4字節(jié) */ void *pData; /* 4字節(jié)*/ void *pDataPtr; /* 4字節(jié)*/ struct bucket *pListNext; /* PHP arrays are ordered. This gives the next element in that order4字節(jié)*/ struct bucket *pListLast; /* and this gives the previous element 4字節(jié) */ struct bucket *pNext; /* The next element in this (doubly) linked list 4字節(jié)*/ struct bucket *pLast; /* The previous element in this (doubly) linked list 4字節(jié)*/ char arKey[1]; /* Must be last element 1字節(jié)*/ } Bucket;

Bucket 結(jié)構(gòu)需要 33 個字節(jié),鍵長超過四個字節(jié)的部分附加在 Bucket 后面,而元素值很可能是一個 zval 結(jié)構(gòu),另外每個數(shù)組會分配一個由 arBuckets 指向的 Bucket 指針數(shù)組, 雖然不能說每增加一個元素就需要一個指針,但是實(shí)際情況可能更糟。這么算來一個數(shù)組元素就會占用 54 個字節(jié),與上面的估算幾乎一樣。

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品裸体| 精品理论电影在线| 国产91在线播放精品| 不卡中文一二三区| 欧美三级精品| 日本激情一区| 国产一区二区三区黄网站| 日本成人在线一区| 欧美专区18| 黄色亚洲免费| 日韩高清中文字幕一区| 亚洲欧美日本国产| 丝袜国产日韩另类美女| 久久九九电影| 午夜在线一区二区| 天堂成人免费av电影一区| 久久高清免费| 天堂√8在线中文| 国产精品久久久久av蜜臀| 日本亚洲三级在线| 久久精品xxxxx| 欧美伊人久久| 国产免费av国片精品草莓男男| 亚洲视频电影在线| 亚洲久久视频| 国产欧美日韩免费观看| 欧美日本不卡| 免费一级欧美片在线观看网站| 国产日韩亚洲| 久久精品xxxxx| 国产亚洲观看| 国产精品久久久久久久久久白浆| 国产欧美日韩在线观看视频| 日本欧美大码aⅴ在线播放| 日韩av网站免费在线| 日韩精品免费观看视频| 国产精品片aa在线观看| 色网在线免费观看| 亚洲欧美日韩专区| 国产欧美日韩免费观看| 国产麻豆久久| 日韩精品中文字幕一区二区| 国产在视频一区二区三区吞精| 久久精品中文| 日韩极品在线观看| 日韩欧美精品| 免费黄网站欧美| 久久久91麻豆精品国产一区| 四虎国产精品免费观看| 美女久久一区| 久久精品国产一区二区| 香蕉精品视频在线观看| 国产欧美日韩影院| 国产一区久久| 国产欧美自拍一区| 成人羞羞在线观看网站| 日本成人在线网站| 91精品国产乱码久久久久久久| 美国三级日本三级久久99 | 欧美亚洲人成在线| 色一区二区三区四区| 男女性色大片免费观看一区二区 | 国产伦一区二区三区| 99热精品久久| 国产极品一区| 亚洲欧美日本视频在线观看| 久久字幕精品一区| 午夜一区在线| xxxxx性欧美特大| 亚洲人成亚洲精品| 中文字幕系列一区| 国产精品欧美一区二区三区不卡| 欧美一级精品| 国产福利亚洲| 中文视频一区| 欧美丝袜一区| 精品视频一区二区三区在线观看| 久久av一区| 亚洲精品一区三区三区在线观看| 国产亚洲高清在线观看| 三级在线观看一区二区| 日韩精品dvd| 国产精品传媒麻豆hd| 日韩影院精彩在线| 中文字幕在线高清| 国产精品最新自拍| 日韩中文字幕一区二区三区| 成人午夜网址| 欧美在线看片| 中文精品视频| 香蕉久久99| 97人人精品| 久久av国产紧身裤| 欧美专区一区| 亚洲三级视频| 欧美专区一区二区三区| 99久久亚洲精品蜜臀| 国产不卡av一区二区| 国产精品第一国产精品| 在线一区二区三区视频| 欧美一区二区性| 中文字幕在线视频网站| 国产精品一区二区美女视频免费看| 亚洲在线国产日韩欧美| 久久激情网站| 青青青免费在线视频| 国产中文字幕一区二区三区| 久久av资源| 国产伦精品一区二区三区视频| 伊人久久亚洲| 伊人www22综合色| 亚洲涩涩av| 亚洲+小说+欧美+激情+另类| 红桃视频欧美| 欧美aa在线观看| 精品亚洲自拍| 国产精品theporn| 欧美在线看片| 欧美日韩1区2区3区| 欧美亚洲一区二区三区| 欧美天堂一区二区| 国产精品一在线观看| 国产亚洲一卡2卡3卡4卡新区| 中文字幕乱码亚洲无线精品一区| 日韩欧美久久| 精品网站999| 国产精品久久久久77777丨| 视频一区二区三区在线| 天堂网av成人| 久久精品五月| 国产一区日韩| 国产精品久久久久久久久久10秀| 久久久国产精品网站| 国产精品2023| 国产精品99视频| 91精品国产自产在线观看永久∴| 欧美aa国产视频| 久久99伊人| 日韩精品一级| 老司机精品视频在线播放| 国产一区二区亚洲| 青青青免费在线视频| 久久精品亚洲人成影院| 91精品99| 视频一区二区三区中文字幕| 亚洲精品系列| 国产视频一区二| 欧美91在线| 天堂av在线| 在线综合欧美| 欧美一区91| 91亚洲国产成人久久精品| 色爱av综合网| 免费欧美在线视频| 国产欧美大片| 日韩av免费| 国产亚洲精品自拍| 91福利精品在线观看| 成人国产精选| 国产一区日韩欧美| 亚洲综合图色| 国产精品极品在线观看| 在线一区av| 视频一区视频二区中文字幕| 国产精品视频一区二区三区| 亚洲天堂免费电影| 蜜臀久久99精品久久久久宅男| 国产欧美日韩综合一区在线播放| 亚洲黄色免费看| 欧美综合国产| 毛片不卡一区二区| 亚洲婷婷免费| 日韩精品1区2区3区| 91亚洲自偷观看高清| 欧美日韩国产免费观看 | 日韩成人亚洲| 午夜电影一区| 国产美女高潮在线| 首页欧美精品中文字幕| 欧美激情亚洲| 激情五月综合网| 国产视频一区二| 久久免费大视频| 久久精品97| 亚洲特级毛片| 欧美激情一区| 六月婷婷一区| 美女视频免费精品| 狠狠爱成人网| 久久一区欧美| 日韩精品一二三区| 精品国产精品久久一区免费式 | 在线视频日韩| 久久久精品国产**网站| 亚洲精品123区| 福利一区二区免费视频 | 欧美激情一区| 亚州av乱码久久精品蜜桃| 国产激情一区| 手机精品视频在线观看|