栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Go语言

2-3 golang项目中benchmark的写法

Go语言 更新时间:发布时间: 百科书网 趣学号

基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器。

在日常生活中,我们使用速度 m/s(单位时间内物体移动的距离)大小来衡量一辆跑车的性能,同理,我们可以使用”单位时间内程序运行的次数“来衡量程序的性能。

在日常开发中,如果和同事在代码实现上有分歧,不用多费口舌,跑个分就知道谁牛X。

注意:在进行基准测试时,硬件资源直接影响测试结果,为了保证测试结果的可重复性,需要尽可能地保证硬件资源一致。(单一变量原则)

通用benchmark的概念了解:Benchmark简介

Benchmark简介 - stardsd - 博客园

benchmark函数注意事项
  • benchmark函数一般以Benchmark开头
  • benchmark函数也是test case之一,也会受TestMain限制
  • benchmark的case一般会跑b.N次,而且每次执行都会如此
  • 在执行过程中会根据实际case的执行时间是否稳定会增加b.N的次数以达到稳态

程序示例:

package main

import (
	"fmt"
	"testing"
)

// 待测试程序
func Print1to9() int {
	res := 0
	for i := 1; i <= 9; i++ {
		res += i
	}
	return res
}

//func TestPrint1(t *testing.T) {
func testPrint1(t *testing.T) {
	fmt.Printf("我是TestPrint1")
}

//func TestPrint2(t *testing.T) {
func testPrint2(t *testing.T) {
	fmt.Printf("我是TestPrint2")
}


func TestAll(t *testing.T) {
	t.Run("testPrint1", testPrint1)
	t.Run("testPrint2", testPrint2)
}

func TestMain(m *testing.M)  {
	fmt.Println("测试初始化开始.....")
	m.Run()
}

// BenchmarkAll也受TestMain限制
func BenchmarkAll(b *testing.B) {
	for n := 0; n < b.N; n++ {
		Print1to9()
	}
}

运行结果:

  • go test 命令默认不执行 benchmark 测试,需要加上 -bench 参数,该参数支持正则表达式,只有匹配到的测试用例才会执行,使用 . 则运行所有测试用例
H:goProjectrpcDeveloptestTools>go test -bench=.
测试初始化开始.....
我是TestPrint1我是TestPrint2goos: windows
goarch: amd64
pkg: rpcDevelop/testTools
cpu: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
BenchmarkAll-4          235142658                5.249 ns/op
PASS
ok      rpcDevelop/testTools    1.873s

 benchmark 测试用例结果参数解读

以下面的运行结果为例进行说明:

  • BenchmarkFib10-4 中的 4 即 GOMAXPROCS,默认等于 CPU 核数
  • 3287449 357 ns/op 表示单位时间内(默认是1s)被测函数运行了 3287449 次,每次运行耗时 357ns   3287449*357ns=1.173s(耗时比 1s 略多,因为测试用例执行、销毁等是需要时间的)
  • ok learnGolang 3.418s 表示本次测试总耗时

benchmark的测试需要稳态的函数

注意,benchmark的测试需要稳态的函数,非稳态测试时间很长或者不定,例如下面的函数aaa()中的n会变化。

程序示例:

package main

import (
	"fmt"
	"testing"
)


func TestMain(m *testing.M)  {
	fmt.Println("测试初始化开始.....")
	m.Run()
}

func aaa(n int) int {
	for n > 0 {
		n--
	}
	return n
}

// BenchmarkAll也受TestMain限制
func BenchmarkAll(b *testing.B) {
	for n := 0; n < b.N; n++ {
		aaa(n)
	}
}

运行结果:

H:goProjectrpcDeveloptestTools>go test -bench=.
测试初始化开始.....
goos: windows
goarch: amd64
pkg: rpcDevelop/testTools
cpu: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
BenchmarkAll-4            548252            116787 ns/op
PASS
ok      rpcDevelop/testTools    64.644s

benchmark测试命令进阶

go benchmark 默认测试时间是 1s,同样的原理,为了提升测试准确度,我们可以使用该参数适当增加时长。此外还能设置运行次数,CPU使用核数,内存分配数等。

  • 运行时间:-benchtime=5s
  • 运行次数:-count=3 
  • 设置 benchmark 所使用的 CPU 核数:-cpu=1,4,6,10,12
  • go 语言中,slice 有一个 cap 属性,合理的设置该值,可以减少内存分配次数,分配大小,提升程序性能。

示例:

H:goProjectrpcDeveloptestTools>go test -bench=.  -count=3
测试初始化开始.....
goos: windows
goarch: amd64
pkg: rpcDevelop/testTools
cpu: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
BenchmarkAll-4            576114            131730 ns/op
BenchmarkAll-4            544360            114828 ns/op
BenchmarkAll-4            571809            121149 ns/op
PASS
ok      rpcDevelop/testTools    207.884s

进阶用法可参考:

Go benchmark 详解 - YahuiAn - 博客园基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器。https://www.cnblogs.com/yahuian/p/go-benchmark.html

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1065403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号