2011年12月16日

php array的宣告 ... 真的很占空間嗎?

看了下面連結的文章,作者解釋為何在64bit linux和php5.3環境裡,宣告出來的陣列比想像中還要大上許多。
http://nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html

原來在php裡,光是宣告一個變數就這樣層層包了好多的東西

首先是因為php 是weak typed language,為了支持這種動態特性,所以是用zvalue_value這種union的方式達成。

接著,zvalue_value只有存值,但是php還要儲存它的type和garbage collection的資訊,於是用了zval這個struct將zvalue_value和其他資訊包在一起。

然後,在php 5.3有個garbage collector for cyclic references.的機制,為了它,所以要在多記一些資訊,於是把zval包在zval_gc_info裡。

而在php,有個MM(memory manager),所以妳寫code時不必擔心妳的指標有沒有亂指,有沒有被宣告的空間但是沒被指到。當然,這也要付出些代價,每當宣告時,MM會加zend_mm_block這個header。

到以上為止,都是只有宣告一個變數的情況....

如果使用array的話,total size還要多加bucket這個struct。在php中的"array",其實實際上是一種hash table或者dictionary,hash需要key來取得資料。另外hash也會發生clash的情形,當出現這種情形時,php就用link list來連結它們,成為一個bucket。當要取得資料時,就找到對的bucket然後一個一個比對它們的key,直到找到正確的為止。

一個bucket的大小加上上面提到變數的大小,再乘以陣列的長度... 哇!比想像中的還要大很多阿!

沒有留言:

張貼留言