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

前面 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 進行排序分析

如下圖:

B. web 介面分析

命令行執行命令:

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

會自動在瀏覽器上打開地址://localhost:8080/ui/ ,然後就可以在瀏覽器上查看各種分析數據,如下圖:

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

[完]