首页 > 其他 > 详细

Go 基准测试

时间:2019-02-16 18:24:09      阅读:254      评论:0      收藏:0      [点我收藏+]

什么是基准测试?

     基准测试,是一种测试代码性能的方式,比如你有多种不同的方案,都可以解决问题,那么到底哪种方案性能

更好呢?这时候我们就可以使用基准测试

     基准测试主要是通过测试 CPU 和 内存的效率,来评估被测试代码的性能,进而找到更好的解决方案

如何编写基准测试?

      基准测试代码的编写和单元测试非常相似,它也有一定的规则,看如下示例:

      iota_test.go

package main_test

import (
	"fmt"
	"testing"
)

func BenchmarkSprintf(b *testing.B) {
	num := 10
	b.ResetTimer()
	for i := 0; i < b.N; i++{
		fmt.Sprintf("%d",num)
	}
}

-----------------------------------------------

输出结果:

goos: windows
goarch: amd64
BenchmarkSprintf-8      20000000                93.0 ns/op
PASS
ok      _/E_/GoProject/development/src  3.780s

  规则如下:

       1.基准测试的代码文件必须以 _test.go 结尾

       2.基准测试的函数必须以 Benchmark 开头,必须是可以导出的

       3.基准测试的函数必须接受一个指向 Benchmark 类型的指针作为唯一参数

       4.基准测试函数不能有返回值

       5.b.ResetTimer 是重置计时器,这样可以避免 for 循环之前的初始化代码干扰

       6.最后的 for 循环很重要,被测试的代码要放到 for 循环里

       7. b.N 是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能

       运行基准测试也要使用 go test 命令,不过我们需要加上 -bench= 标记,它接受一个表达式作为参数,匹配

基准测试的函数,. 表示运行所有基准测试

       因为默认情况下,go test 会运行单元测试,为了防止单元测试的输出影响我们查看基准测的结果,我们可以

使用 -run 匹配一个从来没有的单元测试,过滤掉单元测试,我们这里使用 none,因为我们基本上不会创建这个名

字的单元测试方法

       下面看一下输出结果的内容,我们可以看到在函数的后面有一个 -8 ,表示运行时对应的 GOMAXPROCS 的值。接着的

20000000 表示 for 循环的次数,也就是被测试代码调用的次数,最后的 93.0 ns/op 表示每次需要花费 93.0 纳秒

       以上测试时间默认是 1s,也就是 1s 的时间被调用 20000000 次,每次花费 93.0 纳秒,如果想要测试运行的时间加长,

可以使用 -benchtime 指定,比如 3s,输出结果如下:

goos: windows
goarch: amd64
BenchmarkSprintf-8      50000000                97.5 ns/op
PASS
ok      _/E_/GoProject/development/src  6.575s

  可以看到,加长了测试运行时间,测试被调用的次数变大了,但是每次调用花费的时间变化不大,一般来说测试运行的时间

不要超过 3s 意义不大

Go 基准测试

原文:https://www.cnblogs.com/leeyongbard/p/10388549.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!