GoLang 命令 (4)

第 4 行中显示基准测试名称,2000000000 表示测试的次数,也就是 testing.B 结构中提供给程序使用的 N。“0.33 ns/op”表示每一个操作耗费多少时间(纳秒)。

注意:Windows 下使用 go test 命令行时,-bench=.应写为-bench="."。

2) 基准测试原理

基准测试框架对一个测试用例的默认测试时间是 1 秒。开始测试时,当以 Benchmark 开头的基准测试用例函数返回时还不到 1 秒,那么 testing.B 中的 N 值将按 1、2、5、10、20、50……递增,同时以递增后的值重新调用基准测试用例函数。

3) 自定义测试时间

通过-benchtime参数可以自定义测试时间,例如:

$ go test -v -bench=. -benchtime=5s benchmark_test.go goos: linux goarch: amd64 Benchmark_Add-4 10000000000 0.33 ns/op PASS ok command-line-arguments 3.380s 4) 测试内存

基准测试可以对一段代码可能存在的内存分配进行统计,下面是一段使用字符串格式化的函数,内部会进行一些分配操作。

func Benchmark_Alloc(b *testing.B) { for i := 0; i < b.N; i++ { fmt.Sprintf("%d", i) } }

在命令行中添加-benchmem参数以显示内存分配情况,参见下面的指令:

$ go test -v -bench=Alloc -benchmem benchmark_test.go goos: linux goarch: amd64 Benchmark_Alloc-4 20000000 109 ns/op 16 B/op 2 allocs/op PASS ok command-line-arguments 2.311s

代码说明如下:

第 1 行的代码中-bench后添加了 Alloc,指定只测试 Benchmark_Alloc() 函数。

第 4 行代码的“16 B/op”表示每一次调用需要分配 16 个字节,“2 allocs/op”表示每一次调用有两次分配。

开发者根据这些信息可以迅速找到可能的分配点,进行优化和调整

5) 控制计时器

有些测试需要一定的启动和初始化时间,如果从 Benchmark() 函数开始计时会很大程度上影响测试结果的精准性。testing.B 提供了一系列的方法可以方便地控制计时器,从而让计时器只在需要的区间进行测试。我们通过下面的代码来了解计时器的控制。

func Benchmark_Add_TimerControl(b *testing.B) { // 重置计时器 b.ResetTimer() // 停止计时器 b.StopTimer() // 开始计时器 b.StartTimer() var n int for i := 0; i < b.N; i++ { n++ } }

从 Benchmark() 函数开始,Timer 就开始计数。StopTimer() 可以停止这个计数过程,做一些耗时的操作,通过 StartTimer() 重新开始计时。ResetTimer() 可以重置计数器的数据。

计数器内部不仅包含耗时数据,还包括内存分配的数据。

test命令小总结 go test package //生成并运行测试该源码包下面所有_test文件下所有测试方法直到测试完毕 go test *_test.go //生成并运行测试该文件下所有测试方法直到测试完毕 go test -v *_test.go //测试该文件,并显示测试的详细命令 go test -v -bench=. *_test.go //执行相应的benchmarks方法,例如 -bench=.执行所有 go test -cover *_test.go //开启测试覆盖率 go test -run regexp *_test.go //正则匹配,例如 -run=Array 那么就执行包含有Array开头的函数 go test -v -run Test_A *_test.go //自定义测试方法 go test -v -bench=. -benchtime=5s *_test.go //自定义测试时间 go test -v -bench=Alloc -benchmem b*_test.go //测试内存,本例为对指定方法进行测试并测试内存 go test -cpuprofile cpu.out *_test.go //输出cpu性能分析文件 go test -memprofile mem.out *_test.go //输出内存性能分析文件 go test -blockprofile block.out *_test.go //输出内部goroutine阻塞的性能分析文件 pprof命令

Go 语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU 消耗、内存分配及阻塞分析。

性能分析首先需要使用 runtime.pprof 包嵌入到待分析程序的入口和结束处。runtime.pprof 包在运行时对程序进行每秒 100 次的采样,最少采样 1 秒。然后将生成的数据输出,让开发者写入文件或者其他媒介上进行分析。

go pprof 工具链配合 Graphviz 图形化工具可以将 runtime.pprof 包生成的数据转换为 PDF 格式,以图片的方式展示程序的性能分析结果

安装第三方图形化显式分析数据工具(Graphviz)

Graphviz 是一套通过文本描述的方法生成图形的工具包。描述文本的语言叫做 DOT。

在 ()网站可以获取到最新的 Graphviz 各平台的安装包。

CentOS 下,可以使用 yum 指令直接安装:

$ yum install graphiviz 安装第三方性能分析来分析代码包

runtime.pprof 提供基础的运行时分析的驱动,但是这套接口使用起来还不是太方便,例如:

输出数据使用 io.Writer 接口,虽然扩展性很强,但是对于实际使用不够方便,不支持写入文件。

默认配置项较为复杂。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyspj.html