[インデックス 12355] ファイルの概要
このコミットは、Go言語のベンチマーク結果比較ツールである benchcmp
の使用方法メッセージを更新するものです。go tool
コマンドの進化に伴い、ベンチマーク結果を生成するための推奨コマンドが変更されたことを反映しています。
コミット
- コミットハッシュ:
bc1e89008d84eab2d661c6add8ef12e1dba32c93
- 作者: Dave Cheney dave@cheney.net
- コミット日時: 2012年3月5日 月曜日 10:57:58 +1100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/bc1e89008d84eab2d661c6add8ef12e1dba32c93
元コミット内容
misc: update usage message in benchcmp for go tool
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5727052
変更の背景
benchcmp
は、Go言語のベンチマーク結果を比較するためのユーティリティツールです。このツールは、2つのベンチマーク結果ファイル(通常は go test -bench
コマンドの出力)を入力として受け取り、パフォーマンスの改善または劣化を分析します。
このコミットが行われた2012年当時、Go言語のツールチェインは活発に開発されており、コマンドラインツールの使用方法や推奨されるプラクティスも進化していました。以前の benchcmp
の使用方法メッセージでは、ベンチマーク結果の生成に gotest -bench
を使用するように指示されていました。しかし、Goツールの標準的な使用方法が go test
コマンドに統合されるにつれて、ベンチマークを実行するためのより正確で推奨されるコマンドライン引数が確立されました。
この変更の背景には、ユーザーが benchcmp
を正しく、かつ最新のGoツールチェインの慣習に沿って使用できるように、ツールのヘルプメッセージを更新する必要があったという点があります。特に、通常のテスト実行を避けつつベンチマークのみを実行し、その出力をファイルにリダイレクトする方法を明確に伝えることが目的でした。
前提知識の解説
benchcmp
ツール
benchcmp
は、Go言語の標準ライブラリの一部として提供される、ベンチマーク結果を比較するためのコマンドラインツールです。Goのベンチマークは、testing
パッケージを使用して記述され、go test
コマンドで実行されます。benchcmp
は、異なるコミットや最適化の前後のベンチマーク結果を比較し、パフォーマンスの変化を数値と統計情報で分かりやすく表示します。
Go言語のベンチマーク
Go言語では、testing
パッケージに Benchmark
というプレフィックスを持つ関数を記述することでベンチマークを作成できます。これらの関数は、go test -bench
コマンドによって実行されます。
例:
package mypackage
import "testing"
func BenchmarkMyFunction(b *testing.B) {
for i := 0; i < b.N; i++ {
// ベンチマーク対象のコード
}
}
go test
コマンドとベンチマーク関連フラグ
go test
はGo言語のテストおよびベンチマーク実行のための主要なコマンドです。
-test.bench=.
: このフラグは、ベンチマークを実行するようにgo test
に指示します。引数に正規表現パターンを指定することで、特定のベンチマーク関数のみを実行できます。.
はすべてのベンチマーク関数にマッチすることを意味します。-test.run=NONE
: このフラグは、通常のテスト関数(Test
プレフィックスを持つ関数)を実行しないようにgo test
に指示します。ベンチマークのみを実行したい場合に非常に重要です。通常のテストが実行されると、ベンチマーク結果に不要な出力が混ざったり、実行時間が長くなったりする可能性があります。NONE
は、どのテスト関数にもマッチしないパターンとして機能します。>
リダイレクト: シェルスクリプトの標準的な機能で、コマンドの標準出力(stdout
)をファイルに書き込むために使用されます。例えば、command > file.txt
はcommand
の出力をfile.txt
に保存します。
gotest
と go test
の関係
コミットメッセージの変更前は gotest -bench
と記載されていましたが、これはGoツールチェインの初期段階におけるテスト実行コマンドの名称、あるいはその当時の慣習的な呼び方であった可能性があります。Go言語のツールは進化し、最終的には go test
がテストとベンチマークを実行するための統一されたコマンドとして確立されました。この変更は、その統一と標準化を反映したものです。
技術的詳細
このコミットの技術的な変更は非常にシンプルですが、Go言語のツールチェインの進化とユーザーエクスペリエンスの改善という点で重要です。
変更前は、benchcmp
の使用方法メッセージは以下のように指示していました。
Each input file should be gotest -bench output.
これは、ベンチマーク結果ファイルが gotest -bench
コマンドの出力であることを示唆していました。しかし、Goツールチェインが成熟するにつれて、ベンチマークを実行するためのより正確で推奨されるコマンドライン引数が go test
コマンドに統合されました。
新しいメッセージは、以下のコマンドを推奨しています。
Each input file should be go test -test.run=NONE -test.bench=. > [old,new].txt
この新しいコマンドは、以下の点で優れています。
go test
の使用:gotest
ではなく、現在の標準的なテストコマンドであるgo test
を明示しています。test.run=NONE
: 通常のテスト関数が実行されないことを保証します。これにより、ベンチマーク結果ファイルには純粋なベンチマーク出力のみが含まれ、benchcmp
が解析しやすくなります。また、テストの実行による余分な時間消費も防ぎます。test.bench=.
: すべてのベンチマーク関数を実行することを明確に示しています。> [old,new].txt
: コマンドの出力を指定されたファイル名(例:old.txt
やnew.txt
)にリダイレクトして保存する方法を具体的に示しています。これはbenchcmp
の入力ファイルとして必要です。
この変更により、ユーザーは benchcmp
を使用する際に、Go言語のベンチマーク結果を生成するための最も正確で効率的な方法をすぐに理解できるようになります。これは、ツールの使いやすさと、Goコミュニティ全体でのベストプラクティスの普及に貢献します。
コアとなるコードの変更箇所
--- a/misc/benchcmp
+++ b/misc/benchcmp
@@ -7,7 +7,7 @@ case "$1" in
-*)
echo 'usage: benchcmp old.txt new.txt' >&2
echo >&2
- echo 'Each input file should be gotest -bench output.' >&2
+ echo 'Each input file should be go test -test.run=NONE -test.bench=. > [old,new].txt' >&2
echo 'Benchcmp compares the first and last for each benchmark.' >&2
exit 2
esac
コアとなるコードの解説
変更は misc/benchcmp
スクリプト内の、コマンドライン引数が不正な場合に表示される使用方法メッセージの1行に限定されています。
具体的には、以下の行が変更されました。
- 変更前:
echo 'Each input file should be gotest -bench output.' >&2
- 変更後:
echo 'Each input file should be go test -test.run=NONE -test.bench=. > [old,new].txt' >&2
この変更は、benchcmp
スクリプトがユーザーに提供するガイダンスを直接更新するものです。benchcmp
はシェルスクリプトであり、そのヘルプメッセージはユーザーがツールを正しく使用するための重要な情報源です。この1行の変更により、ユーザーはベンチマーク結果を生成するために go test
コマンドをどのように使用すべきか、より正確で完全な指示を得られるようになりました。特に、通常のテスト実行をスキップし(-test.run=NONE
)、すべてのベンチマークを実行し(-test.bench=.
)、その出力をファイルに保存する(> [old,new].txt
)という一連のプロセスが明確に示されています。
関連リンク
- Gerrit Change-Id:
https://golang.org/cl/5727052
(GoプロジェクトのコードレビューシステムであるGerrit上の変更リストへのリンク)
参考にした情報源リンク
- Go言語の公式ドキュメント (
go test
コマンド、testing
パッケージのベンチマークに関する情報) benchcmp
ツールの使用方法に関する情報- Go言語の歴史とツールチェインの進化に関する一般的な知識