Go语言基准测试需使用Benchmark前缀和testing.B类型,通过b.N自动调节循环次数以获取稳定性能数据,测试函数放入_test.go文件中,运行go test -bench=.可得每操作耗时及内存使用,关键在于只测量目标代码并确保足够执行次数。

在Go语言中写基准测试非常直接,核心是使用
Benchmark前缀和
b.N来控制循环次数。基准测试的目的是测量代码的性能,比如函数执行所需的时间或内存分配情况。
使用Benchmark前缀定义测试函数
基准测试函数必须放在以
_test.go结尾的文件中,函数名以
Benchmark开头,参数类型为
*testing.B。
例如,测试一个计算斐波那契数的函数:
func BenchmarkFibonacci(b *testing.B) {for i := 0; i fibonacci(10)
}
}
BenchmarkFibonacci会自动被
go test识别。测试运行时,Go会不断调整
b.N的值(比如1000、10000、100000),直到获得足够稳定的性能数据。
立即学习“go语言免费学习笔记(深入)”;
b.N的作用:自动调节循环次数
b.N是Go运行时决定的循环次数,目的是让测试运行足够长的时间以获得准确的性能指标。你不需要手动设置它,只需把要测试的代码放在
for循环中执行
b.N次。
常见写法:
- 将被测函数调用放入
for i := 0; i < b.N; i++
中 - 避免在循环内做无关操作,以免影响测量精度
- 如果函数依赖初始化数据,可将初始化放在循环外
示例:测试字符串拼接性能
比较两种字符串拼接方式的性能:
func BenchmarkStringConcat(b *testing.B) {s := "hello"
for i := 0; i _ = s + "world"
}
}
func BenchmarkStringBuilder(b *testing.B) {
var sb strings.Builder
for i := 0; i sb.Reset()
sb.WriteString("hello")
sb.WriteString("world")
_
}
}
运行基准测试:
go test -bench=.输出类似:
BenchmarkStringConcat-8 10000000 120 ns/opBenchmarkStringBuilder-8 20000000 60 ns/op
表示每次操作平均耗时,单位是纳秒。
额外提示
- 用
-bench=函数名
运行特定测试,如go test -bench=BenchmarkFibonacci
- 加
-benchmem
可查看内存分配情况 - 避免在循环中进行变量定义或初始化,除非这是你要测试的一部分
- 确保被测逻辑足够“热”,即执行次数足够多,才能反映真实性能
基本上就这些。写好基准测试的关键是保持测试逻辑干净,只测你想测的部分,让
b.N自动帮你跑足够多次。Go的基准测试机制简单但有效,配合
go test -bench就能快速对比性能差异。










