基准测试
Demo
// 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
}
}
func fib(n int) int {
if n == 0 || n == 1 {
return n
}
return fib(n-2) + fib(n-1)
}
- benchmark 和普通的单元测试用例一样,都位于
_test.go
文件中。 - 函数名以
Benchmark
开头,参数是b *testing.B
。和普通的单元测试用例很像,单元测试函数名以Test
开头,参数是t *testing.T
。
执行基准测试
-
go test
命令默认不运行 benchmark 用例的,如果我们想运行 benchmark 用例,则需要加上-bench
参数。$ go test -bench="$Fib" . // 通过-bench指定测试函数,或者通过正则匹配一类函数,比如说`-bench='Fib$'` goos: windows goarch: amd64 pkg: gan cpu: Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz BenchmarkFib-12 306 3925085 ns/op PASS ok gan 2.218s
-
如果想使用多个cpu执行
$ go test -bench='Fib$' -cpu=2,4 .
-
如果想提高测试时间和次数
$ go test -bench='Fib$' -benchtime=50x . //执行50次 $ go test -bench='Fib$' -benchtime=5s . //执行5s $ go test -bench='Fib$' -benchtime=5s -count=3 . //执行5s,一共执行3轮
-
查看内存分配情况
$ go test -bench='Fib$' -benchmem .
去除干扰因素
-
重置计时器
func BenchmarkFib(b *testing.B) { time.Sleep(time.Second * 3) // 模拟耗时准备任务 b.ResetTimer() // 重置定时器 for n := 0; n < b.N; n++ { fib(30) // run fib(30) b.N times } }
-
去除准备和后置处理工作耗时影响
func BenchmarkBubbleSort(b *testing.B) { for n := 0; n < b.N; n++ { b.StopTimer() nums := generateWithCap(10000) b.StartTimer() bubbleSort(nums) } }
参考: https://geektutu.com/post/hpg-benchmark.html