[インデックス 18413] ファイルの概要
このコミットは、Go言語のツールチェインにおけるベンチマーク結果比較ツール benchcmp の提供方法を変更するものです。具体的には、これまで misc/benchcmp として提供されていたシェルスクリプトを廃止し、go tool benchcmp という形でGoコマンドのサブコマンドとして統合することで、ツールの利用体験と管理を改善しています。
コミット
commit 57bc80b5e8631637f0e756afa1872933ca9db231
Author: Josh Bleecher Snyder <josharian@gmail.com>
Date: Tue Feb 4 11:53:13 2014 -0800
cmd/go, doc/go1.3.txt: misc/benchcmp has been replaced by go tool benchcmp
Fixes #7016.
LGTM=r
R=r
CC=adg, bradfitz, dave, golang-codereviews
https://golang.org/cl/60100043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/57bc80b5e8631637f0e756afa1872933ca9db231
元コミット内容
このコミットの目的は、misc/benchcmp という独立したシェルスクリプトを、go tool benchcmp というGoコマンドのサブコマンドとして再実装し、既存のスクリプトを削除することです。これにより、Goのベンチマーク比較ツールがGoエコシステムに深く統合され、ユーザーは go コマンドを通じて直接利用できるようになります。
変更の背景
この変更の背景には、Goツールの管理とユーザーエクスペリエンスの統一という目的があります。
- ツールの統合と一貫性:
misc/benchcmpはGoリポジトリのmiscディレクトリに置かれたシェルスクリプトであり、Goのビルドシステムとは独立して存在していました。これをgo toolの一部とすることで、go buildやgo testといった他のGoコマンドと同様に、一貫した方法でツールを利用できるようになります。 - 配布とインストール:
go toolの一部となることで、benchcmpはGoの配布物に含まれるようになり、ユーザーは別途スクリプトをダウンロードしたり、パスを設定したりする必要がなくなります。これは、ツールの発見性と利用の容易さを大幅に向上させます。 - メンテナンスの容易さ: シェルスクリプトとして提供されていた
benchcmpは、Goの内部的な変更や新しい機能の追加に対応する際に、Go言語で書かれた他のツールとの連携が難しい場合がありました。Go言語で再実装し、go toolの一部とすることで、将来的なメンテナンスや機能拡張がより容易になります。 - Issue #7016の解決: このコミットは、GoのIssueトラッカーで報告されていた #7016 を修正します。このIssueは、
benchcmpの利用に関する問題や改善提案を含んでいたと考えられます。
前提知識の解説
このコミットを理解するためには、以下の概念について知っておく必要があります。
- Go言語のベンチマーク: Go言語には、
go testコマンドに-benchフラグを付けて実行することで、コードのパフォーマンスを測定するベンチマーク機能が組み込まれています。ベンチマーク結果は通常、ns/op(操作あたりのナノ秒) やB/op(操作あたりのバイト数)、allocs/op(操作あたりのアロケーション数) といった指標で出力されます。 go test -bench: Goのベンチマークを実行するためのコマンドです。例えば、go test -bench=.は現在のパッケージ内のすべてのベンチマークを実行します。benchcmp: 複数のベンチマーク結果ファイル(通常は変更前と変更後のコードのベンチマーク結果)を比較し、パフォーマンスの変化を分かりやすく表示するためのツールです。これにより、コードの変更がパフォーマンスに与える影響を定量的に評価できます。go tool: Goコマンドのサブコマンドの一つで、Goの配布物に含まれる様々な補助ツールを実行するために使用されます。例えば、go tool coverはコードカバレッジツールを実行し、go tool vetはGoコードの潜在的なバグを検出します。go toolの下にツールを配置することで、Goエコシステム全体で一貫したツールの呼び出し方法を提供します。miscディレクトリ: Goリポジトリ内のmiscディレクトリは、公式のGoツールチェインには含まれないが、Goの開発や利用に役立つ様々なスクリプトやユーティリティが置かれる場所でした。これらのツールは、Goのビルドシステムとは独立して管理されることが多かったため、インストールや利用方法が統一されていないという課題がありました。src/cmd/go/pkg.go:goコマンドが認識するGoプログラムのインポートパスと、それらがインストールされるべきターゲットディレクトリ(toToolやtoBinなど)を定義するGoソースファイルです。src/cmd/go/tool.go:go toolコマンドの内部ロジックを定義するGoソースファイルです。どのツールがgo toolの一部として利用可能であるかを管理します。
技術的詳細
このコミットの技術的な変更は、主に以下の3つの側面から構成されます。
-
misc/benchcmpシェルスクリプトの削除:misc/benchcmpは、awkスクリプトを使用してベンチマーク結果を解析し、比較するシェルスクリプトでした。- このスクリプトは、
go test -test.bench=. > [old,new].txtのようにして生成されたベンチマーク結果ファイルを引数として受け取り、ns/op、MB/s、allocs/op、B/opなどの指標を比較して、変化率や速度向上倍率を表示していました。 - このコミットにより、このシェルスクリプトは完全に削除されます。
-
go tool benchcmpの統合:benchcmpの機能は、Go言語で再実装され、code.google.com/p/go.tools/cmd/benchcmpというインポートパスを持つGoパッケージとして提供されるようになります。src/cmd/go/pkg.goのgoToolsマップに、"code.google.com/p/go.tools/cmd/benchcmp": toTool,というエントリが追加されます。これは、go install code.google.com/p/go.tools/cmd/benchcmpを実行すると、そのバイナリがGoのツールディレクトリ(通常は$GOROOT/pkg/tool/$GOOS_$GOARCH)にインストールされることを意味します。src/cmd/go/tool.goのisInGoToolsRepo関数に"benchcmp"が追加されます。これにより、go tool benchcmpというコマンドが認識され、対応するバイナリが実行されるようになります。
-
ドキュメントの更新:
doc/go1.3.txtにmisc/benchcmp has been replaced by go tool benchcmp (CL 47980043)という行が追加されます。これは、Go 1.3のリリースノートにこの変更が記載されることを意味し、ユーザーに対して新しい利用方法を周知する役割を果たします。
この変更により、benchcmp はGoの公式ツールチェインの一部となり、Goのビルドシステムによって管理され、配布されるようになります。これにより、ユーザーはGoのインストールと同時に benchcmp を利用できるようになり、ツールの発見性と利用の容易さが向上します。また、Go言語で再実装されることで、クロスプラットフォーム対応や将来的な機能拡張がより容易になります。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は以下の3つのファイルです。
-
doc/go1.3.txt:--- a/doc/go1.3.txt +++ b/doc/go1.3.txt @@ -4,3 +4,4 @@ misc/dist: renamed misc/makerelease (CL 39920043) runtime: output how long goroutines are blocked (CL 50420043) syscall: add NewCallbackCDecl to use for windows callbacks (CL 36180044) testing: diagnose buggy tests that panic(nil) (CL 55780043) +misc/benchcmp has been replaced by go tool benchcmp (CL 47980043)Go 1.3のリリースノートに、
misc/benchcmpがgo tool benchcmpに置き換えられたことが追記されています。 -
misc/benchcmp:--- a/misc/benchcmp +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh -# Copyright 2011 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -... (中略:awkスクリプトの全内容) ...misc/benchcmpというシェルスクリプトファイルが完全に削除されています。 -
src/cmd/go/pkg.go:--- a/src/cmd/go/pkg.go +++ b/src/cmd/go/pkg.go @@ -304,16 +304,17 @@ const ( // goTools is a map of Go program import path to install target directory. var goTools = map[string]targetDir{ - "cmd/api": toTool, - "cmd/cgo": toTool, - "cmd/fix": toTool, - "cmd/link": toTool, - "cmd/nm": toTool, - "cmd/pack": toTool, - "cmd/yacc": toTool, - "code.google.com/p/go.tools/cmd/cover": toTool, - "code.google.com/p/go.tools/cmd/godoc": toBin, - "code.google.com/p/go.tools/cmd/vet": toTool, + "cmd/api": toTool, + "cmd/cgo": toTool, + "cmd/fix": toTool, + "cmd/link": toTool, + "cmd/nm": toTool, + "cmd/pack": toTool, + "cmd/yacc": toTool, + "code.google.com/p/go.tools/cmd/benchcmp": toTool, // 追加 + "code.google.com/p/go.tools/cmd/cover": toTool, + "code.google.com/p/go.tools/cmd/godoc": toBin, + "code.google.com/p/go.tools/cmd/vet": toTool, } // expandScanner expands a scanner.List error into all the errors in the list.goToolsマップにcode.google.com/p/go.tools/cmd/benchcmpがtoToolとして追加されています。これは、benchcmpがGoのツールとして認識され、インストールされるべきであることを示します。 -
src/cmd/go/tool.go:--- a/src/cmd/go/tool.go +++ b/src/cmd/go/tool.go @@ -65,7 +65,7 @@ func tool(toolName string) string { func isInGoToolsRepo(toolName string) bool { switch toolName { - case "cover", "vet": + case "benchcmp", "cover", "vet": // "benchcmp" を追加 return true } return falseisInGoToolsRepo関数内のswitchステートメントに"benchcmp"が追加されています。これにより、go tool benchcmpが有効なコマンドとして認識されるようになります。
コアとなるコードの解説
doc/go1.3.txtの変更: この変更は、ユーザー向けのドキュメント更新であり、Go 1.3のリリース時にこの重要な変更がユーザーに伝わるようにするためのものです。これにより、ユーザーは古いmisc/benchcmpスクリプトではなく、新しいgo tool benchcmpを利用すべきであることを知ることができます。misc/benchcmpの削除: これは、benchcmpの機能がGo言語で再実装され、Goツールチェインに統合されたため、古いシェルスクリプトが不要になったことを意味します。これにより、Goリポジトリのクリーンアップと、ツールの提供方法の統一が図られます。src/cmd/go/pkg.goのgoToolsマップへの追加:goToolsマップは、goコマンドが認識する外部ツール(Goで書かれたツール)のインポートパスと、それらがインストールされるべき場所を定義します。"code.google.com/p/go.tools/cmd/benchcmp": toToolの追加は、benchcmpがGoの公式ツールとして扱われ、go installコマンドを通じて適切にビルドおよびインストールされるべきであることを示します。toToolは、ツールがGoのツールディレクトリにインストールされることを意味します。src/cmd/go/tool.goのisInGoToolsRepo関数への追加:isInGoToolsRepo関数は、与えられたツール名がgo toolコマンドを通じて実行可能なGoツールリポジトリ内のツールであるかどうかを判断します。"benchcmp"をこの関数のswitchステートメントに追加することで、go tool benchcmpというコマンドが有効になり、Goコマンドが内部的にbenchcmpツールを呼び出すことができるようになります。
これらの変更により、benchcmp はGoの公式なベンチマーク比較ツールとして、Goコマンドラインインターフェースから直接利用できるようになり、Go開発者にとってよりシームレスな体験が提供されます。
関連リンク
- Go Issue #7016: https://github.com/golang/go/issues/7016 (このコミットが修正したIssue)
- Go CL 60100043: https://golang.org/cl/60100043 (このコミットに対応するGoの変更リスト)
- Go CL 47980043: https://golang.org/cl/47980043 (Go 1.3のドキュメント更新で参照されているCL)
参考にした情報源リンク
- Go 1.3 Release Notes: (Go 1.3の公式リリースノートでこの変更が言及されている可能性があります。リリースノートのアーカイブを確認してください。)
go toolcommand documentation: (Goの公式ドキュメントでgo toolコマンドに関する説明を参照してください。)go testcommand documentation: (Goの公式ドキュメントでgo testコマンドのベンチマーク機能に関する説明を参照してください。)benchcmptool documentation: (Goの公式ツールリポジトリgolang.org/x/tools内のcmd/benchcmpのドキュメントを参照してください。)- Go source code:
src/cmd/go/pkg.go,src/cmd/go/tool.go(Goのソースコード自体が最も正確な情報源です。) awkprogramming language: (シェルスクリプト版benchcmpで使用されていたawkに関する情報源。)- Shell scripting: (シェルスクリプトの基本的な知識に関する情報源。)
- Go issue tracker: https://github.com/golang/go/issues (GoのIssueトラッカーで関連する議論や背景情報を検索できます。)
- Go code reviews: https://go-review.googlesource.com/ (Goの変更リストを検索できます。)