大家好,我是煎鱼。
五一假期时看到 @Ben Hoyt 大佬分享的文章《Go performance from version 1.0 to 1.22》,分享了他在这么多年来一直坚持不懈的对 Go 进行性能测试的记载。
今天基于此分享给大家,有所调整和精简。
原作者对 Go1.0 到 Go1.22 的所有 Go 版本进行了性能测试,包含了在 Go 1.20 中新增的性能分析引导优化(PGO)的结果。
Go 测试项目用的是 GoAWK[1] 项目,该项目用 Go 写的 AWK 解释器,支持 CSV。
GoAWK 使用案例如下:
$ go install github.com/benhoyt/goawk@latest
$ goawk 'BEGIN { print "foo", 42 }'
foo 42
$ echo 1 2 3 | goawk '{ print $1 + $3 }'
4
# Or use GoAWK's CSV and @"named-field" support:
$ echo -e 'name,amount\nBob,17.50\nJill,20\n"Boba Fett",100.00' | \
goawk -i csv -H '{ total += @"amount" } END { print total }'
137.5
性能测试
接下来正式开始进行性能测试,主要是同项目多版本测试的模式。
原作者(下称:我)通过在两个 AWK 程序上运行 GoAWK 来测试这一点,这两个程序代表了使用 AWK 可以做的极端不同情况:I/O 操作与字符串处理,以及数值计算。
countwords(字符串处理任务)
首先是 countwords,这是一个字符串处理任务,它计算输入中单词的频率并打印出带有计数的单词。这是 AWK 脚本的典型应用。
程序输入是某本书的 10 倍串联版本的内容。
以下是部分代码:
{
for (i=1; i