Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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.txtcommand の出力を file.txt に保存します。

gotestgo 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

この新しいコマンドは、以下の点で優れています。

  1. go test の使用: gotest ではなく、現在の標準的なテストコマンドである go test を明示しています。
  2. test.run=NONE: 通常のテスト関数が実行されないことを保証します。これにより、ベンチマーク結果ファイルには純粋なベンチマーク出力のみが含まれ、benchcmp が解析しやすくなります。また、テストの実行による余分な時間消費も防ぎます。
  3. test.bench=.: すべてのベンチマーク関数を実行することを明確に示しています。
  4. > [old,new].txt: コマンドの出力を指定されたファイル名(例: old.txtnew.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言語の歴史とツールチェインの進化に関する一般的な知識