- 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 上获得赞助以激励继续开发开源项目和写更多好内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。