Goでテーブル駆動のベンチマークをとる方法
2026-02-23 19:15:24 Go最終更新日から %s 以上が経過しています。
内容が古くなっている可能性があるのでご注意ください。
内容が古くなっている可能性があるのでご注意ください。
公式に記載ありますが、まとめてみます。
ベンチマークのシナリオ
- 数値を文字列に変換する関数を作った。
- 標準パッケージが提供する同種の関数と、パフォーマンスの比較をしたい。
- テーブルとして用意したテストケースそれぞれについて比較をしたい。
書き方(ベンチマークの部分のみ)
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
- 📄 Hugo テーマ 9. Pagefind でサイト内検索機能を付ける2026-06-15 00:11:30静的なインデックスを使った検索 UI を提供する Pagefind を組み込みます。
- 📄 Hugo テーマ 8. Shortcodes と Render hooks2026-06-15 00:11:30Markdown で記述したコンテンツ (テーマの利用側) に対して Hugo が用意した HTML 変換の仕組みを解説します。
- 📄 Hugo テーマ 7. layouts/baseof.html をいじる2026-06-15 00:11:30サイト全体に共通する、ページのレイアウト定義を編集します。
- 📄 Hugo テーマ 6. layouts/home.html をいじる2026-06-15 00:11:30トップページのレイアウト定義を編集します。
- 📄 Hugo テーマ 5. layouts/section.html をいじる2026-06-15 00:11:30content 内のディレクトリーに対応するレイアウト定義を編集します。
- 📄 Hugo テーマ 4. layouts/page.html をいじる2026-06-15 00:11:30コンテンツに対応するページのレイアウトを編集します。
- 📄 Hugo テーマ 3. 作られたファイル2026-06-15 00:11:30前回作ったテーマを構成するファイルを解説します。
- 📄 Hugo テーマ 2. まずは作ってみる2026-06-15 00:11:30テーマを作りプロジェクトに適用するところまでを解説します。
- 📄 Hugo テーマ 1. はじめに2026-06-15 00:11:30連載「Hugo テーマ」を行う背景とその方針を説明します。
- 📄 vvin2026-05-30 16:58:07Windows のウィンドウサイズを操作する CLI アプリ