Go函数性能分析
go官方提供了优秀的函数性能测试工具:benchmark,让我们可以更简单的分析某一段代码的执行效率。
当我们需要分析同一个功能实现的两段不同代码哪个执行效率更高时,benchmark便是一个优秀的脚手架。
-
benchmark测试 和 Test测试有啥区别?
相同点:
- 都位与 "_test.go" 后缀的源码内
不同点:
- benchmark测试更多是为了测试函数的执行效率、内存分配情况(大小、次数)
- benchmark测试以函数名
Benchmark
开头, test测试以函数Test
开头 - benchmark测试入参为
b *testing.B
, test测试入参为t *testing.T
-
benchmark测试怎么运行?
-
go test
默认不运行 benchmark测试用例, 需要添加-bench
才能运行 benchmark测试用例。 -
-bench=
可以传入正则表达式,这样匹配的用例才会执行。 -
-cpu
可以改变GOMAXPROCS
, 变更运行的cpu核数 -
-benchtime
可指定执行时间或具体次数 -
-count
可设置 benchmark 轮数 -
-benchmem
可查看内存分配量和分配次数
-
-
benchmark测试需要尽量保证对比函数的环境稳定和一致,但如果两个函数需要初始化的上下文不一样,而我们只关心核心处理代码效率,那怎么避免差异?
- 可以使用
b.ResetTimer()
可重置定时器 - 可以使用
b.StopTimer()
暂停计时 - 可以使用
b.StartTimer()
开始计时
- 可以使用
使用benchmark的简单例子
// fib.go
package main
func fib(n int) int {
if n == 0 || n == 1 {
return n
}
return fib(n-2) + fib(n-1)
}
// fib_test.go
package main
import "testing"
func BenchmarkFib(b *testing.B) {
for n := 0; n < b.N; n++ {
fib(30) // run fib(30) b.N times
}
}
// 运行用例
$ go test -bench .
goos: darwin
goarch: amd64
pkg: example
BenchmarkFib-8 200 5865240 ns/op
PASS
ok example 1.782s