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

[インデックス 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コンパイラ(例: gcgccgo)やCコンパイラ(例: gcc)でのパフォーマンス比較に用いられます。

このコミットが行われた当時、Go言語には主に2つの主要なコンパイラが存在しました。

  1. gc: Goチームが開発している公式のコンパイラ(go tool compile)。
  2. gccgo: GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラ。

timing.shスクリプトは、これらの異なるコンパイラでベンチマークを実行し、その時間を測定するためのシェルスクリプトです。問題は、gccgobinary-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.outa.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.gobinary-tree-freelist.gogccgoでコンパイルするコマンドです。問題は、その次に続く実行ファイル名の指定が$O.outとなっていた点です。

前述の通り、gccgoはデフォルトでa.outという名前で実行ファイルを生成します。しかし、スクリプトは$O.outという名前のファイルを期待していました。このため、gccgoでコンパイルされたbinary-tree-freelist.goa.outとして生成されるにもかかわらず、スクリプトは存在しない$O.outを探しに行ってしまい、ベンチマークが失敗していました。

このコミットでは、この部分を以下のように修正しました。

# 変更後
run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15

$O.outa.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()関数は、二分木関連のベンチマークを実行するためのセクションです。この関数内で、様々なコンパイラ(gccgccgogc)を使って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言語の公式ドキュメント
  • 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コンパイラ(例: gcgccgo)やCコンパイラ(例: gcc)でのパフォーマンス比較に用いられます。

このコミットが行われた当時、Go言語には主に2つの主要なコンパイラが存在しました。

  1. gc: Goチームが開発している公式のコンパイラ(go tool compile)。
  2. gccgo: GCC (GNU Compiler Collection) のフロントエンドとしてGo言語をサポートするコンパイラ。

timing.shスクリプトは、これらの異なるコンパイラでベンチマークを実行し、その時間を測定するためのシェルスクリプトです。問題は、gccgobinary-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.outa.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.gobinary-tree-freelist.gogccgoでコンパイルするコマンドです。問題は、その次に続く実行ファイル名の指定が$O.outとなっていた点です。

前述の通り、gccgoはデフォルトでa.outという名前で実行ファイルを生成します。しかし、スクリプトは$O.outという名前のファイルを期待していました。このため、gccgoでコンパイルされたbinary-tree-freelist.goa.outとして生成されるにもかかわらず、スクリプトは存在しない$O.outを探しに行ってしまい、ベンチマークが失敗していました。

このコミットでは、この部分を以下のように修正しました。

# 変更後
run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15

$O.outa.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()関数は、二分木関連のベンチマークを実行するためのセクションです。この関数内で、様々なコンパイラ(gccgccgogc)を使って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言語の公式ドキュメント
  • GCCのドキュメント
  • Computer Language Benchmarks Gameのウェブサイト
  • Go言語のソースコードリポジトリ (特にtest/bench/shootoutディレクトリの内容)
  • Go言語のコードレビューシステム (Gerrit) 上の関連する変更リスト (CL)
  • Unix/Linuxにおけるa.outの慣習に関する一般的な知識