1. 程式人生 > >golang 效能優化分析:benchmark 結合 pprof

golang 效能優化分析:benchmark 結合 pprof

前面 2 篇 golang 效能優化分析系列文章: - [golang 效能優化分析工具 pprof (上)](https://www.cnblogs.com/jiujuan/p/14588185.html) - [golang 效能優化分析工具 pprof (下)](https://www.cnblogs.com/jiujuan/p/14598141.html) ## 一、基準測試 benchmark 簡介 在 golang 中,可以通過 benchmark 基準測試來測試程式碼效能。基準測試主要是通過測試 cpu 和記憶體的效率問題,來評估被測試程式碼的效能。 基準測試的指標: 1. 程式所花費的時間 2. 記憶體使用的情況 3. cpu 使用情況 基準測試檔名和函式規定: - go 基準測試檔案都是以 `_test.go` 結尾,和單元測試用例在同一個檔案中。 - 基準測試每個函式都是以 `Benchmark` 開頭。 基準測試常用命令: ```go 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 就可以進行分析。 執行命令取樣資料: ```sh 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: ```go package main func Fib(n int) int { if n < 2 { return n } return Fib(n-1) + Fib(n-2) } ``` fib_test.go: ```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 go test -bench=. -run=none \ -benchmem -memprofile=mem.pprof \ -cpuprofile=cpu.pprof \ -blockprofile=block.pprof ``` 也可以用一個一個命令來完成採集資料,分開執行: ```go go test -bench=. -run=none -benchmem -memprofile=mem.pprof ``` ```go go test -bench=. -run=none -benchmem -cpuprofile=cpu.pprof ``` ### 2.3 分析資料 前面有 [上](https://www.cnblogs.com/jiujuan/p/14588185.html),[下](https://www.cnblogs.com/jiujuan/p/14598141.html) 兩篇 pprof 的文章怎麼分析資料,一種方法是命令列互動分析模式,一種是視覺化圖形分析模式。 **A. 命令列互動分析** 分析 cpu: ```go go tool pprof cpu.pprof ``` >
再用 `top15` 命令分析,或者 `top --cum` 進行排序分析 如下圖: ![](https://img2020.cnblogs.com/blog/650581/202104/650581-20210401024852238-1271462035.png) **B. web 介面分析** 命令列執行命令: ```go go tool pprof -http=":8080" cpu.pprof ``` 會自動在瀏覽器上開啟地址:http://localhost:8080/ui/ ,然後就可以在瀏覽器上檢視各種分析資料,如下圖: ![](https://img2020.cnblogs.com/blog/650581/202104/650581-20210401024903322-1485355084.png) 其他資料也可以進行同樣的分析,這裡就略過。