Go之Benchmark
一、概念
基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器。
指定一个时间(默认是1秒),看测试对象在达到时间上限时,最多能被执行多少次和在此期间测试对象内存分配情况。
二、特点
- 基准测试的代码文件必须以_test.go结尾
- 基准测试的函数必须以Benchmark开头
- 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
- 基准测试函数不能有返回值
- b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
- 最后的for循环很重要,被测试的代码要放到循环里
- b.N是基准测试框架提供的,表示循环的次数
三、常用API
- b.StopTimer()
- b.StartTimer()
- b.ResetTimer()
- b.Run(name string, f func(b *B))
- b.RunParallel(body func(*PB))
- b.ReportAllocs()
- b.SetParallelism(p int)
- b.SetBytes(n int64)
- 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相关推荐
- 基于深度学习的点云配准Benchmark
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨千百度@知乎 来源丨https://zhuanlan.zhihu.com/p/289620126 ...
- apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?
我尝试在我的centos上使用 Is there a way to install Apache Bench (ab) without installing apache解决方案安装Apache Be ...
- Sebastian Ruder 发文:Benchmark 的挑战与机遇!
过去数年,在迁移学习的推动下,NLP的模型变得越来越强大.性能快速提升的AI算法,使得现在面向AI性能的基准测试变得有些落后.例如,近来不断涌现的AI模型,在SuperGLUE.SQuAD等标准基准上 ...
- 华为开源CTR Benchmark,学术界SOTAs的照妖镜?
来源 | 夕小瑶的卖萌屋作者 | 卖萌酱 众所周知,与CV.NLP不同,搜索.广告.推荐领域的学术界paper在很多问题上喜欢各玩各的,缺乏一个统一可比的benchmark. 就推荐/广告中核心的CT ...
- ICLR 2020| 最新NAS benchmark:0.1秒完成NAS算法搜索
2020-01-19 16:37 专题:ICLR 2019 导语:ICLR论文解读~ 雷锋网AI科技评论按:本文对悉尼科技大学博士生董宣毅发表于 ICLR 2020 的录用Spotlight论文< ...
- [转载]什么情况下应该设置 cudnn.benchmark = True?
总的来说,大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题. 一般来讲,应该遵循以下准则: 如果网络的输 ...
- 中国最大AI芯片发布,顺手拿下四个国内第一,带Benchmark的那种
金磊 发自 上海 量子位 报道 | 公众号 QbitAI 上回书说到--<一份邀请函引发的中国芯片新猜想>. 于是乎,我为了验证这个猜想是否正确,特此前来上海一探究竟. 直接揭晓答案:猜对 ...
- 说人话,搜代码,Facebook发布神经代码搜索数据集+benchmark
郭一璞 发自 中关村 量子位 报道 | 公众号 QbitAI 怎么才能方便的找自己需要的代码? 最好是能用人话来直接搜索.说什么就给什么那种. Facebook刚刚发布了新benchmark和数据集, ...
- cudnn.benchmark
Benchmark模式会提升计算速度,但是由于计算中有随机性,每次网络前馈结果略有差异. torch.backends.cudnn.benchmark = True 1 如果想要避免这种结果波动,设置 ...
- YCSB benchmark测试mongodb性能——和web服务器测试性能结果类似
转自:http://blog.sina.com.cn/s/blog_48c95a190102v9kg.html YCSB(Yahoo! Cloud Serving Benchmark) ...
最新文章
- 用动态实现扩展TVM
- 一种视觉惯性+激光传感器的SLAM系统
- IIS7.5 错误代码0x8007007e HTTP 错误 500.19
- html5 支持php标签吗,HTML5标签大全
- HTML5 MediaStream的运用
- 一个有趣的观察:关于内向和外向
- ios html5缩小,IOS H5页面图片点击捏合放大缩小
- JNI中的内存管理(转)
- 多进程与多线程通信同步机制
- atitit.细节决定成败的适合情形与缺点
- 95-080-058-源码-启动-启动taskexecutor
- 模板 · ISAP网络流+GAP优化+弧优化
- Splay_Tree 模板(区间修改,旋转操作)
- scrum角色及其职责介绍
- java基础代码-实现键盘输入
- 计算机网络物理地址,4-3 查询计算机网卡物理地址的方法
- 吉木萨尔县文化旅游策划案——天山圣地,武侠之都!
- 王者转区显示服务器列表错误,王者荣耀转区功能-王者转区服务-王者转移号-王者转服...
- 程序开发中 status 还是 state
- MotoSimEG-VRC软件:机器人工作路径轨迹跟踪功能使用方法