Golang基准测试函数的命名规范说明

13次阅读

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

Golang基准测试函数的命名规范说明

Go基准测试函数必须以 Benchmark 开头

Go 的 testing 包只识别以 Benchmark 为前缀、且参数为 *testing.B 的函数作为基准测试。名字不满足该规则,go test -bench 会直接忽略。

  • ✅ 正确:BenchmarkHTTPHandlerBenchmarkmapInsert1000
  • ❌ 错误:TestBenchmarkMapInsertbenchmarkMapInsertBenchMapInsert
  • ⚠️ 注意:大小写敏感,benchmarkMapInsert 不会被识别,哪怕它在 _test.go 文件中

函数签名必须是 func BenchmarkXxx(*testing.B)

签名错误会导致编译失败或 go testno 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语言免费学习笔记(深入)”;

  • ❌ 不推荐:为每种输入规模写一个独立函数名,如 BenchmarkMapInsert100BenchmarkMapInsert1000BenchmarkMapInsert10000
  • ✅ 更好做法:用单个 BenchmarkMapInsert + b.Run 子测试覆盖不同规模
  • ⚠️ 注意:b.N 是运行框架自动调整的迭代次数,不是你手动控制的“数据量”——实际数据规模应在函数体内显式构造,例如 make(map[int]int, b.N)for i := 0; i

基准测试函数名本质是标识符,不是描述文案。它要足够稳定以便 CI 过滤、历史比对,也要足够清晰让团队成员一眼理解所测模块。最常被忽略的是子测试命名与 b.Run 的配合方式——名字带空格或正则元字符,会让 -bench 过滤失效,排查时反而更费时间。

text=ZqhQzanResources