Golang性能基准测试可以帮助开发人员比较不同的实现方式对性能的影响,以便优化程序,本文就来讲解一下如何使用Golang的性能基准测试功能。
Golang 中的性能基准测试是使用标准库 testing 来实现的,编写性能测试代码是很容易的:
以 json 格式校验工具
https://github.com/luduoxin/json-validator-go 为例,validator包中的 scanner.go 文件中的关键函数 Valid 用于校验给定字符串是否 json 格式,对应的性能测试文件为 scanner_test.go,里面的测试函数为 BenchmarkValid,代码如下:
package validatorimport "testing"func BenchmarkValid(b *testing.B) { str := `{"foo":"bar"}` b.ResetTimer() for i := 0; i < b.N; i++ { Valid([]byte(str)) }
性能测试命令为 go test [参数],比如 go test -bench=. ,具体的命令参数及含义如下:
-bench regexp 性能测试,运行指定的测试函
-bench . 运行所有的benchmark函数测试,指定名称则只执行具体测试方法而不是全部
-benchmem 性能测试的时候显示测试函数的内存分配的统计信息
-count n 运行测试和性能多少此,默认一次
-run regexp 只运行特定的测试函数
-timeout t 测试时间如果超过 t 则panic,默认10分钟
-v 显示测试的详细信息
启动命令行,切换到 json-validator-go 项目的 validator 文件夹下,运行全部性能测试用例:
$ go test -bench=.goos: darwingoarch: amd64pkg: github.com/luduoxin/json-validator-go/validatorcpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHzBenchmarkValid-8 13562608 86.55 ns/opPASSok github.com/luduoxin/json-validator-go/validator 1.420s
上面输出的报告的倒数第三行信息的内容含义如下:
BenchmarkValid 是性能测试函数名称,-8 表示 GOMAXPROCS 的值为8,13562608 表示一共执行了13562608次,即b.N的值,86.55 ns/op 表示平均每次操作花费了 86.55 纳秒。
在一个测试方法里面也可以跑多个用例,使用更多的类型的数据分别看下对应的性能,代码如下:
package validatorimport "testing"func BenchmarkValid(b *testing.B) { var validTests = []struct { data string ok bool }{ {`foo`, false}, {`}{`, false}, {`{]`, false}, {`{}`, true}, {`[{}]`, true}, {`{"foo":"bar"}`, true}, {`{"foo":"bar","bar":{"baz":["qux"]}}`, true}, } for _, v := range validTests { b.Run("", func(b *testing.B) { for i := 0; i < b.N; i++ { Valid([]byte(v.data)) } }) }}
运行看下效果:
$ go test -bench=. goos: darwingoarch: amd64pkg: github.com/luduoxin/json-validator-go/validatorcpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHzBenchmarkValid/#00-8 4746290 249.8 ns/opBenchmarkValid/#01-8 4841005 245.5 ns/opBenchmarkValid/#02-8 4610671 257.0 ns/opBenchmarkValid/#03-8 26957421 42.63 ns/opBenchmarkValid/#04-8 29747263 41.88 ns/opBenchmarkValid/#05-8 20895832 56.31 ns/opBenchmarkValid/#06-8 14058906 83.17 ns/opBenchmarkValid/#07-8 5518412 212.9 ns/opPASSok github.com/luduoxin/json-validator-go/validator 10.891s