golang 性能優化分析:benchmark 結合 pprof
前面 2 篇 golang 性能優化分析系列文章:
一、基準測試 benchmark 簡介
在 golang 中,可以通過 benchmark 基準測試來測試代碼性能。基準測試主要是通過測試 cpu 和內存的效率問題,來評估被測試代碼的性能。
基準測試的指標:
- 程序所花費的時間
- 內存使用的情況
- cpu 使用情況
基準測試文件名和函數規定:
- go 基準測試文件都是以
_test.go
結尾,和單元測試用例在同一個文件中。 - 基準測試每個函數都是以
Benchmark
開頭。
基準測試常用命令:
go test ./fib // 不進行基準測試,對 fib 進行單元測試
go test -bench=. -run=none // 進行基準測試,不進行單元測試,-run 表示執行哪些單元測試和測試函數,一般函數名不會是 none,所以不執行單元測試
// 上面的測試命令還可以用空格隔開,意義是一樣
go test -bench . -run none
go test -bench=. // 對所有的進行基準測試
go test -bench='fib$' // 只運行以 fib 結尾的基準測試,-bench 可以進行正則匹配
go test -bench=. -benchtime=6s // 基準測試默認時間是 1s,-benchtime 可以指定測試時間
go test -bench=. -benchtime=50x // 參數 -benchtime 除了指定時間,還可以指定運行的次數
go test -bench=. -benchmem // 進行時間、內存的基準測試
說明:上面的命令中,
-bench
後面都有一個.
,這個點並不是指當前文件夾,而是一個匹配所有測試的正則表達式。
更多參數說明請查看幫助:
go help testflag
分析基準測試數據:
- cpu 使用分析:-cpuprofile=cpu.pprof
- 內存使用分析:-benchmem -memprofile=mem.pprof
- block分析:-blockprofile=block.pprof
在配合 pprof 就可以進行分析。
運行命令採樣數據:
go test -bench=. -run=none -benchmem -memprofile=mem.pprof
go test -bench=. -run=none -blockprofile=block.pprof
go test -bench=. -run=none -benchmem -memprofile=mem.pprof -cpuprofile=cpu.pprof
二、代碼示例
2.1 代碼示例
fib.go:
package main
func Fib(n int) int {
if n < 2 {
return n
}
return Fib(n-1) + Fib(n-2)
}
fib_test.go:
package main
import (
"testing"
)
func BenchmarkFib(b *testing.B) {
// 運行 Fib 函數 b.N 次
for n := 0; n < b.N; n++ {
Fib(20)
}
}
func BenchmarkFib2(b *testing.B) {
// 運行 Fib 函數 b.N 次
for n := 0; n < b.N; n++ {
Fib(10)
}
}
2.2 運行命令採集數據
go test -bench=. -run=none \
-benchmem -memprofile=mem.pprof \
-cpuprofile=cpu.pprof \
-blockprofile=block.pprof
也可以用一個一個命令來完成採集數據,分開運行:
go test -bench=. -run=none -benchmem -memprofile=mem.pprof
go test -bench=. -run=none -benchmem -cpuprofile=cpu.pprof
2.3 分析數據
前面有 上,下 兩篇 pprof 的文章怎麼分析數據,一種方法是命令行交互分析模式,一種是可視化圖形分析模式。
A. 命令行交互分析
分析 cpu:
go tool pprof cpu.pprof
再用
top15
命令分析,或者top --cum
進行排序分析
如下圖:
B. web 界面分析
命令行執行命令:
go tool pprof -http=":8080" cpu.pprof
會自動在瀏覽器上打開地址://localhost:8080/ui/ ,然後就可以在瀏覽器上查看各種分析數據,如下圖:
其他數據也可以進行同樣的分析,這裡就略過。
[完]