国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP數(shù)組占用內(nèi)存分析

Travis / 1267人閱讀

摘要:下面的做法會占用多大的內(nèi)存測試上面運(yùn)行輸出的結(jié)果如下可見數(shù)組占用的內(nèi)存遠(yuǎn)大于正常分配的內(nèi)容原理在中都使用類型來代表數(shù)字,沒有使用類型。最大成員數(shù)據(jù)空間是,指針占用字節(jié),占用字節(jié),共字節(jié)。參考數(shù)組占用內(nèi)存大小分析

下面的做法會占用多大的內(nèi)存?

list($appid,$openid) = ["testcontent","test"];
測試
$m0 = memory_get_usage();
$k = range(1,200000);
$m1 = memory_get_usage();
echo round(($m1-$m0)/pow(1024,2),4) ."MB
";
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
";

$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
";

上面運(yùn)行輸出的結(jié)果如下:

27.9404MB
51.3041MB
9.1553MB

可見數(shù)組占用的內(nèi)存遠(yuǎn)大于正常分配的內(nèi)容

原理

在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 indexing                4字節(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)存,而10k x 10 的二維數(shù)組理論上只需要 6M 左右的空間,但是按照 memory_get_usage 的結(jié)果則兩倍于此,[10k,5,2]的三維數(shù)組居然消耗了23M,小型數(shù)組果然是劃不來的。

參考

php數(shù)組占用內(nèi)存大小分析

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21542.html

相關(guān)文章

  • PHP中的pack和unpack函數(shù)

    摘要:鑒于文件讀寫網(wǎng)絡(luò)編程,或者說字節(jié)流處理的重要性,掌握這兩個函數(shù)是邁向高級編程的基礎(chǔ)。相比之下字節(jié)處理門庭冷落,相關(guān)函數(shù)寥寥無幾。上述是函數(shù)簡單的使用場景,接下來分別介紹和函數(shù)。如其名,函數(shù)的工作是將數(shù)據(jù)按照格式打包成字節(jié)數(shù)組。 轉(zhuǎn)載請注明文章出處:https://tlanyan.me/php-pack-a... PHP有兩個重要的冷門函數(shù):pack和unpack。在網(wǎng)絡(luò)編程,讀寫圖像...

    Lin_R 評論0 收藏0
  • PHP 性能分析工具xhprof安裝和使用

    摘要:由開源出來的一個性能監(jiān)控工具,占用資源很少,甚至能夠在生產(chǎn)環(huán)境中進(jìn)行部署。使用說明方法名稱。方法調(diào)用次數(shù)在同級方法總數(shù)調(diào)用次數(shù)中所占的百分比。單位微秒方法執(zhí)行花費(fèi)的時間百分比。單位字節(jié)峰值百分比。 xhprof由facebook開源出來的一個PHP性能監(jiān)控工具,占用資源很少,甚至能夠在生產(chǎn)環(huán)境中進(jìn)行部署。它可以結(jié)合graphviz使用,能夠以圖片的形式很直觀的展示代碼執(zhí)行耗時。下面主要...

    Youngs 評論0 收藏0
  • 【Redis5源碼學(xué)習(xí)】2019-04-15 簡單動態(tài)字符串SDS

    摘要:關(guān)于結(jié)構(gòu)體內(nèi)存對齊是什么,請參考源碼學(xué)習(xí)內(nèi)存管理筆記。這說明在當(dāng)前情況下,字符串結(jié)構(gòu)中的柔性數(shù)組的起始位置并不受是否加關(guān)鍵字而影響,是緊跟在結(jié)構(gòu)體后面的,所以節(jié)省內(nèi)存這個說法并不成立。 baiyan 全部視頻:https://segmentfault.com/a/11... 今天我們正式進(jìn)入redis5源碼的學(xué)習(xí)。redis是一個由C語言編寫、基于內(nèi)存、單進(jìn)程、可持久化的Key-Va...

    Vixb 評論0 收藏0
  • PHP垃圾回收機(jī)制

    摘要:在中算法,當(dāng)節(jié)點(diǎn)緩沖區(qū)滿了之后,垃圾分析算法就會啟動,并且會釋放掉發(fā)現(xiàn)的垃圾,從而回收內(nèi)存。在編程中程序員不需要手動處理內(nèi)存資源分配與釋放,意味著本身實(shí)現(xiàn)了垃圾回收處理機(jī)制。 PHP是一種弱類型的腳本語言,弱類型不表示PHP變量沒有類型的區(qū)別,PHP變量有8種原始類型:四種標(biāo)量類型: boolean(布爾值) integer(整型) float(浮點(diǎn)型) 兩種復(fù)合類型: arra...

    luck 評論0 收藏0
  • Java對象內(nèi)存占用分析

    摘要:對于不同的實(shí)現(xiàn),對象占用的內(nèi)存空間大小可能不盡相同,本文主要分析中的情況,實(shí)驗(yàn)環(huán)境為位系統(tǒng),使用進(jìn)行結(jié)論驗(yàn)證。內(nèi)存占用這里分析一個只有一組鍵值對的結(jié)構(gòu)如下首先分析本身的大小。 本文深入分析并驗(yàn)證了不同Java對象占用內(nèi)存空間大小的情況。對于不同的jvm實(shí)現(xiàn),Java對象占用的內(nèi)存空間大小可能不盡相同,本文主要分析HotSpot jvm中的情況,實(shí)驗(yàn)環(huán)境為64位window10系統(tǒng)、JD...

    JouyPub 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<