从版本 1.0 到 1.22 的 Go 性能

  • 2024 年 4 月:两年前对比了 GoAWK 解释器在 Go 1.2 至 1.18 各版本上的两种基准测试,本文重新运行这些基准测试,添加缺失的 Go 版本(1.0 和 1.1)以及新的版本(1.19 至 1.22),还包括带有配置文件引导优化(PGO)的结果,PGO 在 Go 1.20 中添加。
  • 比较 GoAWK 在 Go 1.0 至 1.22 各发布版本编译时的性能:通过在代表不同极端的两个 AWK 程序上运行 GoAWK 进行测试,一个是字符串处理任务countwords,一个是数字运算任务sumloop
  • 为在较旧 Go 版本上编译 GoAWK 需微调代码,如 Go 1.0 用 Go 1.1 的bufio.Scanner实现。
  • 图表中的时间数据是在 x86 - 64 Linux 笔记本上的运行时间(三次运行最佳值),蓝色线为countwords,红色线为sumloop,Y 轴为对数,图表还包括各 Go 版本的 GoAWK 二进制大小。
  • 最大的改进出现在 1.3、1.5、1.7 和 1.12 版本,1.2 版本的countwords有奇怪的上升,后在 1.3 版本下降,这是由于栈“热分裂”问题导致,通过分析 pprof 输出找出原因。
  • PGO 仅使性能提高几个百分点,countwords约 2%,sumloop约 7%,编译发布的 GoAWK 二进制时使用 PGO。
  • 多年来二进制大小除 1.2 版本有大幅上升外保持相对稳定,即使启用 PGO,二进制也仅大约 5%,通常是值得的。
  • 总体上countwords比 Go 1.0 时快约 8 倍,sumloop快 24 倍,感谢 Go 团队多年的努力,希望能在 GitHub 上获得赞助以激励继续开发开源项目和写更多好内容。
阅读 8
0 条评论