前面 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
會自動在瀏覽器上開啟地址:http://localhost:8080/ui/ ,然後就可以在瀏覽器上檢視各種分析資料,如下圖:
其他資料也可以進行同樣的分析,這裡就略過。
[完]