Go语言中基准测试通过testing.B可精准测函数性能,需以Benchmark开头、用b.N循环、防编译优化,运行go test -bench=.查看ns/op等指标,配合-benchmem分析内存分配。
在Go语言中进行基准测试是优化代码性能的重要手段。通过
包提供的
功能,可以准确测量函数的执行时间与资源消耗,帮助开发者识别
性能瓶颈
。
编写基本的Benchmark函数
基准测试函数与单元测试类似,但函数名以
开头,并接收
参数。运行时,Go会自动调用该函数多次(由系统动态调整),以获得稳定的性能数据。
示例:测试一个简单加法函数的性能
func BenchmarkAdd(b *testing.B) {for i := 0; i < b.N; i++ {Add(1, 2)}}
b.N
表示循环执行次数,Go会自动调整它,直到获得足够精确的时间统计。
立即学习
“
go语言免费学习笔记(深入)
”;
运行基准测试并解读结果
使用命令行运行基准测试:
go test -bench=.
输出示例如下:
BenchmarkAdd-8 1000000000 0.345 ns/op
含义:
BenchmarkAdd-8
:测试名称,8代表GOMAXPROCS值
1000000000
:执行了10亿次循环
0.345 ns/op
:每次操作耗时约0.345纳秒
这个数值越小,说明函数性能越高。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
控制测试时间和内存分配
可以通过额外参数控制基准测试的行为:
-benchtime=1s
:指定每个基准测试运行至少1秒(默认)
-count=3
:重复执行3次取平均值,提高准确性
-benchmem
:显示内存分配情况
例如:
go test -bench=. -benchmem
输出中会新增两列:
BenchmarkAdd-8 1000000000 0.345 ns/op 0 B/op 0 allocs/op
0 B/op
表示每次操作未分配内存,
0 allocs/op
表示无内存分配操作。这两个值越低越好。
避免编译器优化影响测试结果
有时Go编译器会优化掉“无意义”的计算,导致测试失真。为防止这种情况,应将函数结果赋值给
变量
前后可手动控制计时范围。
正确做法:
func BenchmarkAdd(b *testing.B) {var result intfor i := 0; i < b.N; i++ {result = Add(1, 2)}_ = result // 防止被优化掉}
或使用
在测试前触发垃圾回收,减少干扰。
基本上就这些。写好Benchmark能帮你发现细微性能差异,尤其在对比不同算法实现时非常有用。不复杂但容易忽略细节。
testingBenchmarkBenchmark*testing.Bblackholeb.ResetTimer()runtime.GC()