写好 Go 程序基准测试的小白教程

1. 什么是基准测试?

百度百科怎么解释这个名词的:

基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。

你可以理解是基于某个准则进行测试,便能得出一个结果。

比如:在几核几G的服务器上,运行这段代码100次,耗时多久。

我们拿处理同一个业务的代码,在同一台机器上运行,相同的次数,就能得出哪个性能更好了。

Go 语言也给我们提供了一系列的基准测试工具,和我们写单元测试类似。

2. 开始写基准测试

我们再来复习下,单元测试的一些特点:

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 秒。

3. 如何启动?

我们的代码写好了,怎么启动测试呢?

基于 GoLand 启动

如果你使用的是 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 表示每一次调用需要分配的内存次数

有时候这个基准测试并不是特别准。

4. 总结

关于基准测试,一般我们是不建议使用自己的开发电脑做测试。

为什么呢?

因为我们自己的开发电脑,往往都跑有其他的程序,比如 微信、QQ 开发工具等。

这些程序都会影响我们测试程序的性能。

比较好的建议是专门用一台机器来做测试,这样跑出来的测试数据相对来说会更加的准确。

全部评论(0)