benchmark性能測試

benchmark介紹

   基準測試主要是通過測試CPU和記憶體的效率問題,來評估被測試程式碼的性能,進而找到更好的解決方案。

   而Go語言中自帶的benchmark則是一件非常神奇的測試利器。有了它,開發者可以方便快捷地在測試一個函數方法在串列或並行環境下的基準表現。指定一個時間(默認是1秒),看測試對象在達到或超過時間上限時,最多能被執行多少次和在此期間測試對象記憶體分配情況。
1.基準測試程式碼文件必須是_test.go結尾,和單元測試一樣;
2.基準測試的函數以Benchmark開頭;
3.參數須為 *testing.B;
4.基準測試函數不能有返回值;
5.b.ResetTimer是重置計時器,這樣可以避免for循環之前的初始化程式碼的干擾;
6.b.StopTimer()停止計時器
7.b.N是基準測試框架提供的,Go會根據系統情況生成,不用用戶設定,表示循環的次數,因為需要反覆調用測試的程式碼,才可以評估性能;

benchmark運行

go test -bench=. -benchmem


輸出解釋:
函數名後面的-8,表示運行時對應的 GOMAXPROCS 的值;
1:代表循環次數
9581522041:代表執行花費時間 (越少越好)
5559464 B/op :代表分配了多少位元組記憶體(越少越好)
20522 allocs/op:代表發生了多少次不同的記憶體分配(越少越好)

benchmark運行參數

-benchtime=3s :指定運行時間
-benchmem:顯示分配記憶體大小,分配記憶體次數
-cpu=4:指定cpu數量
-count=2:指定運行次數

benchmark性能測試案例

測試目標:

func demo1() {
   count := 0
   mux := sync.Mutex{}
   wg := sync.WaitGroup{}
   for i := 0; i < 10000; i++ {
      wg.Add(1)
      go func() {
         defer wg.Done()
         for j := 0; j < 10000; j++ {
            mux.Lock()
            count++
            mux.Unlock()
         }
      }()
   }
   wg.Wait()
}

func demo2() {
   wg := sync.WaitGroup{}
   var count int32 = 0
   for i := 0; i < 10000; i++ {
      wg.Add(1)
      go func() {
         defer wg.Done()
         for j := 0; j < 10000; j++ {
            atomic.AddInt32(&count, 1)
         }
      }()
   }
   wg.Wait()
}

main_test.go

import (
	"testing"
)

func BenchmarkDemo1(b *testing.B) {
	b.ResetTimer()
	demo1()
	b.StopTimer()
}

func BenchmarkDemo2(b *testing.B) {
	b.ResetTimer()
	demo2()
	b.StopTimer()
}

啟動命令:go test -bench=. -benchmem