简言

基准测试是测量一个程序在固定工作负载下的性能

在Golang中,基准测试函数以Benchmark为前缀并且带有一个 *testing.B 类型的参数

规则

  1. 基准测试的代码文件必须以_test.go结尾
  2. 基准测试的函数必须以Benchmark开头
  3. 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数,即比如func BenchmarkMapkeys1(b *testing.B)
  4. 基准测试函数不能有返回值
  5. b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
  6. 最后的for循环很重要,被测试的代码要放到循环里
  7. b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
  8. 不要修改b.N,因为基准测试是很智能的,它会自动根据你要测试函数的运行时间动态调整该值
  9. b.N 从 1 开始,如果基准测试函数在1秒内就完成 (默认值),则 b.N 增加,并再次运行基准测试函数。b.N 在近似这样的序列中不断增加;1, 2, 3, 5, 10, 20, 30, 50, 100,1000,20000 等等。 基准框架试图变得聪明,如果它看到当b.N较小而且测试很快就完成的时候,它将让序列增加地更快

示例:(测试int转string的SprIntf()函数的效率)

package test
import (
"fmt"
"testing"
)
func BenchmarkTest1(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = fmt.Sprintf("%d", i)
}
}

实验结果如下图(请注意红框中的,比如文件名,函数名,测试命令):

go benchmark 性能测试 单元测试 基准测试 使用方法详解_golang benchmark

测试结果分析:

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,以调用时的时刻作为重新计时的开始