benchstat 从 Go 1.21 起默认安装,旧版本需手动 go install golang.org/x/perf/cmd/benchstat@latest;仅解析标准 go test -bench 原始输出,要求格式规范、参数一致、环境可控,且需足够样本量(如 -count=5)才能进行有效统计分析。
benchstat 命令根本没安装?先确认 Go 工具链版本
Go 1.21 起
才随
命令一起默认安装;低于这个版本会提示
。别急着
,先跑
看清楚——旧版本升级 Go 更稳妥,而不是单独装一个可能不兼容的二进制。
Go 1.20 及更早:必须手动安装,运行
Go 1.21+:直接用
,但注意它不在
里?检查
是否已加入环境变量
Mac M 系列 + Homebrew 安装的 Go?容易出现
在
而非
,优先以
为准
基准测试输出格式不对,benchstat 解析失败
只认标准
输出的原始文本(含
这类行),任何额外打印、重定向截断、或用
都会让它报
或静默退出。
确保保存结果用
,不是
或
混入 stderr
别用
——管道可能触发缓冲,导致末尾几行丢失
如果用了
等参数,要保证所有对比文件用完全相同的
和
,否则
会因样本数不一致而拒绝比较
Windows 用户注意换行符:用
或编辑器转成 LF,CR/LF 混合会导致解析跳行
benchstat 输出里 “Geomean” 是啥?别直接看它下结论
默认第一行显示
(几何平均值),但它只是所有 benchmark 的归一化汇总,掩盖了单个函数的涨跌。比如一个函数快了 50%,另一个慢了 40%,
可能只显示 “-2%”,让你误判整体优化成功。
真正要看的是每行 benchmark 的 delta 列:
后面带
—— p 值小于 0.05 才算统计显著
如果某 benchmark 显示
,说明变化不显著,别当真
加
可强制显示是否“无差异”,比默认的 t-test 更适合判断微小改动是否有实质影响
避免只比一次:
生成 5 个样本,
才有足够数据做方差分析
想对比不同 CPU 或 GC 设置下的性能?参数得对齐再对齐
哪怕只多开一个
,或者测试机从 idle 切到编译中,
就可能把噪声当信号。它不帮你控制环境,只负责算数。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
立即学习
“
go语言免费学习笔记(深入)
”;
固定
:不同机器默认值不同,统一设为
或明确数值再跑
关掉后台干扰:
(macOS)、
(Linux)
GC 影响大?用
在每个 Benchmark 函数开头手动触发,或加
禁用内联干扰测量
别跨机器比:CPU 微架构(如 Intel vs AMD)、频率睿频策略、内存带宽都会让数字不可比;同一台机器、重启后、清空
和 page cache 再测
真实场景里,最常被忽略的是热身不足和样本量太少——
的结果连
都懒得算 p 值,它直接当单点数据处理。
benchstatgocommand not found: benchstatgo installgo versiongo install golang.org/x/perf/cmd/benchstat@latestbenchstat$PATHgo env GOBINbenchstat/opt/homebrew/binGOBINgo env GOBINbenchstatgo test -benchBenchmarkXXX-8 1000000 1234 ns/op-jsonno benchmarks to comparego test -bench=. -benchmem > old.txt>>2>&1go test -bench=. | tee result.txt-benchtime=1s-benchtime-countbenchstatunix2dosbenchstatGeomeanGeomean±X%p=0.XXX1200ns ± 5% 1100ns ± 8% -8.33% (p=0.12)-delta-test=equalgo test -bench=. -count=5benchstatGOGC=100benchstatGOMAXPROCSGOMAXPROCS=1sudo pmset -a disablesleep 1systemctl stop cronruntime.GC()-gcflags="-l"/tmp-count=1benchstat