2、Golang-Benchmark性能测试

简单整两句

Benchmark测试通常用于对代码片段的性能测试和对第三方库的性能进行评估测试。
Benchmark性能测试用例也是测试代码,所以它应该写在以_test结尾(xxx_test.go)的测试用例代码文件中。

形式如下:
在这里插入图片描述
跟普通的测试用例不一样的地方是,Benchmark性能测试用例函数的开头是以Benchmark开头的,而不Test开头的。

参数类型是testing.B,而不是testing.T。

在调用被测函数的前后,还需要添加几行辅助测试的代码,如ResetTimer、for循环、StopTimer。

上代码

package benchmark_test

import (
	"bytes"
	"testing"
)

func BenchmarkConcatStringByAdd(b *testing.B) {

	elems := []string{"1", "2", "3", "4", "5"}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		ret := ""
		for _, elem := range elems {
			ret += elem
		}
	}
	b.StopTimer()
}

func BenchmarkConcatStringByBytesBuffer(b *testing.B) {
	elems := []string{"1", "2", "3", "4", "5"}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		var buf bytes.Buffer

		for _, elem := range elems {
			buf.WriteString(elem)

		}
	}
	b.StopTimer()

}

代码中两个Benchmark测试函数分别用于测试+=和bytes.Buffer两种方法做字符串连接的性能。

运行Benchmark性能测试用例

$ go test -bench=.
goos: windows
goarch: amd64
pkg: bench
BenchmarkConcatStringByAdd-4             5479839               215 ns/op
BenchmarkConcatStringByBytesBuffer-4    12910694                89.6 ns/op
PASS
ok      bench   2.921s

可以看到,两种字符串连接操作的性能差距是巨大的。

测试结果输出中的5479839和12910694是待测函数的运行次数,也就是for循环中的b.N,后面的215 ns/op和89.6 ns/op是每运行一次的耗时,单位的纳秒。

内存分析

如果想进一步了解造成性能差异的原因,可以在运行benchmark测试用例时再加删上-benchmem参数:

$ go test -bench=. -benchmem
goos: windows
goarch: amd64
pkg: bench
BenchmarkConcatStringByAdd-4             5384275               199 ns/op             16 B/op           4 allocs/op
BenchmarkConcatStringByBytesBuffer-4    13493425                89.4 ns/op           64 B/op           1 allocs/op
PASS
ok      bench   2.893s

其中的“4 allocs/op”代表测试一次+=字符串连接会存在4次内存分配。
每次测试buf.WriteString连接字符串会存在1次内存分配。

所以,内存分配次数较少的方法性能会更好。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值