Go基准测试函数必须以Benchmark开头且签名为func BenchmarkXxx(*testing.B),否则go test -bench会忽略或报错;大小写敏感,不能省略指针、多参数或返回值。

Go基准测试函数必须以 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)硬编码进名字虽合法,但可维护性差,且无法参数化对比。
立即学习“go语言免费学习笔记(深入)”;
- ❌ 不推荐:为每种输入规模写一个独立函数名,如
BenchmarkMapInsert100、BenchmarkMapInsert1000、BenchmarkMapInsert10000 - ✅ 更好做法:用单个
BenchmarkMapInsert+b.Run子测试覆盖不同规模 - ⚠️ 注意:
b.N是运行框架自动调整的迭代次数,不是你手动控制的“数据量”——实际数据规模应在函数体内显式构造,例如make(map[int]int, b.N)或for i := 0; i
b.Run 的配合方式——名字带空格或正则元字符,会让 -bench 过滤失效,排查时反而更费时间。










