性能基准测试可以帮助开发人员比较不同的实现方法对性能的影响,便于优化程序,本文就来讲解一下怎样使用的性能基准测试功能。
性能基准测试
中的性能基准测试是使用标准库来实现的,编撰性能测试代码是很容易的:
创建性能测试文件:在Go项目的源代码目录下创建一个新的文件(和被测代码文件在同一个包),以_test.go为后缀名。比如,要测试net包中dial.go中的方式,在net包中创建一个名子为.go文件,和单元测试文件是一样的。导出包:在测试文件中导出包,以使用相关的的函数和工具。编撰测试函数:在测试文件中,编撰一个以为前缀的函数,前面跟上一个或多个字符或字符组合来标示测试用例的名称(通常使用被测的函数名称),参数必须是b*.B。编撰测试代码:b.N是基准测试框架提供的,表示循环的次数电脑内存测试工具,由于须要反复调用测试代码来评估性能。b.N的值会以1,2,5,10,20,50,…这样的规律递增下去直至运行时间小于一秒钟,因为程序判定运行时间稳定就会停止运行电脑内存测试工具,所以千万不要在loop循环上面使用一个变化的值作为函数的参数。
以json格式校准工具
为例,包中的.go文件中的关键函数Valid用于校准给定字符串是否json格式,对应的性能测试文件为.go,上面的测试函数为,代码如下:
package validator
import "testing"
func BenchmarkValid(b *testing.B) {
str := `{"foo":"bar"}`
b.ResetTimer()
for i := 0; i < b.N; i++ {
Valid([]byte(str))
}
运行性能测试用例
性能测试命令为gotest[参数],例如gotest-bench=.,具体的命令参数及涵义如下:
-bench性能测试1.85传奇,运行指定的测试函
-bench.运行所有的函数测试,指定名称则只执行具体测试方式而不是全部
-性能测试的时侯显示测试函数的显存分配的统计信息
-countn运行测试和性能多少此,默认一次
-run只运行特定的测试函数
-t测试时间若果超过t则panic,默认10分钟
-v显示测试的详尽信息
启动命令行,切换到json--go项目的文件夹下,运行全部性能测试用例:
$ go test -bench=.
goos: darwin
goarch: amd64
pkg: github.com/luduoxin/json-validator-go/validator
cpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
BenchmarkValid-8 13562608 86.55 ns/op
PASS
ok github.com/luduoxin/json-validator-go/validator 1.420s
里面输出的报告的倒数第三行信息的内容涵义如下:
是性能测试函数名称,-8表示的值为8,表示一共执行了次,即b.N的值,86.55ns/op表示平均每次操作耗费了86.55微秒。
在一个测试方式上面也可以跑多个用例,使用更多的类型的数据分别看下对应的性能,代码如下:
package validator
import "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: darwin
goarch: amd64
pkg: github.com/luduoxin/json-validator-go/validator
cpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
BenchmarkValid/#00-8 4746290 249.8 ns/op
BenchmarkValid/#01-8 4841005 245.5 ns/op
BenchmarkValid/#02-8 4610671 257.0 ns/op
BenchmarkValid/#03-8 26957421 42.63 ns/op
BenchmarkValid/#04-8 29747263 41.88 ns/op
BenchmarkValid/#05-8 20895832 56.31 ns/op
BenchmarkValid/#06-8 14058906 83.17 ns/op
BenchmarkValid/#07-8 5518412 212.9 ns/op
PASS
ok github.com/luduoxin/json-validator-go/validator 10.891s
、
还没有评论,来说两句吧...