Golang Maps: how Swiss Tables replaced the old bucket design
5 days ago
- Go 1.24 用受瑞士表启发的设计取代了旧的桶加溢出映射实现,提高了缓存局部性并减少了指针追踪。
- 瑞士表使用紧凑的每槽元数据(控制字节)和面向组的布局,在完整键比较之前通过指纹过滤候选者。
- 新设计支持分段表和目录路由的增量增长,避免了全局停止世界的再哈希。
- 性能提升在微基准测试中显著(大映射访问快30-35%),但在完整应用程序中较为温和(几何平均加速约1.5%)。
- 由于更高的负载因子和消除了溢出链,内存效率得到改善,许多工作负载中减少0-25%。
- 权衡包括在冷缓存场景、稀疏大映射以及带有墓碑积累的删除密集型模式中可能出现的性能退化。
- 开发者应分析自己的工作负载,因为收益取决于映射主导性、访问模式和Go版本(针对1.27的持续优化)。