ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Golang 基准测试Benchmark

2021-09-03 12:34:20  阅读:235  来源: 互联网

标签:benchmark bytes 基准 Benchmark Golang 测试 go op


基准测试

Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试。

基本规则

  1. 基准测试的代码文件必须以_test.go结尾
  2. 基准测试的函数必须以Benchmark开头,必须是可导出的
  3. 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
  4. b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
  5. 最后的for循环很重要,被测试的代码要放到循环里
  6. b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能

常用命令

$ go test -bench=. -benchmem
  1. 使用 -bench=. 标记,它接受一个表达式作为参数,匹配基准测试的函数,. 表示运行所有基准测试。
  2. 使用 -benchmem 提供每次操作分配内存的次数,以及每次操作分配的字节数。
  3. 使用 -run=none 匹配单元测试方法,这里使用 none 是因为没有这个名字的单元测试方法,等效于过滤掉单元测试的输出。
  4. 使用 -benchtime=3s 指定测试的时间,例如3秒,测试时间默认是1秒。
  5. 使用 -count=3 用来设置 benchmark 的轮数。例如,进行3轮benchmark。

举个栗子

评估1000个字符串的连接性能,分别使用 + 操作符、bytes.Bufferstrings.Builder 进行测试。

package main

import (
	"bytes"
	"strings"
	"testing"
)

var strLen = 1000

func BenchmarkConcatString(b *testing.B) {
	var str string
	i := 0
	b.ResetTimer()
	for n := 0; n < b.N; n++ {
		str += "x"

		i++
		if i >= strLen {
			i = 0
			str = ""
		}
	}
}

func BenchmarkConcatBuffer(b *testing.B) {
	var buffer bytes.Buffer

	i := 0

	b.ResetTimer()
	for n := 0; n < b.N; n++ {
		buffer.WriteString("x")

		i++
		if i >= strLen {
			i = 0
			buffer = bytes.Buffer{}
		}
	}
}

在终端运行命令 go test -bench=. -benchmem,输入如下信息:

$ go test -bench=^BenchmarkConcat -benchmem
goos: darwin
goarch: amd64
pkg: go_learning_notes/benchmark
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkConcatString-4          8040235               140.5 ns/op           530 B/op          0 allocs/op
BenchmarkConcatBuffer-4         168521010                6.384 ns/op           2 B/op          0 allocs/op
BenchmarkConcatBuilder-4        464368256                2.475 ns/op           2 B/op          0 allocs/op
PASS
ok      go_learning_notes/benchmark     5.035s

通过上面的指标信息,可以得出结论 bytes.Bufferstrings.Builder+ 操作符 更快。

参考文章

  1. Practical Go Benchmarks:https://www.instana.com/blog/practical-golang-benchmarks/
  2. Benchmarks of Go serialization methods:https://github.com/alecthomas/go_serialization_benchmarks
  3. Debugging performance issues in Go programs:https://github.com/golang/go/wiki/Performance

标签:benchmark,bytes,基准,Benchmark,Golang,测试,go,op
来源: https://www.cnblogs.com/marszuo/p/15222552.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有