Go基准测试函数必须以Benchmark开头且签名为func BenchmarkXxx(*testing.B),否则go test -bench会忽略或报错;大小写敏感,不能省略指针、多参数或返回值。
Benchmark 开头Go 的 testing 包只识别以
Benchmark 为前缀、且参数为 *testing.B 的函数作为基准测试。名字不满足该规则,go test -bench 会直接忽略。
BenchmarkHTTPHandler、BenchmarkMapInsert1000
TestBenchmarkMapInsert、benchmarkMapInsert、BenchMapInsert
benchmarkMapInsert 不会被识别,哪怕它在 _test.go 文件中func BenchmarkXxx(*testing.B)
签名错误会导致编译失败或 go test 报 no tests to run(即使文件里有看似合法的函数)。
func BenchmarkXxx(b testing.B) ❌ 编译报错func BenchmarkXxx(b *testing.B, n int) ❌ go test -bench 跳过func BenchmarkXxx(b *testing.B) error ❌ 不被识别func BenchmarkSortSlice(b *testing.B) {
data := make([]int, 1000)
for i := 0; i < b.N; i++ {
sort.Ints(data)
}
}
b.Run + 合理子名称用 b.Run 组织不同规模或配置的测试时,子名称也需符合命名惯例:首字母大写、避免空格和特殊字符,否则报告难读、排序混乱。
b.Run("100", ...)、b.Run("WithCache", ...)
b.Run("100 items", ...)(含空格)、b.Run("with-cache", ...)(连字符,影响 -bench 过滤)-bench 过滤,如 go test -bench=BenchmarkSortSlice/100 可单独跑子项函数名应在编译期固定。把具体数值(如 BenchmarkMapInsert1000000)硬编码进名字虽合法,但可维护性差,且无法参数化对比。
BenchmarkMapInsert100、BenchmarkMapInsert1000、BenchmarkMapInsert10000
BenchmarkMapInsert + b.Run 子测试覆盖不同规模b.N 是运行框架自动调整的迭代次数,不是你手动控制的“数据量”——实际数据规模应在函数体内显式构造,例如 make(map[int]int, b.N) 或 for i := 0; i
b.Run 的配合方式——名字带空格或正则元字符,会让 -bench 过滤失效,排查时反而更费时间。