[インデックス 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 false
isInGoToolsRepo
関数内の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 tool
command documentation: (Goの公式ドキュメントでgo tool
コマンドに関する説明を参照してください。)go test
command documentation: (Goの公式ドキュメントでgo test
コマンドのベンチマーク機能に関する説明を参照してください。)benchcmp
tool documentation: (Goの公式ツールリポジトリgolang.org/x/tools
内のcmd/benchcmp
のドキュメントを参照してください。)- Go source code:
src/cmd/go/pkg.go
,src/cmd/go/tool.go
(Goのソースコード自体が最も正確な情報源です。) awk
programming 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の変更リストを検索できます。)