Goでベンチマークテスト実行してみる


はじめに

Goでベンチマークテストを実行する方法を忘れないようにメモ感覚で書いておく。

対象の関数

func makeSlice() {
  s := make([]int, 0, 10)
  for i:=0; i<10; i++ {
    s = append(s, i+1)
  }
}

ベンチマーク関数の実装

ユニットテストと同じように、次のようなフォーマットの関数として、_test.goという名前のファイルに記述する。

package main

import (
  "testing"
)

func BenchmarkMakeSlice(b *testing.B) {
  for i:=0; i<b.N; i++ {
    makeSlice()
  }
}

ベンチマークをとりたい関数をb.N回繰り返し精度を上げている。
コードが実行されるとb.Nは必要に応じて変化する。

ベンチマークテストの実行

ベンチマークテストケースを実行するには、コマンドgo testを実行する際にベンチフラグ(- bench)を指定する。以下ではドットを使うことで全てのベンチマークファイルを実行している。

$ go test -v -bench .

実行結果は以下の通り

=== RUN   TestMakeSlice
--- PASS: TestMakeSlice (0.00s)
goos: darwin
goarch: amd64
pkg: awesomeProject
BenchmarkMakeSlice
BenchmarkMakeSlice-4    85463809                13.5 ns/op
PASS
ok      awesomeProject 1.179s

ループは85463809回実行し、各ループは13.5ナノ秒(0.0135ミリ秒)かかった。

上では、別で用意している機能テストも実行されている。
機能テストは実行せずベンチマークだけを実行したい場合は、フラグ「- run」を指定すればよい。このフラグはどの機能テストを実行するか指定する。そのため、どの機能テストとも一致しない名前を指定すれば全てのテストが無視される。

$ go test - run x -bench .
goos: darwin
goarch: amd64
pkg: awesomeProject
BenchmarkMakeSlice-4    76079278                13.6 ns/op
PASS
ok      awesomeProject 1.057s