一、概念

基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器。

指定一个时间(默认是1秒),看测试对象在达到时间上限时,最多能被执行多少次和在此期间测试对象内存分配情况。

二、特点

  1. 基准测试的代码文件必须以_test.go结尾
  2. 基准测试的函数必须以Benchmark开头
  3. 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
  4. 基准测试函数不能有返回值
  5. b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
  6. 最后的for循环很重要,被测试的代码要放到循环里
  7. b.N是基准测试框架提供的,表示循环的次数

三、常用API

  1. b.StopTimer()
  2. b.StartTimer()
  3. b.ResetTimer()
  4. b.Run(name string, f func(b *B))
  5. b.RunParallel(body func(*PB))
  6. b.ReportAllocs()
  7. b.SetParallelism(p int)
  8. b.SetBytes(n int64)
  9. testing.Benchmark(f func(b *B)) BenchmarkResult

四、操作的命令

go test -bench=BenchmarkFoo

go test -bench=.

// 加上 -bench= 测试名字, .表示运行所有的基准测试,名字可用正则。

go test -bench=BenchmarkFoo -benchtime=5s/10000x

// 加上 -benchtime 设置时间,s表示秒,x表示执行次数

go test -bench=BenchmarkFoo -benchtime=5s -count=3

// 加上 -count 表示几次测试

go test -bench=. -benchmem

// 加上 -benchmem 查看内存

go test -bench=. -benchmem -cpuprofile profile.out

go test -bench=. -benchmem -memprofile memprofile.out

go tool pprof profile.out

go tool pprof memprofile.out

// 结合 pprof 输出查看 cpu和内存。

五、使用的方式

串行

func BenchmarkFoo(b *testing.B) {for i:=0; i<b.N; i++ {dosomething()}
}

并行

func BenchmarkFoo(b *testing.B) {b.RunParallel(func(pb *testing.PB) {for pb.Next() {dosomething()}})
}

并行的goroutine个数是默认等于runtime.GOMAXPROCS(0)。

释义:创建P个goroutine之后,再把b.N打散到每个goroutine上执行

增大goroutine的个数,使用 b.SetParallelism(p int)

func BenchmarkFoo(b *testing.B) {
b.SetParallelism(10)b.RunParallel(func(pb *testing.PB) {for pb.Next() {dosomething()}})
}

// 原理: 最终goroutine个数 = 形参p的值 * runtime.GOMAXPROCS(0)

numProcs := b.parallelism * runtime.GOMAXPROCS(0)

StartTimer()、StopTimer()、ResetTimer()

init(); // 初始化工作
b.ResetTimer()
for i:=0; i<b.N; i++ { dosomething1() }
b.StopTimer()otherWork(); // 例如做一些转换工作
b.StartTimer()
for i:=0; i<b.N; i++ { dosomething2() }

方式二

init(); // 初始化工作
b.ResetTimer()
for i:=0; i<b.N; i++ {flag := dosomething()if flag {b.StopTimer()} else {b.StartTimer()}
}

StartTimer()、ResetTimer() 都是记录当前时间为开始时间 和 内存分配情况,不过 ResetTimer()多了清空重置操作。

StopTimer() 累计记录执行的时间(当前时间 - 记录的开始时间),累计记录内存分配次数和分配字节数

Run()

表驱动法

func BenchmarkRR(b *testing.B) {tests := []struct {keyLength   int}{{keyLength: 16},{keyLength: 32},}for _, t := range tests {name := fmt.Sprintf("%vKeyLength", t.keyLength)b.Run(name, func(b *testing.B) {dosomething(b, t.keyLength)})}
}

六、例子

fib.go

// 斐波那契数列
func fib(n int) int {if n < 2 {return n}return fib(n-1) + fib(n-2)
}
func sum(a, b int) int {return a + b
}

fib_test.go

import "testing"
func BenchmarkFib10(b *testing.B) {for n := 0; n < b.N; n++ {fib(10)}
}
func BenchmarkFib20(b *testing.B) {for n := 0; n < b.N; n++ {fib(20)}
}
func BenchmarkSum(b *testing.B) {for n := 0; n < b.N; n++ {sum(1, 2)}
}

使用正则

使用-benchting

使用-benchting 的x单位

使用-count

Go之Benchmark相关推荐

  1. 基于深度学习的点云配准Benchmark

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨千百度@知乎 来源丨https://zhuanlan.zhihu.com/p/289620126 ...

  2. apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?

    我尝试在我的centos上使用 Is there a way to install Apache Bench (ab) without installing apache解决方案安装Apache Be ...

  3. Sebastian Ruder 发文:Benchmark 的挑战与机遇!

    过去数年,在迁移学习的推动下,NLP的模型变得越来越强大.性能快速提升的AI算法,使得现在面向AI性能的基准测试变得有些落后.例如,近来不断涌现的AI模型,在SuperGLUE.SQuAD等标准基准上 ...

  4. 华为开源CTR Benchmark,学术界SOTAs的照妖镜?

    来源 | 夕小瑶的卖萌屋作者 | 卖萌酱 众所周知,与CV.NLP不同,搜索.广告.推荐领域的学术界paper在很多问题上喜欢各玩各的,缺乏一个统一可比的benchmark. 就推荐/广告中核心的CT ...

  5. ICLR 2020| 最新NAS benchmark:0.1秒完成NAS算法搜索

    2020-01-19 16:37 专题:ICLR 2019 导语:ICLR论文解读~ 雷锋网AI科技评论按:本文对悉尼科技大学博士生董宣毅发表于 ICLR 2020 的录用Spotlight论文< ...

  6. [转载]什么情况下应该设置 cudnn.benchmark = True?

    总的来说,大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题. 一般来讲,应该遵循以下准则: 如果网络的输 ...

  7. 中国最大AI芯片发布,顺手拿下四个国内第一,带Benchmark的那种

    金磊 发自 上海 量子位 报道 | 公众号 QbitAI 上回书说到--<一份邀请函引发的中国芯片新猜想>. 于是乎,我为了验证这个猜想是否正确,特此前来上海一探究竟. 直接揭晓答案:猜对 ...

  8. 说人话,搜代码,Facebook发布神经代码搜索数据集+benchmark

    郭一璞 发自 中关村 量子位 报道 | 公众号 QbitAI 怎么才能方便的找自己需要的代码? 最好是能用人话来直接搜索.说什么就给什么那种. Facebook刚刚发布了新benchmark和数据集, ...

  9. cudnn.benchmark

    Benchmark模式会提升计算速度,但是由于计算中有随机性,每次网络前馈结果略有差异. torch.backends.cudnn.benchmark = True 1 如果想要避免这种结果波动,设置 ...

  10. YCSB benchmark测试mongodb性能——和web服务器测试性能结果类似

    转自:http://blog.sina.com.cn/s/blog_48c95a190102v9kg.html         YCSB(Yahoo! Cloud Serving Benchmark) ...

最新文章

  1. 用动态实现扩展TVM
  2. 一种视觉惯性+激光传感器的SLAM系统
  3. IIS7.5 错误代码0x8007007e HTTP 错误 500.19
  4. html5 支持php标签吗,HTML5标签大全
  5. HTML5 MediaStream的运用
  6. 一个有趣的观察:关于内向和外向
  7. ios html5缩小,IOS H5页面图片点击捏合放大缩小
  8. JNI中的内存管理(转)
  9. 多进程与多线程通信同步机制
  10. atitit.细节决定成败的适合情形与缺点
  11. 95-080-058-源码-启动-启动taskexecutor
  12. 模板 · ISAP网络流+GAP优化+弧优化
  13. Splay_Tree 模板(区间修改,旋转操作)
  14. scrum角色及其职责介绍
  15. java基础代码-实现键盘输入
  16. 计算机网络物理地址,4-3 查询计算机网卡物理地址的方法
  17. 吉木萨尔县文化旅游策划案——天山圣地,武侠之都!
  18. 王者转区显示服务器列表错误,王者荣耀转区功能-王者转区服务-王者转移号-王者转服...
  19. 程序开发中 status 还是 state
  20. MotoSimEG-VRC软件:机器人工作路径轨迹跟踪功能使用方法

热门文章

  1. oracle silent新增实例
  2. 看上去很美--次世代游戏平台XBOX360测评
  3. 免费下载谷歌地球高清卫星影像和高程DEM教程
  4. 怎么设置虚拟拨号服务器,如何设置PPPoE上网(ADSL虚拟拨号)
  5. Alpine Linux添加Let's Encrypt CA证书或者自签CA证书
  6. ​几张图看懂区块链到底是什么?
  7. 如何在Windows资源管理器中自定义文件夹背景和图标
  8. 获取物料批次特性取值BAPI_SAP刘梦_新浪博客
  9. 现货黄金投资的鳄鱼法则
  10. Flutter 打开外部第三方应用