简言
基准测试是测量一个程序在固定工作负载下的性能
在Golang中,基准测试函数以Benchmark为前缀并且带有一个 *testing.B 类型的参数
规则
- 基准测试的代码文件必须以_test.go结尾
- 基准测试的函数必须以Benchmark开头
- 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数,即比如func BenchmarkMapkeys1(b *testing.B)
- 基准测试函数不能有返回值
- b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
- 最后的for循环很重要,被测试的代码要放到循环里
- b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
- 不要修改b.N,因为基准测试是很智能的,它会自动根据你要测试函数的运行时间动态调整该值
- b.N 从 1 开始,如果基准测试函数在1秒内就完成 (默认值),则 b.N 增加,并再次运行基准测试函数。b.N 在近似这样的序列中不断增加;1, 2, 3, 5, 10, 20, 30, 50, 100,1000,20000 等等。 基准框架试图变得聪明,如果它看到当b.N较小而且测试很快就完成的时候,它将让序列增加地更快
示例:(测试int转string的SprIntf()函数的效率)
实验结果如下图(请注意红框中的,比如文件名,函数名,测试命令):
测试结果分析:
1. BenchmarkTest1-4 表测试的函数名,-4 表示GOMAXPROCS(线程数)的值为4
2. 10000000 表一共执行了一千万次,即B.N的值
3. 107 ns/op表平均每次操作花费了107纳秒
4. 16 B/op 表每次操作申请了16Byte的内存申请
5. 2 allocs/op 表每次操作申请了2次内存
参数介绍
1. 参数-bench,它指明要测试的函数;点字符意思是测试当前所有以Benchmark为前缀函数
2. 参数-benchmem,性能测试的时候显示测试函数的内存分配大小,内存分配次数的统计信息
3. 参数-count n,运行测试和性能多少此,默认一次
PS:
有些时候在benchmark之前需要做一些准备工作,并且,我们不希望这些准备工作纳入到计时里面,我们可以使用 b.ResetTimer(),代表重置计时为0,以调用时的时刻作为重新计时的开始