benchstat 需单独安装,属 golang.org/x/perf/cmd/benchstat;解析要求纯文本、标准格式输出,避免 ANSI 色彩与杂日志;默认用几何平均汇总,关键看具体函数行而非顶部 geomean。
benchstat 命令没找到,但 go test -bench 已跑出结果
说明
不是 Go 标准命令,得单独安装。它属于
,不是
自带的二进制。
实操建议:
运行
(Go 1.21+ 推荐加
)
确认
在
中,否则 shell 找不到
如果用 Go 1.20 或更早,需先
,但注意:
在 1.17+ 已不推荐用于安装命令,容易漏更新
装完可跑
确认是否可用;若报
,大概率是 PATH 没配对
benchstat 报错 “no benchmark results found”
这是最常卡住的地方:它只认标准
输出格式,且要求输入是纯文本、无额外日志或 ANSI 颜色。
常见错误现象:
立即学习
“
go语言免费学习笔记(深入)
”;
把
的输出直接喂给
,但终端颜色码(如
)会让解析失败
在 CI 日志里复制了一段带时间戳/前缀的输出,
无法识别
文件末尾多了一个空行或注释行,它会跳过整块
实操建议:
务必用
直接重定向,别走
或管道
检查文件头几行是否为
、
、
这种格式,缺一不可
用
查看是否有隐藏字符;有就用
清理
对比两个版本时,benchstat 显示 “geomean: +0.00%” 但单个函数涨了 15%
说明
默认用几何平均(geomean)汇总所有 benchmark,而某个函数耗时突增可能被其他大量低耗时 benchmark 平滑掉。
使用场景:
你改的是
,但它只占全部 5 个 benchmark 中的 1 个,其余 4 个几乎没变
输出顶部显示整体变化微小,但下面表格里
行明确标出
实操建议:
永远先扫一眼表格中具体函数那一行,别只信顶部的 geomean
加
参数让
做显著性检验(如
如果只想看某几个函数,用
关掉汇总,或配合
提取关键行
Go 1.21+ 的 -benchtime 和 -count 对 benchstat 结果影响很大
参数差异直接影响统计稳定性:
决定重复次数(默认 1),
决定单次运行目标时长(默认 1s)。两者共同决定数据点数量和方差。
性能 / 兼容性影响:
时,哪怕两次运行环境完全一致,
也认为“无统计意义”,不显示 delta 百分比
可能导致单次运行太短、测量误差放大,尤其在低开销函数上
Go 1.21 起默认启用
,但旧版没开的话,内存分配数不会被
对比——容易误判优化效果
实操建议:
统一用
,确保每次至少跑满 2 秒、重复 5 轮
两次对比必须用完全相同的参数组合,否则
会拒绝比较(报
)
CI 中建议固定
和关闭 CPU 频率调节,否则
的方差可能大到掩盖真实变化
真正难的不是跑出数字,而是让两次
输出在统计意义上可比——环境、参数、甚至 CPU 温度,都会悄悄改写结果。别信单次运行,也别跳过
。
benchstatgolang.org/x/perf/cmd/benchstatgogo install golang.org/x/perf/cmd/benchstat@latest@latest$GOPATH/bin$PATHbenchstatgo getgo getbenchstat -hcommand not foundgo test -benchgo test -bench . -count=5 2>&1 | tee bench-old.txtbenchstat\x1b[32mbenchstatgo test -bench . -count=5 -benchmem > bench-old.txt2>&1goos: linuxgoarch: amd64BenchmarkXXX-8 1000000 1234 ns/opcat -A bench-old.txtsed 's/\x1b\[[0-9;]*m//g' bench-old.txt > clean.txtbenchstatBenchmarkParseJSONbenchstat old.txt new.txtBenchmarkParseJSON+15.23%-delta-test=pbenchstatp ),避免把噪声当真实提升benchstat -geomean=false old.txt new.txtgrep BenchmarkParseJSON-count-benchtime-count=1benchstat-benchtime=100ms-benchmembenchstatgo test -bench . -benchmem -count=5 -benchtime=2sbenchstatinconsistent benchmarksGOMAXPROCS=1-count=5go test -bench-count