13.11 go testでベンチマークを取る

Goは、標準でベンチマークを実行できるように整備されています。ベンチマークは go test コマンドで実行されることもあり、この節に記載しています。

以下のサンプルコードに対して、ベンチマークを実装してみます。

package cookbooktest

func AppendSlice(count, value int) []int {
	res := []int{}
	for i := 0; i < count; i++ {
		res = append(res, value)
	}
	return res
}

func FirstAllocSlice(count, value int) []int {
	res := make([]int, count)
	for i := 0; i < count; i++ {
		res[i] = value
	}
	return res
}

ベンチマークは、関数名を Benchmark ではじめて、引数に *testing.B を取ります。b.Nはベンチマーク結果が安定するまで自動的に増加する数値です。ベンチマークの試行回数を定義することなく、結果が安定するまで自動で複数回実行してくれます。

package cookbooktest

import "testing"

func BenchmarkAppendSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		AppendSlice(10000, 111)
	}
}

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