benchmark性能测试
知识点:
benchmark函数以Benchmark开头而非 Test开头.
通过为go test命令添加-bench标记的方式运行benchmark测试,参数的值是一个正则表达式,如果运行全部benchmark测试,则指定为-bench=.即可;
为了避免普通的测试case被执行,可以加上-run=^$(匹配空函数)来跳过执行;
如果希望同步观察内存使用,可以通过-benchmem标记位来实现;
为了确保结果的一致性,可以加上-count参数来重复运行benchmark;
每个benchmark默认情况下会运行至少一分钟,我们可以通过 -benchtime标记位来生成一个更准确的结果;
b.N 的值会以1, 2, 5, 10, 20, 50, …这样的规律递增下去直到运行时间超过或等于1秒钟(可以通过上面的 -benchtime修改),这里不是时间一到就截止,运行期还会综合运行时间的稳定性来判断是否继续;
接上一条,由于程序判断运行时间稳定才会停止运行,所以千万不要在loop循环里面使用一个变化的值作为函数的参数,这里要注意b.N是也是一个动态变化的值!
例子
func BenchmarkAllocOne(b *testing.B) {
for n := 0; n < b.N; n++ {
one()
}
}
func BenchmarkAllocBatch(b *testing.B) {
for i := 0; i < b.N; i++ {
batch()
}
}
go test -run=^$ -bench=^BenchmarkAlloc* -benchmem
goos: darwin
goarch: amd64
pkg: xxxxselftest
cpu: VirtualApple @ 2.50GHz
BenchmarkAllocOne-10 2028 518624 ns/op 5132014 B/op 1000 allocs/op
BenchmarkAllocBatch-10 2240 488412 ns/op 5142773 B/op 1052 allocs/op
PASS
ok xxxx/selftest 3.200s
第一列是执行的函数名称,第二列是总的执行次数,第三列是平均运行时间;