golang基准測試詳解


為什么需要基准測試?

如果你的代碼中有性能問題,或者你懷疑某段代碼有性能問題(當然最好得明確排除I/O性能問題),可以用基准測試生成CPU分析報告。

基准測試前的准備

生成以_test后綴的go文件(例:xxx_test.go)后,編寫基准測試用例,以Benchmark開頭的。以測試冒泡排序為例,代碼如下:

func BenchmarkSort(b *testing.B) {
arr := make([]int, 100000)
for i:=100000; i > 0; i-- {
arr = append(arr, i)
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
bubbleSort(arr)
}
}

func bubbleSort(nums []int) []int {
length := len(nums)
for i := 1; i < length; i++ {
for j := length - 1; j >= i; j-- {
if nums[j] < nums[j-1] {
nums[j], nums[j-1] = nums[j-1], nums[j]
}
}
}
return nums
}
  

用例中一些細節的說明

基准測試函數會被一直調用直到b.N無效,它是基准測試循環的次數
b.N 從 1 開始,如果基准測試函數在1秒內就完成 (默認值),則 b.N 增加,並再次運行基准測試函數。
b.N 在近似這樣的序列中不斷增加;1, 2, 3, 5, 10, 20, 30, 50, 100 等等,

b.ResetTimer(). 開始執行for b.N循環前需要一些准備時間,可以通過該命令重制基准計時器。
b.StopTimer()b.StartTimer()。如果在for b.N內還有一些為測試方法准備的前置條件,可以用b.StopTimer()暫停基准計時器,然后再用b.StartTimer()啟動計時器。例:
for i := 0; i < b.N; i++ {
  b.StopTimer()
   someBeforTest()
  b.StartTimer()
   bubbleSort(arr)
}
 
        

  

運行基准測試用例

在測試文件目錄下執行 
go test -bench=^BenchmarkSort$ -run=^$ -benchmem -cpuprofile=cpuprof

參數說明

-run           // go test 會在運行基准測試之前之前執行包里所有的單元測試. -run 標識排除這些單元測試,不讓它們執行; 比如: go test -run=^$
-bench regexp     // 匹配要執行的bench方法,以正則表達式來匹配
-benchtime t     // t時間內,執行最大化的b.N迭代。默認是1秒。 當然至少迭代一次
-benchmem     // 打印基准測試消耗的內存
-cpu 1,2,4     // 設置每次測試執行GOMAXPROCS的值
-count n     // 運行n次測試,默認是1.(注意,有時候執行單元測試發現新的改動沒生效,是因為單元測試會用到之前的緩存,設置count=1即可解決
-cpuprofile=$FILE  // 將cpu分析結果寫入 $FILE用於分析

 更多參數說明請見: https://golang.org/cmd/go/#hdr-Testing_flags

 

返回說明

goos: darwin
goarch: amd64
pkg: gopool
BenchmarkSort-4                1        16661414276 ns/op          17792 B/op         10 allocs/op
PASS
ok      gopool  16.849s

說明:
只看第四行
BenchmarkSort-4      // 基准測試名-4 后綴和用於運行次測試的 GOMAXPROCS 值有關。

1             // 1秒中只迭代了一次
16661414276 ns/op    // 執行一次測試的方法即bubbleSort(arr) 需要這么多納秒

17792 B/op   // 每個op操作分配了多少字節(即需要多少)
10 allocs/op      // 每個op發生多少個不同的內存分配(這塊也不知道怎么給出合理解釋)

  

 最后我們也可以通過go tool提供的性能分析工具,查看某個方法的具體耗時。如下:

go tool pprof cpuprof                                          
Type: cpu
Time: Mar 16, 2020 at 12:13pm (CST)
Duration: 16.84s, Total samples = 14.19s (84.26%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) web

cpuprof就是上面-cpuprofile=cpuprof生成的cpu性能分析文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM