golang单元测试

181 阅读1分钟

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

第一列是执行的函数名称,第二列是总的执行次数,第三列是平均运行时间;