Google 的 Swiss Table 是一种高效的哈希表实现,利用 SIMD 指令实现 16 路并行探测,性能比传统的 std::unordered_map 快 2 倍以上。它通过控制字节优化内存访问,减少缓存未命中率,提升查找效率,并采用开放寻址策略,解决了链式哈希的内存开销和性能瓶颈问题。
Datadog 通过修复 Go 1.24 的内存问题,发现新实现的 Swiss Table 显著降低了高流量环境下的内存使用,提升了查找效率,消除了溢出桶,并优化了扩容机制。尽管在低流量环境中效果不明显,但整体上提升了 Go 的性能和内存管理。
哈希表是计算机科学中常用的数据结构,主要有链式哈希和开放寻址两种冲突解决策略。链式哈希简单可靠,但缓存不友好;开放寻址更高效,特别是线性探测和Robin Hood哈希。Robin Hood通过交换位置优化探测长度,减少最坏情况的性能下降。不同策略在负载因子下表现各异,Swiss Table在性能上表现最佳。
Go语言的map将采用Swiss Table作为默认实现,预计在Go 1.24中推出。该哈希表结构经过两年评估,旨在提升查询、插入和删除操作的性能,特别是在处理大数据时。新实现还引入了多表和渐进式扩容设计,以进一步优化性能。
2022年,字节跳动建议Golang使用SwissTable作为map实现。2023年,Dolt发布了关于SwissMap的博客,引起关注。Go核心团队正在重新评估SwissTable设计,并在运行时添加代码。SwissTable通过优化结构和元数据,提高性能和内存效率,利用SIMD指令减少键比较,提升吞吐量。在大型map中性能显著提升,但在小型map中表现一般。
在最新的Go开发团队会议上,讨论了Google3对SwissTable的性能评估,可能值得跟进。SwissTable是谷歌开源的哈希表实现,已在Google内部大量使用,并在其他语言中也有应用。Go开发团队考虑在未来版本中替换标准库的map。SwissTable采用封闭哈希方案,对CPU缓存更友好,通过SSE指令并行比较短哈希。在性能测试中,SwissTable在大量key值的情况下表现优异,同时节省内存并采用快速求余算法。
完成下面两步后,将自动完成登录并继续当前操作。