久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP數(shù)組內(nèi)存利用率低和弱類型詳細(xì)解讀

本篇文章主要介紹了PHP數(shù)組內(nèi)存利用率低和弱類型詳細(xì)解讀,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

這兩天任務(wù)提前完成,可以喘口氣沉淀一下,深入學(xué)習(xí)學(xué)習(xí)PHP。其實本來是想了解一下PHP性能優(yōu)化相關(guān)的東西,但被網(wǎng)上的一句“PHP數(shù)組內(nèi)存利用率低,C語言100MB的內(nèi)存數(shù)組,PHP里需要1G”驚到了。PHP真的這么耗內(nèi)存么?于是借此機會了解了PHP的數(shù)據(jù)類型實現(xiàn)方式。

先來做個測試:

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

所得結(jié)果:

    353352
    437848
    argv:84.416bytes

1000個元素的整數(shù)數(shù)組耗費內(nèi)存(437848 - 353352)字節(jié),約合82KB,也就是說每個元素所占內(nèi)存84字節(jié)。在C語言中,一個int占位是4字節(jié),整體相差了20倍。

但是網(wǎng)上又說memery_get_usage()返回的結(jié)果不全是數(shù)組占用,還包括PHP本身的一些結(jié)構(gòu),因此,換種方式,采用PHP內(nèi)置函數(shù)生成數(shù)組試試:

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

 輸出為:

argv:54.5792byte

比剛才略好,但也54字節(jié),確實差了10倍左右。

究其原因,還得從PHP的底層實現(xiàn)說起。PHP是一種弱類型的語言,不分int,double,string之類的,統(tǒng)一一個'$'就能解決所有問題。PHP底層由C語言實現(xiàn),每個變量都對應(yīng)一個zval結(jié)構(gòu),其詳細(xì)定義為:

typedef struct _zval_struct zval; 
struct _zval_struct { 
  /* Variable information */ 
  zvalue_value value;   /* The value 1 12字節(jié)(32位機是12,64位機需要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)來存儲變量的值,zval中zvalue_value類型的value變量即為一個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; 

union類型占用內(nèi)存的大小有其最大的成員所占的數(shù)據(jù)空間決定。在zvalue_value中,str結(jié)構(gòu)體的int占4字節(jié),char指針占4字節(jié),故整個zvalue_value所占內(nèi)存為8字節(jié)。

zval的大小即為8 + 4 + 1 + 1 = 14字節(jié)。

注意到zvalue_value中還有一個HashTable是做什么的?zval中,數(shù)組、字符串和對象還需要另外的存儲結(jié)構(gòu),數(shù)組的存儲結(jié)構(gòu)即為HashTable。

HashTable定義給出:

typedef struct _hashtable { 
   uint nTableSize; //表長度,并非元素個數(shù) 
   uint nTableMask;//表的掩碼,始終等于nTableSize-1 
   uint nNumOfElements;//存儲的元素個數(shù) 
   ulong nNextFreeElement;//指向下一個空的元素位置 
   Bucket *pInternalPointer;//foreach循環(huán)時,用來記錄當(dāng)前遍歷到的元素位置 
   Bucket *pListHead; 
   Bucket *pListTail; 
   Bucket **arBuckets;//存儲的元素數(shù)組 
   dtor_func_t pDestructor;//析構(gòu)函數(shù) 
   zend_bool persistent;//是否持久保存。從這可以發(fā)現(xiàn),PHP數(shù)組是可以實現(xiàn)持久保存在內(nèi)存中的,而無需每次請求都重新加載。 
   unsigned char nApplyCount; 
   zend_bool bApplyProtection; 
} HashTable; 

除了幾個記錄table大小,所含元素數(shù)量的屬性變量外,Bucket被多次使用到,Bucket是如何定義的:

typedef struct bucket { 
   ulong h; //數(shù)組索引 
   uint nKeyLength; //字符串索引的長度 
   void *pData; //實際數(shù)據(jù)的存儲地址 
   void *pDataPtr; //引入的數(shù)據(jù)存儲地址 
   struct bucket *pListNext; 
   struct bucket *pListLast; 
   struct bucket *pNext; //雙向鏈表的下一個元素的地址 
   struct bucket *pLast;//雙向鏈表的下一個元素地址 
   char arKey[1]; /* Must be last element */ 
} Bucket; 

有點像一個鏈表,Bucket就像是一個鏈表節(jié)點,有具體的數(shù)據(jù)和指針,而HashTable就是一個array,保存著一串Bucket元素。PHP中多維數(shù)組的實現(xiàn),不過就是Bucket里面存著另一個HashTable罷了。

【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結(jié)合實例形式分析了php實現(xiàn)針對有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現(xiàn)服務(wù)端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現(xiàn)APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現(xiàn)的多維數(shù)組排序算法,結(jié)合實例形式對比分析了php針對多維數(shù)組及帶有鍵名的多維數(shù)組進行排序相關(guān)操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php結(jié)合ajaxuploadfile實現(xiàn)無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細(xì)介紹了PHP開發(fā)接口使用RSA進行加密解密方法,對此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: 在线观看亚洲精品 | 国产一二三区电影 | 国产高清精品在线 | a级片在线观看 | 精品九九| 日韩精品在线免费观看 | 亚洲精品在线免费观看视频 | 国产区精品 | 国产精品视频网 | 亚洲一区二区三区在线 | 国产精品免费av | 成人免费小视频 | 91资源在线 | 亚洲精品2 | 欧美一级片在线观看 | 精品啪啪 | 国产精品一区二区三区久久久 | 国产在线视频在线观看 | 成人在线观看中文字幕 | 国产精品一区久久久 | jlzzjlzz国产精品久久 | 日韩中文字幕视频 | 欧美性生活一区二区三区 | 亚洲第一网站 | 精品久久久久久久 | 欧美性受xxxx白人性爽 | 国产综合久久久久久鬼色 | 午夜精品久久久久久久星辰影院 | 国产精品久久av | 日本电影韩国电影免费观看 | 国产黄色网址在线观看 | 国产精品久久久亚洲 | 久久综合一区二区 | 日日夜夜天天 | 久久久蜜臀国产一区二区 | 人人九九 | 人操人免费视频 | 日韩精品在线网站 | 黄网站涩免费蜜桃网站 | 免费在线观看成人av | 亚洲欧美激情精品一区二区 |