1 Go语言性能测试
写性能测试在Go语言中是很便捷的,go自带的标准工具链就有完善的支持。
1.1 benchmark
写benchmark测试有如下约定:
- benchmark也是测试,因此也是以
_test.go
结尾的文件; - 需要
import testing
; - 测试方法以
Benchmark
开始,并且拥有一个*testing.B
参数。
*testing.B
参数提供了大多数和*testing.T
类似的方法,同时也额外增加了一些性能测试相关的方法。此外,还提供了一个整型成员N
,用来指定被检测操作的执行次数。
举个例子,下边是一个连接字符串的操作:
bench_test.go
:
package main
import "testing"
import "strings"
func BenchmarkStringJoin1(b *testing.B) {
input := []string{
"Hello", "World"}
for i := 0; i < b.N; i++ {
result := strings.Join(input, " ")
if result != "Hello World" {
b.Error("Unexpected result: " + result)
}
}
}
然后执行benchmark测试:
$ go test -bench=. -run=NONE
-bench
可以根据正则表达式筛选要测试的方法,这里的.
表示匹配所有的测试方法;-run=NONE
表示忽略功能测试。
输出如下:
goos: linux
goarch: amd64
pkg: hello/bench_test
BenchmarkStringJoin1-8 50000000 36.6 ns/op
PASS
ok hello/bench_test 1.871s
BenchmarkStringJoin1-8
表示测试了哪个方法,8
标识GOMAXPROCS
的值,通常等于CPU物理线程数;50000000
即进行了50000000次测试,基准测试运行器开始并不知道这个操作耗时长短,所以开始的时候它使用一个比较小的N值,然后根据运行情况推算出合适的N值;36.6 ns/op
表示每个操作耗时36.6纳秒。
如果希望报告更多信息,可以通过增加参数实现,如通过如下命令展示内存分配信息:
$ go test -bench=. -benchmem
goos: linux
goa