前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >老板:如何证明你的程序性能好?

老板:如何证明你的程序性能好?

作者头像
小锟哥哥
发布2022-05-10 09:06:44
2300
发布2022-05-10 09:06:44
举报
文章被收录于专栏:GoLang全栈

上一篇我们讲了单元测试,也写了测试 demo,现在我们能保证程序能正常运行了。

但是,我们还经常听别人说,你这程序性能不行呀

那这性能又该怎么测试呢?

这就涉及到基准测试范畴了,我们今天的文章就分享下有关基准测试的内容。

什么是基准测试?

我去查了下百度百科怎么解释这个名词的:

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

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

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

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

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

开始写基准测试

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

1、写在 _test.go 文件里面

2、func 以 Test 开头

而我们的基准测试代码也是写在 _test 文件里面,但 func 则是以 Benchmark 开头。

我们现在来测试下我们上一篇的 JointString 方法的性能。

于是我们只需要在 _test.go 文件里面写上:

代码语言:javascript
复制
// 基准测试
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 启动

如果你使用的是 GoLand 开发 IDE,你在 _test 文件里面写的基准测试代码旁边会有一个绿色箭头,你可以直接点击调试,如下:

基于命令行

我们也可以在控制台,使用命令启动:

代码语言:javascript
复制
go test -bench=JointString

命令解释:

在单元测试的命令后面多加了一个参数 -bench ,这参数后面跟的参数是匹配规则,支持正则匹配。

如果你想运行全部的基准测试,可以直接使用 . 来匹配。

运行结果:

代码语言:javascript
复制
$ 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 秒,你也可以设置更长点:

代码语言:javascript
复制
$ 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 参数可以调整我们的测试时间。

自定义次数

同样你还可以指定我们的测试测试:

代码语言:javascript
复制
$ 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 参数就是指定我们测试的次数。

统计测试内存

基准测试还可以对一段代码可能存在的内存分配进行统计:

代码语言:javascript
复制
$ 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 开发工具等。

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

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

你学废了么?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是基准测试?
  • 开始写基准测试
  • 如何启动?
    • 基于 GoLand 启动
      • 基于命令行
        • 自定义测试时间
          • 自定义次数
            • 统计测试内存
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档