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

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

このコミットは、Go言語のベンチマークスイートであるtest/bench/shootoutディレクトリ内のtiming.logファイルを更新するものです。具体的には、Go 1リリース時点でのベンチマーク結果が追加されています。このログファイルは、様々なプログラムにおけるC言語実装、gccgo(GCCベースのGoコンパイラ)実装、および標準のGoコンコンパイラ(gc)実装のパフォーマンスデータを記録しています。

コミット

commit caedc603d4e015baa35c2dadf85e1a541885d2f3
Author: Rob Pike <r@golang.org>
Date:   Tue Apr 10 16:46:06 2012 +1000

    test/bench/shootout: update timing.log to Go 1
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5989063

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

https://github.com/golang/go/commit/caedc603d4e015baa35c2dadf85e1a541885d2f3

元コミット内容

test/bench/shootout: update timing.log to Go 1

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5989063

変更の背景

このコミットの背景には、Go言語のメジャーリリースであるGo 1のリリースが控えていたことがあります。Go 1は、Go言語の仕様と標準ライブラリの安定性を保証する最初のバージョンであり、将来の互換性を維持するための重要なマイルストーンでした。このリリースに向けて、Go言語のパフォーマンス特性を正確に把握し、C言語や他のコンパイラ(gccgo)と比較してどの程度の性能を発揮するのかを文書化する必要がありました。

timing.logは、Go言語の進化に伴うパフォーマンスの変化を追跡するための重要なドキュメントです。Go 1リリース時には、ランタイムの改善、コンパイラの最適化、ガベージコレクションの効率化など、様々なパフォーマンス向上が図られていました。これらの変更が実際のベンチマークにどのように影響したかを記録し、開発者やユーザーがGo 1の性能特性を理解できるようにすることが、このコミットの主な目的です。特に、gccgoが全てのテストで有効になったことや、特定のベンチマークで顕著な速度向上が見られたことは、Go言語エコシステムの成熟を示すものでした。

前提知識の解説

  • Go言語 (Golang): Googleによって開発されたオープンソースのプログラミング言語。シンプルさ、効率性、並行処理のサポートを重視しています。
  • Go 1: 2012年3月28日にリリースされたGo言語の最初の安定版。このバージョンで言語仕様と標準ライブラリが固定され、後方互換性が保証されるようになりました。これはGo言語が実用的なプロダクション環境で利用されるための重要なステップでした。
  • ベンチマーク (Benchmark): ソフトウェアやハードウェアの性能を測定するためのテスト。ここでは、Go言語のプログラムが特定のタスクをどれだけ速く実行できるかを測定しています。
  • Computer Language Benchmarks Game (CLBG): 異なるプログラミング言語の実装を比較するためのベンチマークスイート。このコミットで参照されているshootoutは、このCLBGのベンチマークを指しています。様々なアルゴリズムや計算負荷の高いタスクが含まれており、言語のランタイム、コンパイラ、ライブラリの性能を総合的に評価するのに役立ちます。
  • timing.log: ベンチマークの実行時間やその他の性能指標を記録するログファイル。Goプロジェクトでは、パフォーマンスの回帰を検出したり、最適化の効果を測定したりするために使用されます。
  • gc (Go Compiler): Go言語の公式コンパイラ。Goソースコードをネイティブバイナリにコンパイルします。
  • gccgo: GCC (GNU Compiler Collection) のフロントエンドとして実装されたGoコンパイラ。gcとは異なるコンパイルパスと最適化戦略を持ち、C/C++など他のGCCサポート言語との連携が容易な場合があります。
  • u (user time): プロセスがCPU上でユーザーモードで実行された時間。
  • s (system time): プロセスがCPU上でカーネルモードで実行された時間(システムコールなど)。
  • r (real time): プロセスが開始されてから終了するまでの実時間(壁時計時間)。
  • goroutines: Go言語における軽量な並行処理の単位。OSのスレッドよりもはるかに軽量で、数百万のgoroutineを同時に実行することも可能です。
  • runtime: プログラムの実行中に必要なサービス(ガベージコレクション、スケジューリング、メモリ管理など)を提供するGo言語の実行環境。

技術的詳細

このコミットは、test/bench/shootout/timing.logファイルにGo 1リリース時点でのベンチマーク結果を追加しています。追加されたデータは、Go言語の標準コンパイラ(gc)、gccgo、およびC言語(gcc)でコンパイルされたプログラムの実行時間を比較しています。

ログの冒頭には、Go 1リリースにおける主要な変更点とパフォーマンスに関する所見がまとめられています。

  • gccgoの全テストでの有効化: Go 1では、gccgoが全てのベンチマークテストで利用可能になりました。これは、goroutineのオーバーヘッドが十分に低減され、gccgoでも効率的な並行処理が可能になったことを示唆しています。
  • threadringchameneosの14%高速化: これらのベンチマークは、Goランタイムの改善、特にgoroutineのスケジューリングやコンテキストスイッチの効率化によって恩恵を受けた可能性が高いです。
  • regex-dnaの36%高速化: 正規表現エンジンの最適化や文字列処理の改善が寄与したと考えられます。
  • fannkuch-parallelの40%減速: 並列処理のベンチマークであるfannkuch-parallelが減速したことは注目に値します。これは、Go 1の並列処理モデルやスケジューラに特定のワークロードで非効率な点があったか、あるいは特定の最適化が意図せずパフォーマンスを低下させた可能性を示唆しています。
  • gccgo on binary-tree-freelistの最適化: gccgobinary-tree-freelistベンチマークにおいて「optimized to nothing」(何も最適化されていない、または最適化によって結果がゼロになった)と報告されています。これは、gccgoのコンパイラが特定のコードパターンを極端に最適化しすぎたか、あるいはベンチマークの測定方法に問題があった可能性を示しています。

ログには、fasta, reverse-complement, nbody, binary-tree, fannkuch, regex-dna, spectral-norm, k-nucleotide, mandelbrot, meteor, pidigits, threadring, chameneosといった様々なベンチマークの結果が詳細に記録されています。各ベンチマークについて、gcc (C言語), gccgo (Go言語), gc (Go言語), gc_B (Go言語の別ビルド) の実行時間がuser time, system time, real timeで示されています。

これらのデータは、Go 1がリリースされた時点でのGo言語のパフォーマンス特性を多角的に評価するための貴重な情報源となります。特に、C言語との比較、異なるGoコンパイラ間の性能差、そしてGo言語自身の進化によるパフォーマンスの改善点や課題が明確に示されています。

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

このコミットによるコードの変更は、test/bench/shootout/timing.logファイルへの追記のみです。

--- a/test/bench/shootout/timing.log
+++ b/test/bench/shootout/timing.log
@@ -900,3 +900,96 @@ threadring 50000000
 
 chameneos 6000000
 	gc chameneosredux	7.41u 0.00s 7.42r # -3%
+\
+# A complete run at the Go 1 release.
+# Significant changes:
+# - gccgo is now enabled for all tests (goroutines are cheap enough)
+# - threadring and chameneos are 14% faster, probably due to runtime changes
+# - regex-dna 36% faster
+# - fannkuch-parallel (only) slowed down 40%
+# - gccgo on binary-tree-freelist is still optimized to nothing
+# Other changes are modest.
+\
+fasta -n 25000000
+\	gcc -O2 fasta.c	1.45u 0.02s 1.48r
+\	gccgo -O2 fasta.go	1.46u 0.00s 1.47r
+\	gc fasta	1.99u 0.01s 2.00r
+\	gc_B fasta	1.99u 0.01s 2.01r
+\
+reverse-complement < output-of-fasta-25000000
+\	gcc -O2 reverse-complement.c	0.95u 0.48s 4.99r
+\	gccgo -O2 reverse-complement.go	0.93u 0.16s 1.09r
+\	gc reverse-complement	1.20u 0.19s 1.39r
+\	gc_B reverse-complement	1.04u 0.16s 1.20r
+\
+nbody -n 50000000
+\	gcc -O2 -lm nbody.c	13.02u 0.00s 13.05r
+\	gccgo -O2 nbody.go	14.46u 0.00s 14.49r
+\	gc nbody	21.79u 0.00s 21.84r
+\	gc_B nbody	21.74u 0.00s 21.79r
+\
+binary-tree 15 # too slow to use 20
+\	gcc -O2 binary-tree.c -lm	0.60u 0.01s 0.61r
+\	gccgo -O2 binary-tree.go	1.30u 0.01s 1.32r
+\	gccgo -O2 binary-tree-freelist.go	0.00u 0.00s 0.00r
+\	gc binary-tree	1.84u 0.01s 1.86r
+\	gc binary-tree-freelist	0.33u 0.00s 0.33r
+\
+fannkuch 12
+\	gcc -O2 fannkuch.c	45.24u 0.00s 45.34r
+\	gccgo -O2 fannkuch.go	59.76u 0.01s 59.90r
+\	gccgo -O2 fannkuch-parallel.go	218.20u 0.01s 61.60r
+\	gc fannkuch	103.92u 0.00s 104.16r
+\	gc fannkuch-parallel	221.61u 0.00s 60.49r
+\	gc_B fannkuch	53.17u 0.00s 53.30r
+\
+regex-dna 100000
+\	gcc -O2 regex-dna.c -lpcre	0.47u 0.00s 0.48r
+\	gccgo -O2 regex-dna.go	6.52u 0.00s 6.54r
+\	gccgo -O2 regex-dna-parallel.go	14.40u 0.73s 4.35r
+\	gc regex-dna	2.63u 0.02s 2.66r # -36%
+\	gc regex-dna-parallel	2.87u 0.01s 1.11r
+\	gc_B regex-dna	2.65u 0.00s 2.66r
+\
+spectral-norm 5500
+\	gcc -O2 spectral-norm.c -lm	15.78u 0.00s 15.82r
+\	gccgo -O2 spectral-norm.go	15.79u 0.00s 15.83r
+\	gc spectral-norm	19.76u 0.00s 19.80r
+\	gc_B spectral-norm	19.73u 0.01s 19.78r
+\
+k-nucleotide 1000000
+\	gcc -O2  k-nucleotide.c	5.59u 0.03s 5.63r
+\	gccgo -O2 k-nucleotide.go	4.09u 0.03s 4.13r
+\	gccgo -O2 k-nucleotide-parallel.go	4.50u 0.06s 1.63r
+\	gc k-nucleotide	9.23u 0.02s 9.27r
+\	gc k-nucleotide-parallel	9.87u 0.03s 3.55r
+\	gc_B k-nucleotide	9.20u 0.00s 9.22r
+\
+mandelbrot 16000
+\	gcc -O2 mandelbrot.c	36.09u 0.00s 36.18r
+\	gccgo -O2 mandelbrot.go	41.69u 0.01s 41.80r
+\	gc mandelbrot	60.91u 0.02s 61.07r
+\	gc_B mandelbrot	60.90u 0.00s 61.04r
+\
+meteor 2098
+\	gcc -O2 meteor-contest.c	0.09u 0.00s 0.09r
+\	gccgo -O2 meteor-contest.go	0.09u 0.00s 0.09r
+\	gc meteor-contest	0.14u 0.00s 0.15r
+\	gc_B meteor-contest	0.14u 0.00s 0.14r
+\
+pidigits 10000
+\	gcc -O2 pidigits.c -lgmp	2.27u 0.00s 2.27r
+\	gccgo -O2 pidigits.go	8.65u 0.00s 8.67r
+\	gc pidigits	3.70u 0.04s 3.75r
+\	gc_B pidigits	3.72u 0.02s 3.75r
+\
+threadring 50000000
+\	gcc -O2 threadring.c	40.91u 369.85s 323.31r
+\	gccgo -O2 threadring.go	26.97u 30.82s 57.93r
+\	gc threadring	12.81u 0.01s 12.85r # -13%
+\
+chameneos 6000000
+\	gcc -O2 chameneosredux.c -lpthread	9.44u 72.90s 12.65r
+\	gccgo -O2 chameneosredux.go	7.73u 7.53s 15.30r
+\	gc chameneosredux	6.51u 0.00s 6.53r # - 14%

コアとなるコードの解説

このコミットは、既存のtiming.logファイルに新しいベンチマーク結果のセクションを追加しています。追加されたセクションは、Go 1リリース時点でのパフォーマンススナップショットを提供します。

各行は特定のベンチマークプログラムの実行結果を示しており、以下の形式で構成されています。

[プログラム名] [引数] \t[コンパイラ] [オプション] [ファイル名] [実行時間]

実行時間は、user time (u), system time (s), real time (r) の3つの値で示されます。

  • user time: プログラムがユーザーモードでCPUを実行した時間。
  • system time: プログラムがカーネルモードでCPUを実行した時間(システムコールなど)。
  • real time: プログラムの開始から終了までの経過時間。

例えば、fasta -n 25000000の行では、fastaプログラムを-n 25000000の引数で実行した結果が示されています。その下の行には、gccgccgogcgc_Bの各コンパイラでコンパイルされたfastaプログラムの実行時間が記録されています。

特筆すべきは、コメント行で示されているパフォーマンスの傾向です。

  • threadringchameneosgcコンパイラでそれぞれ13%と14%高速化していることが明記されています。これは、Goランタイムの改善がこれらの並行処理ベンチマークに良い影響を与えたことを示唆しています。
  • regex-dnagcコンパイラで36%高速化していることも強調されており、正規表現処理の効率が大幅に向上したことがわかります。
  • 一方で、fannkuch-parallelが40%減速したことや、gccgobinary-tree-freelistで異常な結果(0.00u 0.00s 0.00r)を出していることも正直に記録されており、Go 1リリース時点でのパフォーマンスに関する課題も示されています。

このログは、Go言語のパフォーマンス特性を理解し、将来の最適化の方向性を決定するための基礎データとして機能します。

関連リンク

参考にした情報源リンク