看了下面連結的文章,作者解釋為何在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的大小加上上面提到變數的大小,再乘以陣列的長度... 哇!比想像中的還要大很多阿!
沒有留言:
張貼留言