
基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器。
在日常生活中,我们使用速度 m/s(单位时间内物体移动的距离)大小来衡量一辆跑车的性能,同理,我们可以使用”单位时间内程序运行的次数“来衡量程序的性能。
在日常开发中,如果和同事在代码实现上有分歧,不用多费口舌,跑个分就知道谁牛X。
benchmark函数注意事项注意:在进行基准测试时,硬件资源直接影响测试结果,为了保证测试结果的可重复性,需要尽可能地保证硬件资源一致。(单一变量原则)
通用benchmark的概念了解:Benchmark简介
Benchmark简介 - stardsd - 博客园
benchmark 测试用例结果参数解读程序示例:
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的测试需要稳态的函数,非稳态测试时间很长或者不定,例如下面的函数aaa()中的n会变化。
benchmark测试命令进阶程序示例:
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
go benchmark 默认测试时间是 1s,同样的原理,为了提升测试准确度,我们可以使用该参数适当增加时长。此外还能设置运行次数,CPU使用核数,内存分配数等。
示例:
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