benchview 已停更且不兼容 go 1.21+,推荐用官方 benchstat 做轻量对比分析,或结合 gotestsum + jq 导出 json 数据用于图表绘制。

benchview 不再维护,替代方案更可靠
Go 官方从 1.21 开始已弃用 go test -benchmem 输出的旧式 benchmark 格式,而 benchview 依赖该格式解析,现在运行会直接报错或显示空结果。它最后一次更新是 2019 年,不支持 go1.21+ 的 JSON benchmark 输出(-json 标志),也不兼容模块化路径中的测试包名嵌套。
- 如果你在 Go 1.20+ 环境下执行
benchview,大概率看到panic: runtime error: index out of range或静默失败 - 真实场景中,多数人用它是为了对比两次基准测试差异(比如 PR 前后),但
benchview的 diff 逻辑脆弱,对函数名缩写、字段顺序敏感 - 它把所有数据硬编码进 HTML 模板,无法导出 CSV 或接入 CI 流水线
用 go tool benchstat 做轻量级对比分析
benchstat 是 Go 官方工具链自带的(无需额外安装),专为 benchmark 文本输出设计,稳定、可复现、支持统计显著性判断。它不画图,但能告诉你 “这个优化是否真的让 BenchmarkFoo 快了 12.3% ± 1.8%”。
- 先用标准方式生成两组基准数据:
go test -bench=. -benchmem -count=5 > old.txt和go test -bench=. -benchmem -count=5 > new.txt - 然后执行:
benchstat old.txt new.txt,输出里带p=0.002表示统计显著,geomean行给出整体变化趋势 - 注意:必须用相同
-count值,否则benchstat会拒绝比较;如果某次运行 panic,对应行会被跳过,但不会报错提醒 - 它默认忽略
Benchmark名中带/的子测试(如BenchmarkMap/WithLock),需加-geomean=false才逐项列出
需要图表?用 gotestsum + 自定义脚本导出 JSON
Go 1.21+ 的 go test -json 输出包含完整 benchmark 事件流,比旧文本格式更结构化。配合 gotestsum 可稳定提取并转成 CSV 或 Plotly 兼容格式。
注意:请在linux环境下测试或生产使用 青鸟内测是一个移动应用分发系统,支持安卓苹果应用上传与下载,并且还能快捷封装网址为应用。应用内测分发:一键上传APP应用包,自动生成下载链接和二维码,方便用户内测下载。应用封装:一键即可生成app,无需写代码,可视化编辑、 直接拖拽组件制作页面的高效平台。工具箱:安卓证书生成、提取UDID、Plist文件在线制作、IOS封装、APP图标在线制作APP分发:
- 安装:
go install gotest.tools/gotestsum@latest - 运行:
gotestsum --format testname -- -bench=. -benchmem -json > bench.json - 用 Python 或 jq 提取关键字段:
jq -r '.[] | select(.Action == "benchmark") | [.Benchmark, .N, .Elapsed, .MemAllocs, .MemBytes] | @csv' bench.json > data.csv - 坑点:JSON 中
.Elapsed单位是秒(float),而传统文本输出是纳秒字符串;.MemBytes在无内存分配时可能为 null,需过滤
别碰 benchview 的 Docker 镜像或 fork 版本
社区有几个标榜 “修复了 benchview”的镜像或 GitHub fork,实际只是把 go1.19 的二进制打包进去,没改解析逻辑。它们在 Go 1.22 下跑 go test -bench=. -benchmem 仍会因字段缺失 panic,且无法处理 go.work 多模块场景下的包路径。
立即学习“go语言免费学习笔记(深入)”;
- 最常触发的错误是:
panic: interface conversion: interface {} is nil, not map[string]interface{},源于新版 JSON 中MemStats字段结构变更 - 有人尝试用 sed 替换 JSON 为旧格式再喂给 benchview,但会丢失
-count多轮采样信息,导致统计失效 - 真正省事的做法是:放弃可视化幻想,用
benchstat定结论,用jq+gnuplot或本地 VS Code 插件(如 “Plot Viewer”)临时画图
可视化本身不是目的,确认性能变化是否真实、可复现、有统计支撑才是。越早接受 JSON 输出不可逆,越少在格式转换上浪费时间。









