[インデックス 13948] ファイルの概要
このコミットは、Go言語のベンチマークスイートであるtest/bench/shootoutディレクトリ内のファイルに対する変更です。具体的には、ベンチマークの実行結果を記録するtiming.logファイルと、ベンチマークの実行スクリプトであるtiming.shファイルが更新されています。これらのファイルは、Go言語のパフォーマンス特性を追跡し、最適化の効果を測定するために使用されます。
コミット
このコミットは、amd64アーキテクチャにおける64ビット整数型および浮動小数点演算の改善後に得られた、新しいベンチマークデータ(タイミングログ)を反映しています。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/4391abfb1dc855e7648f2157d301b5b435c6539e
元コミット内容
commit 4391abfb1dc855e7648f2157d301b5b435c6539e
Author: Rob Pike <r@golang.org>
Date: Tue Sep 25 14:14:26 2012 +1000
test/bench/shootout: new data after 64-bit ints for amd64
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/6564046
変更の背景
このコミットの背景には、Go言語のコンパイラおよびランタイムにおける重要な最適化があります。具体的には、amd64アーキテクチャ(64ビットシステム)での64ビット整数型の扱いと、浮動小数点演算のパフォーマンスが大幅に改善されたことが挙げられます。これらの改善は、Go言語がより効率的に数値計算やデータ処理を行えるようになったことを意味します。
このコミットは、これらの最適化が実際のベンチマークにどのような影響を与えたかを記録するために作成されました。ベンチマーク結果を更新することで、Go言語の進化の過程と、特定の最適化がもたらす具体的なパフォーマンス変化を追跡することが可能になります。特に、浮動小数点演算の改善は、科学技術計算やグラフィックス処理など、浮動小数点数を多用するアプリケーションにおいて顕著な性能向上が期待されます。
前提知識の解説
- Go Benchmark Shootout: これは、Go言語のパフォーマンスを他のプログラミング言語と比較するためのベンチマークスイートです。The Computer Language Benchmarks Game (旧称: The Great Computer Language Shootout) に由来し、様々なアルゴリズムや計算負荷の高いタスクを実行して、言語の実装効率を評価します。
- 64-bit ints for amd64:
amd64は、IntelおよびAMDが開発した64ビット命令セットアーキテクチャです。Go言語がこのアーキテクチャ上で64ビット整数型(int64など)をより効率的に処理できるようになったことを指します。これにより、より大きな数値を扱う計算や、メモリ上のデータ構造の操作が高速化されます。 - Floating-point code: 浮動小数点数(
float32,float64など)を扱うコードのことです。科学計算、グラフィックス、機械学習など、実数を扱う多くのアプリケーションで重要となります。浮動小数点演算の改善は、これらの分野でのGo言語のパフォーマンス向上に直結します。 timing.log: ベンチマークの実行時間やリソース使用量などの結果が記録されるログファイルです。このファイルは、時間の経過とともにGo言語のパフォーマンスがどのように変化したかを追跡するための履歴データとして機能します。timing.sh: ベンチマークを実行するためのシェルスクリプトです。このスクリプトは、各ベンチマークプログラムを特定の引数で実行し、その結果をtiming.logに記録する役割を担います。gcc: GNU Compiler Collection。C言語などのコンパイラとして広く使われています。ベンチマークでは、Go言語のパフォーマンスをC言語の実装と比較するために使用されます。gccgo: GCCのGo言語フロントエンド。Go言語のコードをGCCのバックエンドでコンパイルします。gc: Go言語の公式コンパイラ(go tool compile)。gc_B: Go言語の公式コンパイラで、おそらく特定のビルドオプションや最適化レベルを示唆している可能性がありますが、詳細はこのコンテキストからは不明です。一般的には、異なるコンパイラやビルド設定でのパフォーマンス比較のために使用されます。u(user time),s(system time),r(real time): ベンチマーク結果に表示される時間計測の単位です。u(user time): プロセスがユーザーモードでCPUを使用した時間。s(system time): プロセスがカーネルモードでCPUを使用した時間(システムコールなど)。r(real time): プロセスが開始されてから終了するまでの実時間(壁時計時間)。
技術的詳細
このコミットは、Go言語のパフォーマンス改善を具体的に示すベンチマーク結果の更新です。timing.logの変更内容から、以下の点が読み取れます。
- 日付とコメント: 新しいデータは「Sep 26, 2012」の日付で追加されており、「64-bit ints, plus significantly better floating-point code.」というコメントが付記されています。これは、このデータが64ビット整数と浮動小数点演算の改善後に取得されたものであることを明確に示しています。
- 全体的な傾向: コメントには「Generally something in the 0-10% slower range, some (binary tree) more」とあり、一部のベンチマークではわずかにパフォーマンスが低下していることが示唆されています。これは、コンパイラの変更やランタイムの挙動の変化によるもので、必ずしも負の側面ばかりではありません。
- 浮動小数点演算の顕著な改善: 「Floating-point noticeably faster: nbody -25%, mandelbrot -37% relative to Go 1.」と明記されており、
nbodyとmandelbrotという浮動小数点演算を多用するベンチマークで、Go 1と比較してそれぞれ25%と37%の実行時間短縮が達成されたことが示されています。これは、浮動小数点演算の最適化が非常に効果的であったことを裏付けています。 regex-dnaのパフォーマンス低下: 「Other: regex-dna +47%」とあり、regex-dnaベンチマークでは実行時間が47%増加したことが示されています。これは、正規表現エンジンの変更や、64ビット整数/浮動小数点演算の最適化が、この特定のワークロードには不利に働いた可能性を示唆しています。- 新しいベンチマーク結果の追加:
timing.logには、fasta,reverse-complement,nbody,binary-tree,fannkuch,regex-dna,spectral-norm,k-nucleotide,mandelbrot,meteor,pidigits,threadring,chameneosといった様々なベンチマークの新しい実行結果が追加されています。これらの結果は、gcc,gccgo,gc,gc_Bといった異なるコンパイラやランタイムでのパフォーマンスを比較しています。- 例えば、
mandelbrotベンチマークでは、gcコンパイラでの実行時間が38.57uとなり、以前のデータ(コメントアウトされた部分)と比較して改善が見られます。 threadringベンチマークでは、gcコンパイラでの実行時間が13.00uと大幅に改善されています。
- 例えば、
timing.shの変更:timing.shでは、regexdna関数のrunonlyコマンドがrunコマンドに変更されています。runonlyは、そのコマンドのみを実行し、結果をログに記録しないか、特定の条件でのみ実行するような内部的なフラグである可能性があります。runは、ベンチマークを通常通り実行し、その結果をtiming.logに記録するためのコマンドです。 この変更は、regex-dnaベンチマークの結果を正式にtiming.logに含めるようにしたことを意味します。
これらの変更は、Go言語の開発チームが継続的にパフォーマンスの最適化に取り組んでおり、その成果を厳密なベンチマークを通じて検証していることを示しています。特に、特定の数値演算における大幅な改善は、Go言語がより幅広い計算集約型アプリケーションに適応していく上での重要なステップです。
コアとなるコードの変更箇所
このコミットで変更されたコアとなるコードは以下の2つのファイルです。
-
test/bench/shootout/timing.log:- 1069行目以降に、2012年9月26日付けの新しいベンチマーク結果が大量に追加されています。
- 追加されたデータには、
fasta,reverse-complement,nbody,binary-tree,fannkuch,regex-dna,spectral-norm,k-nucleotide,mandelbrot,meteor,pidigits,threadring,chameneosといった各ベンチマークのgcc,gccgo,gc,gc_B(一部)での実行時間が含まれます。 - 特に、
mandelbrotやthreadringなどのベンチマークで、以前のデータと比較して改善が見られる行が追加されています。 - コメントとして「64-bit ints, plus significantly better floating-point code.」や各ベンチマークのパフォーマンス傾向が追記されています。
-
test/bench/shootout/timing.sh:- 126行目の
regexdna()関数内で、runonly 'gcc -O2 regex-dna.c -lpcre' a.out <xという行がrun 'gcc -O2 regex-dna.c -lpcre' a.out <xに変更されています。
- 126行目の
コアとなるコードの解説
test/bench/shootout/timing.logの変更
このファイルへの変更は、Go言語のコンパイラとランタイムの進化に伴うパフォーマンスの具体的な数値データです。新しいベンチマーク結果が追加されたことで、開発者は特定の最適化(この場合は64ビット整数と浮動小数点演算の改善)が、様々な種類の計算負荷に対してどのような影響を与えたかを定量的に評価できます。
例えば、mandelbrotやnbodyのような浮動小数点演算が中心のベンチマークで顕著な速度向上が見られることは、Go言語が数値計算の分野でより競争力を持つようになったことを示しています。一方で、regex-dnaのようにパフォーマンスが低下したベンチマークがあることは、最適化が常に全てのワークロードに均一に適用されるわけではないこと、あるいは特定の最適化が他の部分に予期せぬ影響を与える可能性があることを示唆しています。
このログファイルは、Go言語のパフォーマンス履歴の重要な一部であり、将来の最適化の方向性を決定するための基礎データとなります。
test/bench/shootout/timing.shの変更
timing.shにおけるrunonlyからrunへの変更は、regex-dnaベンチマークの実行方法に関するものです。
runonly: このコマンドは、おそらくベンチマークスクリプトの内部的なデバッグやテスト目的で使用されるもので、その結果がtiming.logに正式に記録されない、あるいは特定の条件でのみ実行されることを意味していたと考えられます。run: このコマンドは、ベンチマークを通常通り実行し、その結果をtiming.logに記録するための標準的なコマンドです。
したがって、この変更は、regex-dnaベンチマークの結果を正式なパフォーマンスログに含めるようにしたことを意味します。これは、regex-dnaのパフォーマンスが、Go言語の全体的なパフォーマンス特性を評価する上で重要な要素であると判断されたためと考えられます。たとえパフォーマンスが低下したとしても、その事実を正確に記録し、将来の改善の対象とすることが目的です。
関連リンク
- Go CL 6564046: https://golang.org/cl/6564046 (Goのコードレビューシステムにおけるこのコミットの変更リスト)
参考にした情報源リンク
- The Computer Language Benchmarks Game: https://benchmarksgame-team.pages.debian.net/benchmarksgame/ (Go言語のベンチマークの背景にあるプロジェクト)
- Go言語の公式ドキュメント (Go言語の基本的な概念やパフォーマンスに関する情報): https://go.dev/doc/
amd64アーキテクチャに関する一般的な情報 (Wikipediaなど)- 浮動小数点演算に関する一般的な情報 (Wikipediaなど)