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

九卷 發表於 2021-04-01

前面 2 篇 golang 效能優化分析系列文章:

一、基準測試 benchmark 簡介

在 golang 中,可以通過 benchmark 基準測試來測試程式碼效能。基準測試主要是通過測試 cpu 和記憶體的效率問題,來評估被測試程式碼的效能。

基準測試的指標:

  1. 程式所花費的時間
  2. 記憶體使用的情況
  3. 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 進行排序分析

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

B. web 介面分析

命令列執行命令:

go tool pprof -http=":8080" cpu.pprof

會自動在瀏覽器上開啟地址:http://localhost:8080/ui/ ,然後就可以在瀏覽器上檢視各種分析資料,如下圖:

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

其他資料也可以進行同樣的分析,這裡就略過。

[完]