本文介绍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 命令