作ったものとか » Notes

Goでテーブル駆動のベンチマークをとる方法

2024-08-16 10:26:05 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
type testcase struct {
	name  string
	input []int
}

var testcases = []testcase{
	{ // このテストケース単位で、標準パッケージ関数との比較をしたい。
		name:  "plus",
		input: []int{1, 2, 3},
	},
	{ // このテストケース単位で、標準パッケージ関数との比較をしたい。
		name:  "minus",
		input: []int{-1, -2, -3},
	},
}

func BenchmarkStringer(b *testing.B) {
	std := strconv.Itoa
	myitoa := MyItoa

	for _, c := range testcases { // テストケース
		b.Run(c.name+"(std)", func(b *testing.B) { // 比較対象(サブベンチマーク)
			for i := 0; i < b.N; i++ {
				for _, n := range c.input {
					std(n)
				}
			}
		})
		b.Run(c.name+"(my)", func(b *testing.B) { // 比較対象(サブベンチマーク)
			for i := 0; i < b.N; i++ {
				for _, n := range c.input {
					myitoa(n)
				}
			}
		})
	}

	// ちなみに、普通の(?)サブベンチマークとして書くとこんな感じになる。
	// こちらの方法だとテーブル全体で比較する形になっている。

	b.Run("std-all", func(b *testing.B) {
		for _, c := range testcases { // テストケース
			for i := 0; i < b.N; i++ {
				for _, n := range c.input {
					std(n)
				}
			}
		}
	})

	b.Run("my-all", func(b *testing.B) {
		for _, c := range testcases { // テストケース
			for i := 0; i < b.N; i++ {
				for _, n := range c.input {
					myitoa(n)
				}
			}
		}
	})
}

結果の出力例

go test -bench .

全部で6つあるテスト結果のうち、前半4つがテーブル駆動の出力例です。

BenchmarkStringer/plus(std)-8           144737995                8.125 ns/op
BenchmarkStringer/plus(my)-8            54076951                20.84 ns/op
BenchmarkStringer/minus(std)-8          17072347                61.68 ns/op
BenchmarkStringer/minus(my)-8           26117388                40.63 ns/op

BenchmarkStringer/std-all-8             16578752                70.74 ns/op
BenchmarkStringer/my-all-8              19311915                64.46 ns/op

対象を絞り込む

-bench xxx でベンチマーク対象となるテストケースを絞り込むこともできます。

go test -bench /minus
BenchmarkStringer/minus(std)-8          17571860                67.47 ns/op
BenchmarkStringer/minus(my)-8           27569918                43.05 ns/op