【Go言語学習|初心者向け】Goのベンチマークで実行回数を固定しよう! -benchtime=Nx の使い方

1. 導入:なぜ実行回数を固定する必要があるのか?

Go言語でパフォーマンスを測定する際、標準のテストツールである `go test -bench` を利用します。通常、ベンチマークは「指定した時間内に何回処理を実行できるか」を計測しますが、実行環境のCPU負荷やバックグラウンドプロセスによって、計測回数が毎回変動してしまうことがあります。
そこで重要になるのが `-benchtime=Nx` というオプションです。これを活用することで、実行時間を基準にするのではなく「処理回数」を固定して計測できるため、環境によるノイズを排除し、コードの改善前と改善後を正確に比較できるようになります。

2. 基礎知識:Goのベンチマークと実行時間

Goのベンチマークは、デフォルトでは「1秒間(1s)」実行し続けた結果を返します。
例えば、非常に高速な処理の場合、1秒間で何百万回も実行されます。一方で、重い処理であれば数回しか実行されません。このとき、もし「処理の呼び出しオーバーヘッド」や「メモリ割り当ての影響」を厳密に比べたい場合、実行時間が変動すると誤差が生じやすくなります。
`-benchtime=Nx` を指定すると、Goは指定された回数(N)だけ処理を繰り返した後に終了します。これにより、計測のたびに結果がブレることを防ぐ「一貫した比較」が可能になります。

3. 実装/解決策:具体的な使い方

使い方は非常にシンプルです。ターミナルで以下のコマンドを実行するだけです。

コマンド: go test -bench=. -benchtime=1000x

このコマンドを実行すると、ベンチマーク関数が必ず1000回実行された時点で終了します。これにより、マシンの負荷状況に左右されず、純粋なアルゴリズムの実行速度を比較できます。

4. サンプルプログラム

以下のコードを `main_test.go` として保存し、動作を確認してみましょう。

package main

import (
“testing”
)

// 測定したい関数(例:単純な加算)
func Add(a, b int) int {
return a + b
}

// ベンチマーク関数
func BenchmarkAdd(b testing.B) {
// 指定した回数分だけループを回す
for i := 0; i < b.N; i++ { Add(1, 2) } } 実行コマンド: go test -bench=BenchmarkAdd -benchtime=5000x 解説:

  • `b.N` は Goのテストツールが自動的に管理する回数ですが、`-benchtime=5000x` を指定することで、この `b.N` が5000として扱われます。
  • 実行結果には「1回あたりの平均処理時間(ns/op)」が表示されます。これが非常に安定した値になることが確認できるはずです。

5. 応用・注意点:現場での活用テクニック

現場でこのオプションを使う際のポイントをいくつか紹介します。

1. 比較実験での活用
コードの最適化前後で比較する場合、デフォルトの `-benchtime=1s` だと、処理の速いコードほど回数が極端に多くなり、比較の前提がズレることがあります。`-benchtime=10000x` のように固定値を設定することで、公平な条件で速度差を計測できます。

2. 注意点:処理時間が長すぎる場合
`-benchtime=Nx` を指定する際、Nの値を大きくしすぎると、処理自体が重い場合に終了まで非常に長い時間がかかってしまいます。まずは小さな値(100xや1000x)から試し、環境に合わせて調整してください。

3. 継続的インテグレーション(CI)での利用
GitHub ActionsなどのCI環境ではCPU性能が変動しがちです。ここでも `-benchtime` を固定することで、パフォーマンステストの再現性を高めることができます。

ぜひ、日々のパフォーマンスチューニングの際に活用してみてください!

コメント

タイトルとURLをコピーしました