go test -bench=BenchmarkParseJSON 可运行指定 Benchmark 函数,需严格匹配命名和签名;-run 对 Benchmark 无效,必须用 -bench 参数;常用调试技巧包括 -bench=. 查看可用 benchmark,-benchmem 显示内存分配,-count=3 多次运行取中位数以提升结果可比性。
如何用 go test 运行指定的 Benchmark 函数
Go 的 go test 默认不运行 benchmark,必须显式加 -bench 参数。要只跑某一个,比如 BenchmarkParseJSON,直接匹配函数名即可:
-
go test -bench=BenchmarkParseJSON—— 注意等号后不带空格,且大小写和下划线必须完全一致 - 如果函数名有前缀共用(如
BenchmarkHTTP*),可用正则风格:go test -bench="BenchmarkHTTP.*"(引号防止 shell 展开) - 不加引号时,
*可能被 shell 当作通配符提前解析,导致匹配失败或报错no matches for benchmark
为什么 -run 对 benchmark 无效
-run 只控制测试函数(TestXXX),对 BenchmarkXXX 完全无作用。这是 Go 测试框架的明确分离设计。
- benchmark 是独立执行阶段,在
-bench开启后才触发,和-run的逻辑路径不同 - 误写成
go test -run=BenchmarkXXX不会报错,但也不会运行任何 benchmark —— 它只是安静地跳过 - 若同时想跑某个 Test 和某个 Benchmark,需分开执行:
go test -run=TestFoo和go test -bench=BenchmarkBar
常见匹配失败原因与调试技巧
运行 -bench 却提示 no benchmarks to run,大概率是函数签名或命名没对上。
- 函数必须是
func BenchmarkXXX(b *testing.B)形式,首字母大写,第二个参数类型严格为*testing.B - 文件名不能以
_test.go结尾?—— 不行,benchmark 必须放在*_test.go文件里,否则go test根本不会加载 - 想确认当前目录有哪些可运行的 benchmark?先用
go test -bench=. -benchmem -run=^$(-run=^$是个空正则,确保不干扰 benchmark 阶段)
性能基准运行时的关键参数影响
只跑对了函数还不够,-benchtime、-count、-benchmem 这些会影响结果稳定性和可比性。