上一篇我们讲了单元测试,也写了测试 demo,现在我们能保证程序能正常运行了。
但是,我们还经常听别人说,你这程序性能不行呀。
那这性能又该怎么测试呢?
这就涉及到基准测试范畴了,我们今天的文章就分享下有关基准测试的内容。
我去查了下百度百科怎么解释这个名词的:
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。
你可以理解是基于某个准则进行测试,便能得出一个结果。
比如:在几核几G的服务器上,运行这段代码100次,耗时多久。
我们拿处理同一个业务的代码,在同一台机器上运行,相同的次数,就能得出哪个性能更好了。
Go 语言也给我们提供了一系列的基准测试工具,和我们写单元测试类似。
我们再来复习下,单元测试的一些特点:
1、写在 _test.go 文件里面
2、func 以 Test 开头
而我们的基准测试代码也是写在 _test 文件里面,但 func 则是以 Benchmark
开头。
我们现在来测试下我们上一篇的 JointString
方法的性能。
于是我们只需要在 _test.go 文件里面写上:
// 基准测试
func BenchmarkJointString(b *testing.B) {
for i := 0; i < b.N; i++ {
JointString("c","dd")
}
}
还是一样的,Benchmark
后面的名字没影响规定,你随便取,我这里习惯和要测试的方法名同名。
这里我们用到的包就需要换一下了,单元测试我们用的 testing.T
基准测试我们用 testing.B
这个包。
方法里面的 b.N 是我们测试的关键,这是一个 int 变量。
这个 N 表示单位时间内被执行 N 次,因为我们测试时可以指定我们的基准测试跑多久,默认是 1 秒。
我们的代码写好了,怎么启动测试呢?
如果你使用的是 GoLand 开发 IDE,你在 _test 文件里面写的基准测试代码旁边会有一个绿色箭头,你可以直接点击调试,如下:
我们也可以在控制台,使用命令启动:
go test -bench=JointString
命令解释:
在单元测试的命令后面多加了一个参数 -bench ,这参数后面跟的参数是匹配规则,支持正则匹配。
如果你想运行全部的基准测试,可以直接使用 . 来匹配。
运行结果:
$ go test -bench=JointString
goos: darwin
goarch: amd64
pkg: map-demo/utils
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkJointString-4 49309273 22.51 ns/op
PASS
ok map-demo/utils 3.148s
我们只需要关注 22.51 ns/op 这个参数,表示每个操作耗时 22.51 纳秒。
我们的基准测试默认时间是运行 1 秒,你也可以设置更长点:
$ go test -bench=JointString -benchtime=5s
goos: darwin
goarch: amd64
pkg: map-demo/utils
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkJointString-4 277435632 19.21 ns/op
PASS
ok map-demo/utils 7.820s
-benchtime 参数可以调整我们的测试时间。
同样你还可以指定我们的测试测试:
$ go test -bench=JointString -count=5
goos: darwin
goarch: amd64
pkg: map-demo/utils
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkJointString-4 51917732 19.91 ns/op
BenchmarkJointString-4 53977221 19.15 ns/op
BenchmarkJointString-4 60219956 17.87 ns/op
BenchmarkJointString-4 66581846 17.10 ns/op
BenchmarkJointString-4 63819561 17.34 ns/op
PASS
ok map-demo/utils 8.796s
-count 参数就是指定我们测试的次数。
基准测试还可以对一段代码可能存在的内存分配进行统计:
$ go test -bench=JointString -benchmem
goos: darwin
goarch: amd64
pkg: map-demo/utils
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkJointString-4 50401544 23.02 ns/op 0 B/op 0 allocs/op
PASS
ok map-demo/utils 4.731s
0 B/op 表示每一次调用需要分配的字节数,这里我们只是做了一个字符拼接。
0 allocs/op 表示每一次调用需要分配的内存次数
有时候这个基准测试并不是特别准。
关于基准测试,一般我们是不建议使用自己的开发电脑做测试。
为什么呢?
因为我们自己的开发电脑,往往都跑有其他的程序,比如 微信、QQ 开发工具等。
这些程序都会影响我们测试程序的性能。
比较好的建议是专门用一台机器来做测试,这样跑出来的测试数据相对来说会更加的准确。
你学废了么?