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

[インデックス 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ツールの管理とユーザーエクスペリエンスの統一という目的があります。

  1. ツールの統合と一貫性: misc/benchcmp はGoリポジトリの misc ディレクトリに置かれたシェルスクリプトであり、Goのビルドシステムとは独立して存在していました。これを go tool の一部とすることで、go buildgo test といった他のGoコマンドと同様に、一貫した方法でツールを利用できるようになります。
  2. 配布とインストール: go tool の一部となることで、benchcmp はGoの配布物に含まれるようになり、ユーザーは別途スクリプトをダウンロードしたり、パスを設定したりする必要がなくなります。これは、ツールの発見性と利用の容易さを大幅に向上させます。
  3. メンテナンスの容易さ: シェルスクリプトとして提供されていた benchcmp は、Goの内部的な変更や新しい機能の追加に対応する際に、Go言語で書かれた他のツールとの連携が難しい場合がありました。Go言語で再実装し、go tool の一部とすることで、将来的なメンテナンスや機能拡張がより容易になります。
  4. 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プログラムのインポートパスと、それらがインストールされるべきターゲットディレクトリ(toTooltoBin など)を定義するGoソースファイルです。
  • src/cmd/go/tool.go: go tool コマンドの内部ロジックを定義するGoソースファイルです。どのツールが go tool の一部として利用可能であるかを管理します。

技術的詳細

このコミットの技術的な変更は、主に以下の3つの側面から構成されます。

  1. misc/benchcmp シェルスクリプトの削除:

    • misc/benchcmp は、awk スクリプトを使用してベンチマーク結果を解析し、比較するシェルスクリプトでした。
    • このスクリプトは、go test -test.bench=. > [old,new].txt のようにして生成されたベンチマーク結果ファイルを引数として受け取り、ns/opMB/sallocs/opB/op などの指標を比較して、変化率や速度向上倍率を表示していました。
    • このコミットにより、このシェルスクリプトは完全に削除されます。
  2. go tool benchcmp の統合:

    • benchcmp の機能は、Go言語で再実装され、code.google.com/p/go.tools/cmd/benchcmp というインポートパスを持つGoパッケージとして提供されるようになります。
    • src/cmd/go/pkg.gogoTools マップに、"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.goisInGoToolsRepo 関数に "benchcmp" が追加されます。これにより、go tool benchcmp というコマンドが認識され、対応するバイナリが実行されるようになります。
  3. ドキュメントの更新:

    • doc/go1.3.txtmisc/benchcmp has been replaced by go tool benchcmp (CL 47980043) という行が追加されます。これは、Go 1.3のリリースノートにこの変更が記載されることを意味し、ユーザーに対して新しい利用方法を周知する役割を果たします。

この変更により、benchcmp はGoの公式ツールチェインの一部となり、Goのビルドシステムによって管理され、配布されるようになります。これにより、ユーザーはGoのインストールと同時に benchcmp を利用できるようになり、ツールの発見性と利用の容易さが向上します。また、Go言語で再実装されることで、クロスプラットフォーム対応や将来的な機能拡張がより容易になります。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更箇所は以下の3つのファイルです。

  1. 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/benchcmpgo tool benchcmp に置き換えられたことが追記されています。

  2. 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 というシェルスクリプトファイルが完全に削除されています。

  3. 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/benchcmptoTool として追加されています。これは、benchcmp がGoのツールとして認識され、インストールされるべきであることを示します。

  4. 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.gogoTools マップへの追加: goTools マップは、go コマンドが認識する外部ツール(Goで書かれたツール)のインポートパスと、それらがインストールされるべき場所を定義します。"code.google.com/p/go.tools/cmd/benchcmp": toTool の追加は、benchcmp がGoの公式ツールとして扱われ、go install コマンドを通じて適切にビルドおよびインストールされるべきであることを示します。toTool は、ツールがGoのツールディレクトリにインストールされることを意味します。
  • src/cmd/go/tool.goisInGoToolsRepo 関数への追加: isInGoToolsRepo 関数は、与えられたツール名が go tool コマンドを通じて実行可能なGoツールリポジトリ内のツールであるかどうかを判断します。"benchcmp" をこの関数の switch ステートメントに追加することで、go tool benchcmp というコマンドが有効になり、Goコマンドが内部的に benchcmp ツールを呼び出すことができるようになります。

これらの変更により、benchcmp はGoの公式なベンチマーク比較ツールとして、Goコマンドラインインターフェースから直接利用できるようになり、Go開発者にとってよりシームレスな体験が提供されます。

関連リンク

参考にした情報源リンク

  • 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の変更リストを検索できます。)