使用瑞士表的更快的 Go 映射 - Go 编程语言

主要观点:哈希表是重要数据结构,Go 的 map 类型基于哈希表实现,其内置 map 类型在 Go 1.24 有基于 Swiss Table 设计的全新实现。
关键信息

  • 1953 年 Hans Peter Luhn 描述哈希表概念,1954 年 Gene M. Amdahl 等使用“开放寻址”方案,1957 年 W. Wesley Peterson 发表相关论文。
  • Go 1.19 切换sort包算法,哈希表也在持续改进,如 2017 年 Google 提出“Swiss Tables”,2018 年开源。
  • Swiss Table 是开放寻址哈希表形式,将数组分成每组 8 个槽的逻辑组,通过控制字提高查找插入效率。
  • Go 内置 map 类型有增量增长和迭代时修改等特殊属性,导致采用新设计有挑战,通过分层间接处理和特殊迭代方式解决。
  • 在微基准测试中,Go 1.24 的 map 操作比 Go 1.23 快达 60%,整体在全应用基准测试中平均 CPU 时间改善约 1.5%,未来还将研究更多改进。
    重要细节
  • 开放寻址哈希表通过哈希函数确定槽,冲突时用探测序列找空槽,负载因子达到最大时会增长数组。
  • Swiss Table 计算hash(key)并分成两部分,用高位选组,低位在组内查找,控制字用于高效查找。
  • Go 内置 map 增量增长时每个表最多存 1024 个条目,单个插入的上限是将 1024 条目表增长到 2048 条目表的延迟。
  • Go 语言规范允许迭代时修改 map,通过保持对当前迭代表的引用处理增长时的情况,避免一些语义问题。
阅读 10
0 条评论