[インデックス 13043] ファイルの概要
このコミットは、Go言語のベンチマークスイートであるtest/bench/shootout
ディレクトリ内のテストスクリプトtiming.sh
における、gccgo
コンパイラを用いたbinary-tree-freelist
ベンチマークの実行方法の修正に関するものです。具体的には、生成される実行ファイル名の指定が誤っていた点を修正し、テストが正しく実行されるようにしています。
コミット
- コミットハッシュ:
dc6ec74f07e380f7414359acd8e2463fbbf7f0c2
- 作者: Ian Lance Taylor iant@golang.org
- コミット日時: Mon May 7 10:14:50 2012 -0700
- コミットメッセージ:
test/bench/shootout: fix gccgo binary-list-freelist test R=r CC=golang-dev https://golang.org/cl/6202046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/dc6ec74f07e380f7414359acd8e2463fbbf7f0c2
元コミット内容
test/bench/shootout: fix gccgo binary-list-freelist test
このコミットは、test/bench/shootout
ディレクトリにあるベンチマークテストにおいて、gccgo
コンパイラでコンパイルされたbinary-tree-freelist
テストの実行方法に存在するバグを修正することを目的としています。
変更の背景
Go言語のプロジェクトでは、様々なコンパイラや実行環境におけるパフォーマンスを測定するために、ベンチマークテストが定期的に実行されます。test/bench/shootout
ディレクトリは、主にComputer Language Benchmarks Game (CLBG) のベンチマークをGo言語に移植したものが含まれており、異なるGoコンパイラ(例: gc
、gccgo
)やCコンパイラ(例: gcc
)でのパフォーマンス比較に用いられます。
このコミットが行われた当時、Go言語には主に2つの主要なコンパイラが存在しました。
gc
: Goチームが開発している公式のコンパイラ(go tool compile
)。gccgo
: GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラ。
timing.sh
スクリプトは、これらの異なるコンパイラでベンチマークを実行し、その時間を測定するためのシェルスクリプトです。問題は、gccgo
でbinary-tree-freelist.go
をコンパイルした際に生成される実行ファイルの名前が、スクリプト内で期待されているものと異なっていたことにありました。
従来のgc
コンパイラやCコンパイラでは、$O.out
という変数(おそらくベンチマーク名に基づいて動的に生成されるファイル名)が実行ファイル名として使われていましたが、gccgo
の場合、デフォルトではコンパイルされた実行ファイルはa.out
という名前で生成されます。この不一致により、gccgo
でコンパイルされたbinary-tree-freelist
のテストが正しく実行されず、ベンチマーク結果が得られない、または誤った結果が記録される可能性がありました。
このコミットは、このファイル名の不一致を修正し、gccgo
でコンパイルされたbinary-tree-freelist.go
が正しくa.out
として実行されるようにすることで、ベンチマークの信頼性を向上させることを目的としています。
前提知識の解説
Go言語 (Golang)
Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンカレンシーのサポート(goroutineとchannel)、ガベージコレクション、高速なコンパイルなどが特徴です。システムプログラミング、Webサービス、ネットワークプログラミングなどで広く利用されています。
gc
コンパイラ
Go言語の公式コンパイラであり、Goツールチェインの一部として提供されています。通常、go build
コマンドを使用すると、このgc
コンパイラが内部的に呼び出されます。Go言語のセマンティクスに厳密に従い、最適化されたバイナリを生成します。
gccgo
コンパイラ
GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラです。gccgo
は、Go言語のコードをGCCのバックエンドを通じてコンパイルするため、C/C++など他のGCCがサポートする言語と同様の最適化やリンカの機能を利用できます。gc
コンパイラとは異なるコード生成パスを持つため、パフォーマンス特性や生成されるバイナリの挙動が異なる場合があります。特に、デフォルトの出力ファイル名がa.out
となるのは、GCCの伝統的な挙動に由来します。
Computer Language Benchmarks Game (CLBG)
異なるプログラミング言語やコンパイラのパフォーマンスを比較するためのベンチマークスイートです。様々なアルゴリズムやデータ構造を実装したプログラムが含まれており、それぞれの言語での実行速度、メモリ使用量などを測定します。test/bench/shootout
ディレクトリ内のベンチマークは、このCLBGから派生したものです。
Binary Tree (二分木)
コンピュータサイエンスにおける基本的なデータ構造の一つです。各ノードが最大2つの子ノード(左の子と右の子)を持つツリー構造です。探索、挿入、削除などの操作が効率的に行えるため、様々なアルゴリズムの基盤となります。
Freelist (フリーリスト)
メモリ管理のテクニックの一つです。頻繁に確保・解放されるオブジェクトのために、解放されたメモリブロックを再利用可能なリスト(フリーリスト)として管理します。これにより、動的なメモリ確保・解放に伴うオーバーヘッドを削減し、パフォーマンスを向上させることができます。binary-tree-freelist
ベンチマークは、二分木操作におけるメモリ確保・解放の効率を、フリーリストを使用した場合としない場合で比較するようなシナリオを想定していると考えられます。
timing.sh
Go言語プロジェクトのベンチマークスクリプトで、シェルスクリプトとして実装されています。このスクリプトは、様々なベンチマークプログラムを異なるコンパイラ(gcc
, gccgo
, gc
など)でコンパイルし、実行し、その実行時間を測定します。
$O.out
と a.out
$O.out
: このスクリプト内で使われている変数で、おそらくベンチマーク名(例:binary-tree
)に基づいて動的に生成される実行ファイル名を指します。gc
コンパイラは、通常、ソースファイル名(例:binary-tree.go
)から拡張子を除いた名前(binary-tree
)で実行ファイルを生成します。スクリプト内で$O
がどのように定義されているかによりますが、慣例的にbinary-tree.out
のような名前になることが想定されます。a.out
: Unix系システムにおける伝統的な実行ファイル名です。GCCなどのコンパイラは、特に指定がない場合、コンパイルされた実行ファイルをデフォルトでa.out
という名前で出力します。
技術的詳細
このコミットの技術的な核心は、シェルスクリプトtiming.sh
内でのgccgo
コンパイラの挙動と、それに対応する実行ファイル名の扱いの違いを修正した点にあります。
timing.sh
スクリプトは、run
というヘルパー関数を使ってベンチマークを実行しています。このrun
関数は、コンパイルコマンドと実行ファイル名、そして引数を受け取ってベンチマークを実行する役割を担っています。
変更前のtiming.sh
の関連部分を見てみましょう。
# 変更前
run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
ここで、gccgo -O2 binary-tree-freelist.go
はbinary-tree-freelist.go
をgccgo
でコンパイルするコマンドです。問題は、その次に続く実行ファイル名の指定が$O.out
となっていた点です。
前述の通り、gccgo
はデフォルトでa.out
という名前で実行ファイルを生成します。しかし、スクリプトは$O.out
という名前のファイルを期待していました。このため、gccgo
でコンパイルされたbinary-tree-freelist.go
はa.out
として生成されるにもかかわらず、スクリプトは存在しない$O.out
を探しに行ってしまい、ベンチマークが失敗していました。
このコミットでは、この部分を以下のように修正しました。
# 変更後
run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15
$O.out
をa.out
に直接置き換えることで、gccgo
が生成するデフォルトの実行ファイル名と、スクリプトが実行しようとするファイル名が一致するようになりました。これにより、gccgo
を用いたbinary-tree-freelist
ベンチマークが正しく実行されるようになり、ベンチマーク結果の信頼性が確保されました。
この修正は、Go言語のベンチマークシステムにおける、異なるコンパイラの特性を考慮した堅牢性の向上に寄与しています。
コアとなるコードの変更箇所
--- a/test/bench/shootout/timing.sh
+++ b/test/bench/shootout/timing.sh
@@ -107,7 +107,7 @@ binarytree() {
runonly echo 'binary-tree 15 # too slow to use 20'
run 'gcc -O2 binary-tree.c -lm' a.out 15
run 'gccgo -O2 binary-tree.go' a.out -n 15
- run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
+ run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15
run 'gc binary-tree' $O.out -n 15
run 'gc binary-tree-freelist' $O.out -n 15
}
コアとなるコードの解説
変更はtest/bench/shootout/timing.sh
ファイル内のbinarytree()
シェル関数内で行われています。
binarytree()
関数は、二分木関連のベンチマークを実行するためのセクションです。この関数内で、様々なコンパイラ(gcc
、gccgo
、gc
)を使ってbinary-tree
およびbinary-tree-freelist
ベンチマークを実行しています。
変更された行は以下の部分です。
- run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
+ run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15
run
: これはtiming.sh
スクリプト内で定義されているカスタム関数で、ベンチマークのコンパイルと実行をラップしています。通常、第一引数にコンパイルコマンド、第二引数に実行ファイル名、第三引数以降にその実行ファイルに渡す引数を取ります。'gccgo -O2 binary-tree-freelist.go'
: これは、binary-tree-freelist.go
というGoソースファイルをgccgo
コンパイラを使ってコンパイルするコマンドです。-O2
は最適化レベルを指定しています。$O.out
(変更前): ここが問題の箇所でした。スクリプトの他の部分やgc
コンパイラでは、ベンチマーク名に基づいた動的なファイル名(例:binary-tree-freelist.out
)が期待されていましたが、gccgo
はデフォルトでa.out
を生成するため、この指定ではファイルが見つかりませんでした。a.out
(変更後):gccgo
がデフォルトで生成する実行ファイル名に修正されました。これにより、run
関数がgccgo
によって生成された正しい実行ファイルを指定してベンチマークを実行できるようになりました。-n 15
: これは、binary-tree-freelist
ベンチマークプログラムに渡される引数で、おそらくベンチマークの実行回数や深さなどを指定していると考えられます。
この修正により、gccgo
コンパイラを使用した場合でも、binary-tree-freelist
ベンチマークが意図通りに実行され、正確なパフォーマンスデータが収集されるようになりました。
関連リンク
- Go言語公式サイト: https://golang.org/
- GCC (GNU Compiler Collection) 公式サイト: https://gcc.gnu.org/
- Computer Language Benchmarks Game: https://benchmarksgame-team.pages.debian.net/benchmarksgame/
- Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージにある
https://golang.org/cl/6202046
はこのシステムへのリンクです)
参考にした情報源リンク
- Go言語の公式ドキュメント
- GCCのドキュメント
- Computer Language Benchmarks Gameのウェブサイト
- Go言語のソースコードリポジトリ (特に
test/bench/shootout
ディレクトリの内容) - Go言語のコードレビューシステム (Gerrit) 上の関連する変更リスト (CL)
- Unix/Linuxにおける
a.out
の慣習に関する一般的な知識# [インデックス 13043] ファイルの概要
このコミットは、Go言語のベンチマークスイートであるtest/bench/shootout
ディレクトリ内のテストスクリプトtiming.sh
における、gccgo
コンパイラを用いたbinary-tree-freelist
ベンチマークの実行方法の修正に関するものです。具体的には、生成される実行ファイル名の指定が誤っていた点を修正し、テストが正しく実行されるようにしています。
コミット
- コミットハッシュ:
dc6ec74f07e380f7414359acd8e2463fbbf7f0c2
- 作者: Ian Lance Taylor iant@golang.org
- コミット日時: Mon May 7 10:14:50 2012 -0700
- コミットメッセージ:
test/bench/shootout: fix gccgo binary-list-freelist test R=r CC=golang-dev https://golang.org/cl/6202046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/dc6ec74f07e380f7414359acd8e2463fbbf7f0c2
元コミット内容
test/bench/shootout: fix gccgo binary-list-freelist test
このコミットは、test/bench/shootout
ディレクトリにあるベンチマークテストにおいて、gccgo
コンパイラでコンパイルされたbinary-tree-freelist
テストの実行方法に存在するバグを修正することを目的としています。
変更の背景
Go言語のプロジェクトでは、様々なコンパイラや実行環境におけるパフォーマンスを測定するために、ベンチマークテストが定期的に実行されます。test/bench/shootout
ディレクトリは、主にComputer Language Benchmarks Game (CLBG) のベンチマークをGo言語に移植したものが含まれており、異なるGoコンパイラ(例: gc
、gccgo
)やCコンパイラ(例: gcc
)でのパフォーマンス比較に用いられます。
このコミットが行われた当時、Go言語には主に2つの主要なコンパイラが存在しました。
gc
: Goチームが開発している公式のコンパイラ(go tool compile
)。gccgo
: GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラ。
timing.sh
スクリプトは、これらの異なるコンパイラでベンチマークを実行し、その時間を測定するためのシェルスクリプトです。問題は、gccgo
でbinary-tree-freelist.go
をコンパイルした際に生成される実行ファイルの名前が、スクリプト内で期待されているものと異なっていたことにありました。
従来のgc
コンパイラやCコンパイラでは、$O.out
という変数(おそらくベンチマーク名に基づいて動的に生成されるファイル名)が実行ファイル名として使われていましたが、gccgo
の場合、デフォルトではコンパイルされた実行ファイルはa.out
という名前で生成されます。この不一致により、gccgo
でコンパイルされたbinary-tree-freelist
のテストが正しく実行されず、ベンチマーク結果が得られない、または誤った結果が記録される可能性がありました。
このコミットは、このファイル名の不一致を修正し、gccgo
でコンパイルされたbinary-tree-freelist.go
が正しくa.out
として実行されるようにすることで、ベンチマークの信頼性を向上させることを目的としています。
前提知識の解説
Go言語 (Golang)
Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンカレンシーのサポート(goroutineとchannel)、ガベージコレクション、高速なコンパイルなどが特徴です。システムプログラミング、Webサービス、ネットワークプログラミングなどで広く利用されています。
gc
コンパイラ
Go言語の公式コンパイラであり、Goツールチェインの一部として提供されています。通常、go build
コマンドを使用すると、このgc
コンパイラが内部的に呼び出されます。Go言語のセマンティクスに厳密に従い、最適化されたバイナリを生成します。
gccgo
コンパイラ
GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラです。gccgo
は、Go言語のコードをGCCのバックエンドを通じてコンパイルするため、C/C++など他のGCCがサポートする言語と同様の最適化やリンカの機能を利用できます。gc
コンパイラとは異なるコード生成パスを持つため、パフォーマンス特性や生成されるバイナリの挙動が異なる場合があります。特に、デフォルトの出力ファイル名がa.out
となるのは、GCCの伝統的な挙動に由来します。
Computer Language Benchmarks Game (CLBG)
異なるプログラミング言語やコンパイラのパフォーマンスを比較するためのベンチマークスイートです。様々なアルゴリズムやデータ構造を実装したプログラムが含まれており、それぞれの言語での実行速度、メモリ使用量などを測定します。test/bench/shootout
ディレクトリ内のベンチマークは、このCLBGから派生したものです。
Binary Tree (二分木)
コンピュータサイエンスにおける基本的なデータ構造の一つです。各ノードが最大2つの子ノード(左の子と右の子)を持つツリー構造です。探索、挿入、削除などの操作が効率的に行えるため、様々なアルゴリズムの基盤となります。
Freelist (フリーリスト)
メモリ管理のテクニックの一つです。頻繁に確保・解放されるオブジェクトのために、解放されたメモリブロックを再利用可能なリスト(フリーリスト)として管理します。これにより、動的なメモリ確保・解放に伴うオーバーヘッドを削減し、パフォーマンスを向上させることができます。binary-tree-freelist
ベンチマークは、二分木操作におけるメモリ確保・解放の効率を、フリーリストを使用した場合としない場合で比較するようなシナリオを想定していると考えられます。
timing.sh
Go言語プロジェクトのベンチマークスクリプトで、シェルスクリプトとして実装されています。このスクリプトは、様々なベンチマークプログラムを異なるコンパイラ(gcc
, gccgo
, gc
など)でコンパイルし、実行し、その実行時間を測定します。
$O.out
と a.out
$O.out
: このスクリプト内で使われている変数で、おそらくベンチマーク名(例:binary-tree
)に基づいて動的に生成される実行ファイル名を指します。gc
コンパイラは、通常、ソースファイル名(例:binary-tree.go
)から拡張子を除いた名前(binary-tree
)で実行ファイルを生成します。スクリプト内で$O
がどのように定義されているかによりますが、慣例的にbinary-tree.out
のような名前になることが想定されます。a.out
: Unix系システムにおける伝統的な実行ファイル名です。GCCなどのコンパイラは、特に指定がない場合、コンパイルされた実行ファイルをデフォルトでa.out
という名前で出力します。
技術的詳細
このコミットの技術的な核心は、シェルスクリプトtiming.sh
内でのgccgo
コンパイラの挙動と、それに対応する実行ファイル名の扱いの違いを修正した点にあります。
timing.sh
スクリプトは、run
というヘルパー関数を使ってベンチマークを実行しています。このrun
関数は、コンパイルコマンドと実行ファイル名、そして引数を受け取ってベンチマークを実行する役割を担っています。
変更前のtiming.sh
の関連部分を見てみましょう。
# 変更前
run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
ここで、gccgo -O2 binary-tree-freelist.go
はbinary-tree-freelist.go
をgccgo
でコンパイルするコマンドです。問題は、その次に続く実行ファイル名の指定が$O.out
となっていた点です。
前述の通り、gccgo
はデフォルトでa.out
という名前で実行ファイルを生成します。しかし、スクリプトは$O.out
という名前のファイルを期待していました。このため、gccgo
でコンパイルされたbinary-tree-freelist.go
はa.out
として生成されるにもかかわらず、スクリプトは存在しない$O.out
を探しに行ってしまい、ベンチマークが失敗していました。
このコミットでは、この部分を以下のように修正しました。
# 変更後
run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15
$O.out
をa.out
に直接置き換えることで、gccgo
が生成するデフォルトの実行ファイル名と、スクリプトが実行しようとするファイル名が一致するようになりました。これにより、gccgo
を用いたbinary-tree-freelist
ベンチマークが正しく実行されるようになり、ベンチマーク結果の信頼性が確保されました。
この修正は、Go言語のベンチマークシステムにおける、異なるコンパイラの特性を考慮した堅牢性の向上に寄与しています。
コアとなるコードの変更箇所
--- a/test/bench/shootout/timing.sh
+++ b/test/bench/shootout/timing.sh
@@ -107,7 +107,7 @@ binarytree() {
runonly echo 'binary-tree 15 # too slow to use 20'
run 'gcc -O2 binary-tree.c -lm' a.out 15
run 'gccgo -O2 binary-tree.go' a.out -n 15
- run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
+ run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15
run 'gc binary-tree' $O.out -n 15
run 'gc binary-tree-freelist' $O.out -n 15
}
コアとなるコードの解説
変更はtest/bench/shootout/timing.sh
ファイル内のbinarytree()
シェル関数内で行われています。
binarytree()
関数は、二分木関連のベンチマークを実行するためのセクションです。この関数内で、様々なコンパイラ(gcc
、gccgo
、gc
)を使ってbinary-tree
およびbinary-tree-freelist
ベンチマークを実行しています。
変更された行は以下の部分です。
- run 'gccgo -O2 binary-tree-freelist.go' $O.out -n 15
+ run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15
run
: これはtiming.sh
スクリプト内で定義されているカスタム関数で、ベンチマークのコンパイルと実行をラップしています。通常、第一引数にコンパイルコマンド、第二引数に実行ファイル名、第三引数以降にその実行ファイルに渡す引数を取ります。'gccgo -O2 binary-tree-freelist.go'
: これは、binary-tree-freelist.go
というGoソースファイルをgccgo
コンパイラを使ってコンパイルするコマンドです。-O2
は最適化レベルを指定しています。$O.out
(変更前): ここが問題の箇所でした。スクリプトの他の部分やgc
コンパイラでは、ベンチマーク名に基づいた動的なファイル名(例:binary-tree-freelist.out
)が期待されていましたが、gccgo
はデフォルトでa.out
を生成するため、この指定ではファイルが見つかりませんでした。a.out
(変更後):gccgo
がデフォルトで生成する実行ファイル名に修正されました。これにより、run
関数がgccgo
によって生成された正しい実行ファイルを指定してベンチマークを実行できるようになりました。-n 15
: これは、binary-tree-freelist
ベンチマークプログラムに渡される引数で、おそらくベンチマークの実行回数や深さなどを指定していると考えられます。
この修正により、gccgo
コンパイラを使用した場合でも、binary-tree-freelist
ベンチマークが意図通りに実行され、正確なパフォーマンスデータが収集されるようになりました。
関連リンク
- Go言語公式サイト: https://golang.org/
- GCC (GNU Compiler Collection) 公式サイト: https://gcc.gnu.org/
- Computer Language Benchmarks Game: https://benchmarksgame-team.pages.debian.net/benchmarksgame/
- Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージにある
https://golang.org/cl/6202046
はこのシステムへのリンクです)
参考にした情報源リンク
- Go言語の公式ドキュメント
- GCCのドキュメント
- Computer Language Benchmarks Gameのウェブサイト
- Go言語のソースコードリポジトリ (特に
test/bench/shootout
ディレクトリの内容) - Go言語のコードレビューシステム (Gerrit) 上の関連する変更リスト (CL)
- Unix/Linuxにおける
a.out
の慣習に関する一般的な知識