ベンチマークテストの作成

Go言語におけるベンチマークテストの作成は、関数や処理の性能を計測・評価するための機能で、標準の testing パッケージを用いて行います。Goのベンチマークは、繰り返し処理の実行時間を計測し、パフォーマンス改善の指針を得るのに役立ちます。


1. ベンチマークテストの基本構文

Goでベンチマークテストを書くには、次のような形式の関数を作成します。

go
func BenchmarkXxx(b *testing.B) { for i := 0; i < b.N; i++ { // ベンチマーク対象のコード } }
  • 関数名は Benchmark で始める。

  • 引数は *testing.B 型。

  • b.N はGoのベンチマーク実行時に自動的に最適化されたループ回数(負荷が適切になるよう調整される)。


2. 実例:文字列連結のベンチマーク

go
package main import ( "strconv" "testing" ) func BenchmarkStringConcat(b *testing.B) { for i := 0; i < b.N; i++ { s := "" for j := 0; j < 100; j++ { s += strconv.Itoa(j) } } }

この例では、s += strconv.Itoa(j) による文字列連結処理の性能を測定します。


3. 実行方法

ベンチマークテストは次のように実行します:

bash
go test -bench=.

主なオプション:

オプション 説明
-bench=. すべてのベンチマークを実行
-bench=BenchmarkXxx 指定の関数のみ実行
-benchmem メモリアロケーションも表示

例:

bash
go test -bench=. -benchmem

4. 出力例

text
BenchmarkStringConcat-8 2000 800000 ns/op 81920 B/op 100 allocs/op

各項目の意味:

  • BenchmarkStringConcat-8: 実行されたベンチマーク名(-8 はGOMAXPROCSの値)

  • 2000: ループ回数(b.N)

  • 800000 ns/op: 1回あたりの処理時間(ナノ秒)

  • 81920 B/op: 1回あたりのメモリアロケーション量(バイト)

  • 100 allocs/op: 1回あたりのメモリアロケーション回数


5. ベンチマークの注意点

  • ベンチマーク対象のコード以外に、余計な処理を含めないようにする。

  • 入出力(I/O)処理は外すか、モック化することが望ましい。

  • b.ResetTimer() でタイマーのリセットも可能(準備処理の後に実行)。


6. 高度な活用

  • b.StopTimer() / b.StartTimer():一時的に計測を止めたいときに使います。

  • b.ReportAllocs():アロケーションの報告を強制的に有効化。


まとめ

Goのベンチマークテストは、標準の testing パッケージを使って手軽に性能測定ができる強力なツールです。コードのパフォーマンス改善やボトルネック発見に役立ち、go test -bench コマンドにより簡単に利用できます。

生成日:2025/05/03