本文介绍Golang的性能测试(Benchmark)。

使用testing包

bench_test.go

运行程序

BenchmarkFib20-8-8GOMAXPROCS-cpu
25608

其他标志

将test保存为二进制文件

go test -c

CPU/内存/Block的Profile

-cpuprofile=$FILE$FILE-memprofile=$FILE$FILE-memprofilerate=N1/N-blockprofile=$FILE$FILE

例子:

使用PProf

profile用来跟踪整个程序的运行,用来定位程序性能的问题。

pprof
runtime/pprofgo tool pprof

pprof的类型

  • CPU Profile

程序运行时(runtime), CPU Profile每隔10ms会打断(interrupt)程序执行, 记录当前运行的Goroutine的堆栈踪迹(stack trace)。

  • Memory profiling

当堆内存分配时,Memory profiling记录stack trace.

与CPU Profile类似,默认情况下,每1000次堆内存分配,Memory profiling会进行1次取样。

Memory profiling是取样的,并且它跟踪的时没有使用的内存分配,因此它不能确定整个程序运行使用的内存。

  • Block (or blocking) profiling

Block profiling记录一个Goroutine等待共享资源的时间,这可以用来确定程序中的并发瓶颈。

  • Mutex contention profiling

Mutex contention profiling记录因为互斥导致延迟的操作。

每次一个Profile

使用profile是有性能消耗的,使用时每次只用1种类型的Profile。如果同时使用多个Profile,Profile之间会相互影响。

使用PProf

words.go

进行性能测试:

go tool pprof
syscall.syscallreadbyte(f)

go tool pprof常用命令

编译器优化

编译器优化主要包括3个方面

  • 逃逸分析
  • 函数内联(inline)
  • 死代码(dead code)清除

go build 命令


参考文献