go 语言 性能测试函数中的计时器

计时器

用来记录性能测试函数在每次运行时消耗的时间,同时它也记录了此次运行对内存分配的字节数和分配的次数。与之相关的有三个方法StartTimerStopTimerResetTimer

运行go test 时就用到了计时器,命令会启用这个函数的计时器,当函数执行完成,停止计时器,记录下此次的运行时间,然后与默认执行时间上限(默认为1秒)做比较,如果没有超过,则增大b.N的值,再次执行该函数,如此反复,直到函数的运行时间大于或等于执行时间上限,从而得到b.N的值,即函数的最大执行次数及对应的时间,从而得出最终的测试结果

通过对 StartTimer、StopTimer的调用,我们可以在测试中去除那些本不应该计入测试时间的代码的执行时间,比如一些测试前的准备代码

func BenchmarkGetPrimes(b *testing.B) {
	b.StopTimer()
	// 模拟某个耗时但与被测程序关系不大的操作
	time.Sleep(time.Millisecond * 500)
	max := 10000
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		GetPrimes(max)
	}
}

time.Sleep用来模拟得到max的值所要进行的耗时操作,而我们要测试的是GetPrimes()的性能,不应计入计算max值所用的时间,所以要把开始时间设置在得到max之后。

通过 b.StopTimer()b.StartTimer()的配合使用,就可以去除任何一段代码的执行时间,b.ResetTimer()是去除它之前代码的执行时间。通过对计时器的调用,可以让测试函数的执行时间更加准确。