php7 packed hashtable 和 hashtable的转换规则

2022-07-22 18:42:00
CJL
原创
3329

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 源码





发表评论
评论通过审核后显示。
流量统计