知识卡片

渐进扩容

普通读书笔记卡 · 1474.a.1

内容

map 扩容不会一次搬完所有桶,而是在后续访问和写入中逐步迁移。这样把停顿摊薄到多次操作里,体现了运行时在吞吐和延迟之间的工程取舍。

参考来源

- 位置:《Go语言底层原理剖析》第8章《哈希表与Go语言实现机制》8.5.5节《map重建原理》 - 结论依据:原文明确"这里并没有实际执行将旧桶中的数据转移到新桶的过程。数据转移遵循写时复制(copy on write)的规则,只有在真正赋值时,才会选择是否需要进行数据转移",且"并不是所有的数据都一次性转移,而是只转移当前需要的旧桶中的数据",因此可以推出"map 扩容是渐进式的写时复制迁移,而非一次性搬完"的结论。 - 原始内容:重建时需要调用hashGrow函数……新桶会存储到buckets字段,旧桶会存储到oldbuckets字段……要注意的是,这里并没有实际执行将旧桶中的数据转移到新桶的过程。数据转移遵循写时复制(copy on write)的规则,只有在真正赋值时,才会选择是否需要进行数据转移,其核心逻辑位于growWork和evacuate函数中。在进行写时复制时,并不是所有的数据都一次性转移,而是只转移当前需要的旧桶中的数据。