前言
Go 的 testing
標準庫提供 Benchmark 效能測試,以下替三種將數字轉為字串的函式做效能測試。
做法
新增 main.go
檔:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import ( "fmt" "log" "strconv" )
func main() { log.Println(print01(1000)) log.Println(print02(1000)) log.Println(print03(1000)) }
func print01(num int) string { return fmt.Sprintf("%d", num) }
func print02(num int64) string { return strconv.FormatInt(num, 10) }
func print03(num int) string { return strconv.Itoa(num) }
|
新增 main_test.go
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package main
import "testing"
func TestPrint01(t *testing.T) { if print01(1000) != "1000" { t.Fatal("error") } }
func TestPrint02(t *testing.T) { if print02(int64(1000)) != "1000" { t.Fatal("error") } }
func TestPrint03(t *testing.T) { if print03(1000) != "1000" { t.Fatal("error") } }
func BenchmarkPrint01(b *testing.B) { for i := 0; i < b.N; i++ { print01(1000) } }
func BenchmarkPrint02(b *testing.B) { for i := 0; i < b.N; i++ { print02(1000) } }
func BenchmarkPrint03(b *testing.B) { for i := 0; i < b.N; i++ { print03(1000) } }
|
- 檔案名稱以
_test
做為後綴。
- 方法名稱以
Benchmark
做為前綴。
- 在迴圈內放置要測試的程式碼。
- Go 內建
b.N
循環次數,以一秒鐘計算。
效能測試
執行效能測試:
1
| go test -v -bench=. -run=none -benchmem .
|
- 參數
-v
輸出測試的方法名稱等日誌。
- 參數
-bench
執行 Benchmark。
- 參數
-run=none
可以執行特定的測試,由於沒有叫做 none
的測試,所以只會跑 Benchmark。
- 參數
-benchme
顯示使用的記憶體空間。
參考資料