Go testing包支持基准测试,函数名以Benchmark开头并接收*testing.B参数,循环体用b.N;运行go test -bench=.可得ns/op、B/op、allocs/op等指标,配合-benchmem、-gcflags="-m"及pprof可深度优化性能。
Go 的 testing 包内置了基准测试(benchmark)功能,能自动统计函数的平均执行时间、内存分配次数和字节数,无需手动打点或依赖第三方工具。
基准测试函数名必须以 Benchmark 开头,接收 *testing.B 参数。测试逻辑需放在 b.N 循环中,框架会自动调整 N 值使测试持续约1秒,从而获得稳定统计值。
func BenchmarkXxx(b *testing.B)
使用 go test -bench=. 运行所有基准测试。关键输出字段含义如下:
例如:BenchmarkAdd-8 10000000 124 ns/op 0 B/op 0 allocs/op 表示在8核上运行1000万次,平均每次124纳秒、无内存分配。
默认情况下,Go 仅对显式调用 new、make 或字面量创建的堆对象计数。逃逸分析可能将小对象分配到栈上,导致 allocs/op 显示为 0,但实际仍有开销。可通过 -gcflags="-m" 查看变量是否逃逸:
go run -gcflags="-m" main.go 输出逃逸分析结果b.ReportAllocs() 确保开启内存统计(新版 Go 默认开启,但仍建议显式调用)用 -benchmem 显式启用内存统计,配合 -bench 指定正则匹配多个函数,便于横向对比:
go test -bench="^Benchmark(Add|Sum)$" -benchmemB/op 和 allocs/op 的变化:减少分配通常意味着更少 GC 压力和更好缓存局部性pprof 进一步分析(go test -cpuprofile=cpu.out -bench=.)
定位热点路径