基准测试函数必须满足三个条件:文件名以_test.go结尾、函数名以benchmark开头且首字母大写、参数类型为*testing.b;否则go test -bench会静默忽略。
基准测试函数必须长什么样?
Go 的 Benchmark 函数不是随便起个名、写个循环就行——它必须严格满足三个条件,否则 go test -bench 会直接忽略,还不报错,静默跳过。
- 文件名必须是
*_test.go(比如utils_test.go) - 函数名必须以
Benchmark开头,且首字母大写(BenchmarkMapAccess✅,benchmarkMapAccess❌) - 参数类型必须是
*testing.B(不是*testing.T,也不是无参)
漏掉任意一条,运行 go test -bench=. 就像没写一样。最常见的是把函数写在普通 .go 文件里,或者手误写成 func BenchmarkXxx(t *testing.T) —— 这种错误不会报错,只会让你对着空白输出发呆。
怎么写才测得准?别让初始化拖慢结果
基准测试真正要测的是“目标操作”,不是“建数据+跑操作”。但很多人把 make(map[int]int) 或 strings.Builder{} 放在 b.N 循环里,结果测出来的是分配开销,不是算法本身。
- 所有准备动作(造 map、填 slice、初始化 struct)必须放在
b.ResetTimer()之前 - 如果准备阶段耗时明显,用
b.StopTimer()和b.StartTimer()手动包住非目标代码 - 想看内存分配?必须显式调用
b.ReportAllocs(),光加-benchmem参数不够
正确示例: