php7 packed hashtable 和 hashtable的轉換規則

2022-07-22 18:42:00
CJL
原創
4319

php7的數字底層是通過hashtable實現的,一般的是通過數據連續存儲實現有序遍歷、中間映射錶索引實現隨機查找、鏈錶實現hash衝突的普通hashtable。

但針對數字下標場景php做瞭優化packed hashtable,索引就是存儲位置,這樣節省瞭索引的內存,但是當下標不連續的時候會浪費bucket位置的內存。

切換代碼在:Zend/zend_hash.c zend_hash_packed_to_hash 方法 _zend_hash_index_add_or_update_i 方法

爲瞭平衡定瞭一些切換規則如下:

當key不是數字時

key>nTableSize*2 || nNumOfElements*2 >  nTableSize (每次擴容*2一次擴容可以達到目標key 或者 使用的key佔現有總容量一半以上 避免浪費太多空間)




蔘考資料:

https://juejin.cn/post/6844903443660832776 PHP 7 新 Hash 錶實現

https://juejin.cn/post/6993271667111919623 如何在 Mac 上用 Clion 調試 php7 源碼





發錶評論
評論通過審核後顯示。
流量統計