Golang 基準測試(Benchmark)

Benchmark 🧪

基準測試是對計算機系統的性能的測試。

在程序中,基準測試,是一種測試代碼性能的方法;比如有一個問題你有多種不同的方案,你想選擇一種性能最好的方案,那麼你就需要基準測試。

基準測試主要是通過測試 CPU 和內存的效率問題,來評估被測試代碼的性能,進而找到更好的解決方案。比如鏈接池的數量不是越多越好,那麼哪個值纔是最優值呢,這就需要配合基準測試不斷調優了。

工程意圖

根據輸入的字符串和重複次數,輸出重複次數後的字符串。

初始化工程

go mod init benchmark

測試的函數需要以 Test 開頭,參數爲 *testing.T 類型

Test

  • 測試先行
# 測試 Repeat 函數
func TestRepeat(t *testing.T) {
    actual := Repeat(`a`, 6)
    expect := `aaaaaa`
    if actual != expect {
        t.Errorf(`expect %s, but got %s`, expect, actual)
    }
}
  • 運行 go test, 程序會報錯,因爲沒有實現 Repeat 函數。
  • 最小化的實現 Repeat
// Repeat return a string with same char
func Repeat(char string, count int) (result string) {
    for i := 0; i < count; i++ {
        result += char
    }
    return
}
上面的函數中 return 並沒有返回值,是因爲,在 Repeat 函數的返回值部分有一個result,
當返回值是函數體裏面的值的時候,可以不用寫返回值,go 程序自動將該值返回。但return 依舊不能省略。

Benchmark

基準測試的函數名須以 Benchmark 開頭, 參數須爲 *testing.B;循環中的 b.N, go 會根據系統情況生成,不用用戶設定。

func BenchmarkRepeat(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Repeat(`b`, 5)
    }
}

運行測試

  • 基本測試
$ go test
PASS
ok      benchmark       0.006s

基本測試很簡單,不用解讀了。

  • 基準測試
$ go test -bench=. -run=none
goos: darwin
goarch: amd64
pkg: benchmark
BenchmarkRepeat-12      10000000               116 ns/op
PASS
ok      benchmark       1.297s

運行基準測試也要使用go test命令,不過我們要加上-bench=標記,它接受一個表達式作爲參數,匹配基準測試的函數,. 表示運行所有基準測試。

因爲默認情況下 go test 會運行單元測試,爲了防止單元測試的輸出影響我們查看基準測試的結果,可以使用-run=匹配一個從來沒有的單元測試方法,過濾掉單元測試的輸出,我們這裏使用none,因爲我們基本上不會創建這個名字的單元測試方法。

下面着重解釋下說出的結果,看到函數後面的-12了嗎?這個表示運行時對應的 GOMAXPROCS 的值。接着的 10000000 表示運行 for 循環的次數,也就是調用被測試代碼的次數,最後的 116 ns/op表示每次需要話費 116 納秒。
以上是測試時間默認是1秒,也就是1秒的時間,調用 10000000 次,每次調用花費 116 納秒。如果想讓測試運行的時間更長,可以通過 -lunchtime 指定,比如5秒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章