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 源碼
發錶評論