php7 packed hashtable 和 hashtable的转换规则
- 2022-07-22 18:42:00
- CJL 原创
- 3915
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 源码
发表评论