Go 1.24大幅提升map查找性能

Go 1.24大幅提升map查找性能 只想祝贺 Go 语言团队,他们在最新版本中极大地提升了 map 查找的性能。

我维护着一个用多种语言实现的康威生命游戏仓库(GitHub - KieranP/Game-Of-Life-Implementations: 用各种语言实现的康威生命游戏)。我时不时会对最新版本进行基准测试。

在我的实现中,有一个名为 “render” 的函数/方法,它会遍历行 (X) 和列 (Y),从 map 中获取给定 X/Y 坐标的值,然后根据该值拼接字符串。

在 Go 1.23 中,这段代码每次迭代最快耗时 0.261 毫秒,平均为 0.278 毫秒。它能在 30 秒内完成 74324 次迭代,总体排名第 10。

在 Go 1.24 中,这段代码现在每次迭代最快耗时 0.185 毫秒,平均为 0.195 毫秒(大约快了 30%)。现在它能在 30 秒内完成 97378 次迭代(大约多了 24%),排名升至第 5 位。

这不需要任何代码更改,只需更新 Go,重新编译即可。

太棒了!


1 回复

确实,Go 1.24对map查找的优化效果显著。这主要归功于运行时层面的改进,特别是哈希表内存布局和查找算法的优化。对于你的康威生命游戏这类频繁进行map读操作(map[int]boolmap[[2]int]bool)的场景,性能提升会非常明显。

以下是一个简化的示例,展示了你代码中可能存在的map查找模式,以及Go 1.24如何直接加速它:

package main

import "fmt"

// 假设使用坐标作为键的map来存储细胞状态
type Point struct {
    X, Y int
}

func render(cells map[Point]bool, width, height int) string {
    var output string
    for y := 0; y < height; y++ {
        for x := 0; x < width; x++ {
            // 这个查找操作在Go 1.24中得到了显著加速
            alive, _ := cells[Point{x, y}]
            if alive {
                output += "■"
            } else {
                output += "□"
            }
        }
        output += "\n"
    }
    return output
}

func main() {
    // 初始化一个示例网格
    grid := map[Point]bool{
        {1, 2}: true,
        {2, 2}: true,
        {3, 2}: true,
    }
    
    result := render(grid, 5, 5)
    fmt.Print(result)
}

在Go 1.24中,cells[Point{x, y}]这个查找操作会执行得更快。这是因为:

  1. 内存访问模式优化:减少了CPU缓存未命中率
  2. 哈希计算改进:更高效的哈希函数和桶选择算法
  3. 逃逸分析增强:减少了堆分配,更多数据保留在栈上

对于你的基准测试,性能提升主要来自:

  • 减少的CPU指令周期数
  • 更好的分支预测
  • 减少的内存访问延迟

这种优化是透明的,无需代码变更,只需重新编译即可获得性能提升。对于游戏循环中每秒数万次的map查找操作,30%的性能提升确实会产生明显的整体性能改善。

回到顶部