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

[インデックス 16396] ファイルの概要

このコミットは、Go言語のベンチマーク結果を記録するtest/bench/shootout/timing.logファイルを更新するものです。具体的には、Go 1.1リリースに伴うパフォーマンス改善を反映したベンチマーク結果が追加されています。

コミット

commit 9bdb7e196712d5d894602d7dc5b68eaeecc14924
Author: Rob Pike <r@golang.org>
Date:   Thu May 23 17:57:28 2013 -0700

    test/bench/shootout/timing.log: update to Go 1.1
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/9656045

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/9bdb7e196712d5d894602d7dc5b68eaeecc14924

元コミット内容

    test/bench/shootout/timing.log: update to Go 1.1
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/9656045

変更の背景

このコミットの背景には、Go言語のバージョン1.1のリリースがあります。Go 1.1は、Go言語の歴史において重要なマイルストーンとなるリリースであり、特にパフォーマンス面で大きな改善が加えられました。コミットメッセージにもあるように、「precise GC(正確なガベージコレクション)」、「new scheduler(新しいスケジューラ)」、「faster maps(高速なマップ)」といった主要な機能強化が含まれています。これらの改善により、多くのベンチマークで約20%の速度向上が見込まれていました。

test/bench/shootout/timing.logファイルは、Go言語のパフォーマンスを追跡するためのベンチマーク結果を記録するものです。Go 1.1のリリースに伴い、新しいバージョンのGoコンパイラ(gc)およびGCCベースのGoコンパイラ(gccgo)で実行されたベンチマークの最新結果を反映させる必要がありました。これにより、Go 1.1がもたらした実際のパフォーマンス向上を数値で確認し、記録することが目的です。

前提知識の解説

Go言語のベンチマーク

Go言語のプロジェクトでは、言語自体のパフォーマンスを継続的に測定し、改善するために様々なベンチマークが実行されています。これらのベンチマークは、特定のアルゴリズムや一般的なプログラミングタスクを異なる言語やコンパイラで実行し、その実行時間やリソース使用量を比較することで、言語やランタイムの効率性を評価します。

Computer Language Benchmarks Game (CLBG)

shootoutというディレクトリ名が示すように、このベンチマークは「Computer Language Benchmarks Game」(以前は「The Great Computer Language Shootout」として知られていた)に由来しています。これは、様々なプログラミング言語のパフォーマンスを比較するための標準的なベンチマークスイートです。CLBGは、数値計算、文字列処理、並行処理など、多岐にわたるタスクのプログラムを提供し、各言語の実装がどれだけ効率的かを測定します。timing.logファイルに記録されているfasta, reverse-complement, nbody, binary-tree, fannkuch, regex-dna, k-nucleotide, mandelbrot, meteor, pidigits, threadring, chameneosといった項目は、CLBGに含まれる代表的なベンチマークプログラムです。

Goコンパイラ (gc) と GCCGo (gccgo)

Go言語には主に2つの主要なコンパイラがあります。

  • gc: Goプロジェクトが公式に開発している標準のコンパイラです。Go言語のリリースサイクルに合わせて機能が追加・改善されます。
  • gccgo: GCC(GNU Compiler Collection)をバックエンドとして使用するGoコンパイラです。GCCの最適化技術を利用できるため、特定の状況下で異なるパフォーマンス特性を示すことがあります。

timing.logには、これら両方のコンパイラで実行されたベンチマーク結果が記録されており、それぞれのパフォーマンスを比較できるようになっています。

Go 1.1の主要な改善点

Go 1.1は、2013年5月13日にリリースされたGo言語のメジャーバージョンアップです。このリリースでは、特に以下の点が注目されました。

  • 正確なガベージコレクション (Precise GC): 以前のGoのGCは「非正確 (non-precise)」または「保守的 (conservative)」でした。これは、ポインタではないメモリ領域を誤ってポインタと解釈し、不要なオブジェクトを保持してしまう可能性がありました。Go 1.1で導入された正確なGCは、ヒープ上のポインタを正確に識別できるようになり、ガベージコレクションの効率が向上し、メモリ使用量が削減されました。これにより、特にメモリを大量に消費するアプリケーションでのパフォーマンスが改善されました。
  • 新しいスケジューラ (New Scheduler): Goのランタイムスケジューラは、ゴルーチン(Goの軽量スレッド)の実行を管理します。Go 1.1では、スケジューラが改善され、特にマルチコア環境での並行処理の効率が向上しました。これにより、CPUバウンドなワークロードや多数のゴルーチンを使用するアプリケーションのパフォーマンスが向上しました。
  • 高速なマップ (Faster Maps): Goの組み込みデータ構造であるマップ(ハッシュテーブル)の実装が最適化され、アクセス速度が向上しました。これは、マップを頻繁に使用するアプリケーションにとって大きな恩恵となりました。

これらの改善は、Go言語がより高速で効率的な言語へと進化する上で重要なステップでした。

技術的詳細

timing.logファイルは、各ベンチマークプログラムの実行時間(ユーザー時間 u、システム時間 s、実時間 r)を記録しています。フォーマットは以下のようになっています。

<ベンチマーク名> <パラメータ>
    <コンパイラ/実行環境> <プログラム名> <実行時間>

例えば、fasta -n 25000000の項目では、fastaベンチマークを-n 25000000のパラメータで実行した結果が示されています。その下に、gcc, gccgo, gcといった異なるコンパイラでコンパイルされたプログラムの実行時間が記録されています。

コミットで追加された行には、Go 1.1でのベンチマーク結果が追記されています。特に注目すべきは、コメント行で示されているように、Go 1.1の改善が多くのベンチマークで顕著な速度向上をもたらしている点です。例えば、fastaベンチマークではgcコンパイラで-16%gc_B(おそらく別のビルド設定)で-17%の改善が見られます。これは、実行時間が短縮されたことを意味します。

また、gccgoの改善についても言及されており、「gccgo showing significant improvement (even though it's not yet up to Go 1.1)」とあります。これは、gccgoがまだGo 1.1の全ての最適化を取り込んでいるわけではないものの、それでもパフォーマンスが向上していることを示唆しています。

# Standouts:のセクションでは、特にパフォーマンス改善が顕著だったベンチマークとして、fannkuch, regex-dna, k-nucleotide, threadring, chameneosが挙げられています。これらのベンチマークは、Go 1.1のGC、スケジューラ、マップの改善が特に効果を発揮した領域であると考えられます。

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

このコミットで変更されたファイルはtest/bench/shootout/timing.logのみです。

--- a/test/bench/shootout/timing.log
+++ b/test/bench/shootout/timing.log
@@ -1161,3 +1161,94 @@ chameneos 6000000
 	gccgo -O2 chameneosredux.go	11.28u 6.68s 18.00r
 	gc chameneosredux	6.94u 0.00s 6.96r
 
+# May 23, 2013
+# Go 1.1, which includes precise GC, new scheduler, faster maps.
+# 20%-ish speedups across many benchmarks.
+# gccgo showing significant improvement (even though it's not yet up to Go 1.1)
+#
+# Standouts:
+#	fannkuch, regex-dna, k-nucleotide, threadring, chameneos
+
+fasta -n 25000000
+	gcc -m64 -O2 fasta.c	1.54u 0.01s 1.55r
+	gccgo -O2 fasta.go	1.42u 0.00s 1.43r
+	gc fasta	1.50u 0.01s 1.52r # -16%
+	gc_B fasta	1.46u 0.00s 1.46r # -17%
+
+reverse-complement < output-of-fasta-25000000
+	gcc -m64 -O2 reverse-complement.c	0.87u 0.37s 4.36r
+	gccgo -O2 reverse-complement.go	0.77u 0.15s 0.93r # -15%
+	gc reverse-complement	0.99u 0.12s 1.12r # -15%
+	gc_B reverse-complement	0.85u 0.17s 1.02r # -21%
+
+nbody -n 50000000
+	gcc -m64 -O2 nbody.c -lm	13.50u 0.00s 13.53r
+	gccgo -O2 nbody.go	13.98u 0.01s 14.02r
+	gc nbody	16.63u 0.01s 16.67r
+	gc_B nbody	15.74u 0.00s 15.76r
+
+binary-tree 15 # too slow to use 20
+	gcc -m64 -O2 binary-tree.c -lm	0.61u 0.00s 0.61r
+	gccgo -O2 binary-tree.go	1.11u 0.01s 1.12r # -13%
+	gccgo -O2 binary-tree-freelist.go	0.22u 0.01s 0.23r
+	gc binary-tree	1.83u 0.02s 1.83r # -7%
+	gc binary-tree-freelist	0.32u 0.00s 0.32r
+
+fannkuch 12
+	gcc -m64 -O2 fannkuch.c	45.56u 0.00s 45.67r
+	gccgo -O2 fannkuch.go	57.71u 0.00s 57.85r # -4%
+	gccgo -O2 fannkuch-parallel.go	146.31u 0.00s 37.50r #-37%
+	gc fannkuch	70.06u 0.03s 70.17r # -3%
+	gc fannkuch-parallel	131.88u 0.06s 33.59r # -23%
+	gc_B fannkuch	45.55u 0.02s 45.63r # -15%
+
+regex-dna 100000
+	gcc -m64 -O2 regex-dna.c -lpcre	0.44u 0.01s 0.45r
+	gccgo -O2 regex-dna.go	5.59u 0.00s 5.61r # -14%
+	gccgo -O2 regex-dna-parallel.go	10.85u 0.30s 3.34r # -24%
+	gc regex-dna	2.23u 0.01s 2.25r # -43%
+	gc regex-dna-parallel	2.35u 0.00s 0.93r # -40%
+	gc_B regex-dna	2.24u 0.01s 2.25r # -43%
+
+spectral-norm 5500
+	gcc -m64 -O2 spectral-norm.c -lm	14.84u 0.00s 14.88r
+	gccgo -O2 spectral-norm.go	15.33u 0.00s 15.37r
+	gc spectral-norm	16.75u 0.02s 16.79r # -15%
+	gc_B spectral-norm	16.77u 0.01s 16.79r # -15%
+
+k-nucleotide 1000000
+	gcc -O2 k-nucleotide.c -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0 	4.50u 0.00s 4.52r
+	gccgo -O2 k-nucleotide.go	3.72u 0.04s 3.77r # -21%
+	gccgo -O2 k-nucleotide-parallel.go	3.88u 0.03s 1.42r # -35%
+	gc k-nucleotide	6.32u 0.01s 6.33r # -31%
+	gc k-nucleotide-parallel	6.47u 0.05s 2.13r # -33%
+	gc_B k-nucleotide	6.45u 0.01s 6.47r # - 28%
+
+mandelbrot 16000
+	gcc -m64 -O2 mandelbrot.c	36.03u 0.00s 36.11r
+	gccgo -O2 mandelbrot.go	37.61u 0.00s 37.74r # -14%
+	gc mandelbrot	38.19u 0.05s 38.29r
+	gc_B mandelbrot	38.19u 0.03s 38.26r
+
+meteor 2098
+	gcc -m64 -O2 meteor-contest.c	0.08u 0.00s 0.08r
+	gccgo -O2 meteor-contest.go	0.09u 0.01s 0.10r
+	gc meteor-contest	0.12u 0.00s 0.12r # -15% although perhaps just noise
+	gc_B meteor-contest	0.11u 0.00s 0.12r # -8% although perhaps just noise
+
+pidigits 10000
+	gcc -m64 -O2 pidigits.c -lgmp	2.27u 0.00s 2.28r
+	gccgo -O2 pidigits.go	8.95u 0.02s 8.99r
+	gc pidigits	2.88u 0.14s 2.91r
+	gc_B pidigits	2.92u 0.10s 2.91r
+
+threadring 50000000
+	gcc -m64 -O2 threadring.c -lpthread	14.75u 167.88s 212.23r
+	gccgo -O2 threadring.go	36.72u 12.08s 48.91r # -29%
+	gc threadring	10.93u 0.01s 10.95r # -16%
+
+chameneos 6000000
+	gcc -m64 -O2 chameneosredux.c -lpthread	8.89u 56.62s 9.75r
+	gccgo -O2 chameneosredux.go	9.48u 2.48s 11.99r # -33%
+	gc chameneosredux	5.80u 0.00s 5.81r # -16%

コアとなるコードの解説

このコミットは、test/bench/shootout/timing.logファイルに新しいベンチマーク結果のデータを追加しています。具体的には、既存のベンチマーク結果の末尾に、Go 1.1で実行された各種ベンチマークの新しい測定値が追記されています。

追加されたデータは、以下の情報を含んでいます。

  • 日付とGoバージョン: # May 23, 2013# Go 1.1, which includes precise GC, new scheduler, faster maps.というコメントで、このデータがGo 1.1リリース時のものであること、およびGo 1.1の主要な改善点が示されています。
  • 全体的なパフォーマンス向上: # 20%-ish speedups across many benchmarks.というコメントは、多くのベンチマークで約20%の速度向上が見られたことを示しています。
  • gccgoの改善: # gccgo showing significant improvement (even though it's not yet up to Go 1.1)というコメントは、gccgoも改善されていることを示唆しています。
  • 注目すべきベンチマーク: # Standouts:の後に、特にパフォーマンス改善が顕著だったベンチマーク(fannkuch, regex-dna, k-nucleotide, threadring, chameneos)がリストアップされています。
  • 個別のベンチマーク結果: fasta, reverse-complement, nbody, binary-tree, fannkuch, regex-dna, spectral-norm, k-nucleotide, mandelbrot, meteor, pidigits, threadring, chameneosといった各ベンチマークについて、gcc(C言語版)、gccgo(Go言語版、GCCコンパイラ)、gc(Go言語版、標準Goコンパイラ)、そしてgc_B(おそらく別のビルド設定のGo言語版)での実行時間が詳細に記録されています。
    • 各行の末尾に# -XX%のようなコメントが付いている場合、これは以前のバージョンと比較してのパフォーマンス改善率(実行時間の短縮率)を示しています。例えば、# -16%は実行時間が16%短縮されたことを意味します。

このログファイルの更新は、Go 1.1がもたらしたパフォーマンス上のメリットを具体的に数値で示すためのものであり、Go言語の進化の過程を記録する重要なデータとなります。

関連リンク

  • Go 1.1 Release Notes: Go 1.1の公式リリースノートには、このコミットで言及されているGC、スケジューラ、マップの改善を含む、詳細な変更点が記載されています。
  • Computer Language Benchmarks Game: ベンチマークの元となっているプロジェクトのウェブサイト。

参考にした情報源リンク

  • コミット情報: /home/orange/Project/comemo/commit_data/16396.txt
  • Go 1.1 Release Notes: https://go.dev/doc/go1.1
  • Computer Language Benchmarks Game: https://benchmarksgame-team.pages.debian.net/benchmarksgame/
  • Go言語のガベージコレクションに関する情報 (一般的な知識): https://go.dev/doc/gc-guide (GoのGCに関する公式ドキュメント)
  • Goスケジューラに関する情報 (一般的な知識): Goのスケジューラは複雑なトピックであり、特定の単一のリンクで全てを網羅することは難しいですが、Goの並行処理モデルやランタイムに関するドキュメントが参考になります。