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

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

このコミットは、Go言語の公式ドキュメントの一部である doc/go1.1.html ファイルの更新に関するものです。具体的には、Go 1.1リリースにおけるパフォーマンス改善に関する記述を詳細化し、より具体的な情報を提供する目的で行われました。

コミット

  • コミットハッシュ: 4c48e4ecb5927d3f176bb1494c81e2aa14e0f283
  • 作者: Rob Pike r@golang.org
  • 日付: 2013年3月23日 土曜日 08:29:59 -0700
  • コミットメッセージ:
    doc/go1.1.html: performance
    An overview is all that's required.
    
    R=golang-dev, remyoudompheng, bradfitz, adg
    CC=golang-dev
    https://golang.org/cl/7577050
    

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

https://github.com/golang/go/commit/4c48e4ecb5927d3f176bb1494c81e2aa14e0f283

元コミット内容

このコミットの目的は、doc/go1.1.html ファイル内のパフォーマンスに関するセクションを更新することです。元のコミットメッセージ「An overview is all that's required.」は、このセクションがGo 1.1のパフォーマンス改善について簡潔な概要を提供することを意図していることを示唆しています。

変更の背景

Go言語は継続的にパフォーマンスの改善に取り組んでおり、各リリースでは様々な最適化が導入されます。Go 1.1は、Go言語の初期の重要なリリースの一つであり、多くのパフォーマンス向上が含まれていました。このコミットは、そのGo 1.1のリリースノートまたはドキュメントの一部として、ユーザーや開発者に対して、どのようなパフォーマンス改善がなされたのかを明確に伝えるために行われました。

初期のドキュメントでは、パフォーマンスセクションが「TODO introduction」や「TODO better code generation (inlining, ...?)」といったプレースホルダーで構成されており、具体的な情報が不足していました。このコミットは、これらのプレースホルダーを実際の改善内容に置き換えることで、ドキュメントの完成度を高めることを目的としています。これにより、Go 1.1への移行を検討している開発者や、Goのパフォーマンス特性を理解したいユーザーにとって、より有用な情報が提供されることになります。

前提知識の解説

このコミットの変更内容を理解するためには、以下のGo言語およびコンピュータサイエンスの基本的な概念を理解しておく必要があります。

  • Go言語 (Golang): Googleによって開発されたオープンソースのプログラミング言語。並行処理、ガベージコレクション、高速なコンパイルが特徴です。
  • Go 1.1: Go言語の重要な初期リリースの一つで、多くのパフォーマンス改善と新機能が導入されました。
  • gc (Go Compiler / Garbage Collector): Go言語のツールチェーンにおけるコンパイラとガベージコレクタを指します。
    • コンパイラ: ソースコードを機械語に変換するプログラム。Goのコンパイラは、生成されるコードの効率性に直接影響します。
    • ガベージコレクタ (GC): プログラムが使用しなくなったメモリを自動的に解放するシステム。GCの効率は、プログラムの実行速度とメモリ使用量に大きく影響します。
  • インライン化 (Inlining): コンパイラ最適化の一種で、関数呼び出しをその関数の本体のコードで直接置き換えること。これにより、関数呼び出しのオーバーヘッド(スタックフレームの作成、引数の渡しなど)が削減され、プログラムの実行速度が向上します。
  • 並行ガベージコレクション (Parallel GC): 複数のCPUコアやスレッドを使用してガベージコレクション処理を並行して実行すること。これにより、GCによるアプリケーションの一時停止時間(ポーズタイム)を短縮し、全体的なレイテンシを改善できます。
  • 高精度ガベージコレクション (Precise GC): ガベージコレクタが、メモリ内のどの値がポインタであるかを正確に識別できること。これにより、誤ってポインタでない値をポインタとして扱い、不要なオブジェクトを保持し続ける(メモリリークに似た状況)ことを防ぎ、ヒープサイズを削減できます。特に32ビットアーキテクチャでは、アドレス空間が限られているため、ヒープサイズの削減は重要です。
  • Goマップ (Go maps): Go言語の組み込みデータ構造で、キーと値のペアを格納するハッシュテーブルの実装。その効率性は、多くのGoプログラムのパフォーマンスに影響します。
  • コンテキストスイッチ (Context Switch): オペレーティングシステムがCPUの制御をあるプロセス(またはスレッド)から別のプロセス(またはスレッド)に切り替える操作。これにはオーバーヘッドが伴い、頻繁に発生するとパフォーマンスが低下します。特にI/O操作(ネットワーク操作など)では、カーネルモードとユーザーモード間の切り替えや、異なるプロセス間の切り替えが頻繁に発生し、コンテキストスイッチが多発する可能性があります。
  • append 組み込み関数: Go言語の組み込み関数の一つで、スライスに要素を追加するために使用されます。頻繁に呼び出されるため、その効率性は重要です。
  • インターフェース変換 (Interface Conversions): Go言語のインターフェース型から具体的な型への変換、またはその逆の変換。これにも実行時コストが伴います。

技術的詳細

このコミットで doc/go1.1.html に追加されたパフォーマンス改善の詳細は以下の通りです。

  1. gc コンパイラのコード生成の改善:

    • 多くのケースで、gc コンパイラがより良いコードを生成するようになりました。
    • 特に32ビットIntelアーキテクチャにおける浮動小数点演算のパフォーマンスが顕著に向上しました。これは、コンパイラが浮動小数点演算をより効率的な機械語命令に変換できるようになったことを意味します。
  2. インライン化の強化:

    • gc コンパイラは、より多くの関数でインライン化を行うようになりました。
    • これには、append のようなランタイムの組み込み操作や、インターフェース変換も含まれます。これらの操作は頻繁に実行されるため、インライン化によるオーバーヘッドの削減は全体的なパフォーマンスに大きな影響を与えます。
  3. Goマップの新しい実装:

    • Goマップの内部実装が刷新され、メモリフットプリント(メモリ使用量)とCPU時間の両方で大幅な削減が実現されました。これは、マップの操作(挿入、検索、削除)がより高速になり、マップが占めるメモリ量も減少したことを意味します。
  4. ガベージコレクタの並行処理の強化:

    • ガベージコレクタがより並行して動作するようになりました。
    • これにより、複数のCPUで実行されているプログラムのレイテンシ(一時停止時間)を削減できます。GCがアプリケーションの実行と並行してより多くの作業を行うことで、アプリケーションがGCのために停止する時間が短くなります。
  5. ガベージコレクタの高精度化:

    • ガベージコレクタがより高精度になりました。これは、GCがメモリ内のポインタをより正確に識別できるようになったことを意味します。
    • 高精度化はわずかなCPU時間のコストを伴いますが、特に32ビットアーキテクチャにおいてヒープサイズを大幅に削減できます。不要なメモリをより効率的に解放することで、メモリ使用量を最適化し、メモリ関連のパフォーマンス問題を軽減します。
  6. ネットワーク操作の効率化:

    • ランタイムとネットワークライブラリの結合がより密接になったため、ネットワーク操作におけるコンテキストスイッチの回数が減少しました。
    • コンテキストスイッチの削減は、ネットワークI/Oが頻繁に発生するアプリケーションにおいて、スループットの向上とレイテンシの削減に貢献します。

これらの改善は、Go 1.1がGoプログラムの実行速度と効率を全体的に向上させるための重要なステップであったことを示しています。

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

--- a/doc/go1.1.html
+++ b/doc/go1.1.html
@@ -323,14 +323,29 @@ to convert the code to Go 1.0 first.
 <h2 id="performance">Performance</h2>
 
 <p>
-TODO introduction
+The performance of code compiled with the Go 1.1 gc tool suite should be noticeably
+better for most Go programs.
+Typical improvements relative to Go 1.0 seem to be about 30%-40%, sometimes
+much more, but occasionally less or even non-existent.
+There are too many small performance-driven tweaks through the tools and libraries
+to list them all here, but the following major changes are worth noting:
 </p>
 
 <ul>
-<li>TODO better code generation (inlining, ...?)</li>
-<li>TODO parallel gc</li>
-<li>TODO more precise gc</li>
-<li>TODO networking is more efficient (known to runtime)</li>
+<li>The gc compilers generate better code in many cases, most noticeably for
+floating point on the 32-bit Intel architecture.</li>
+<li>The gc compilers do more in-lining, including for some operations
+in the run-time such as <a href="/pkg/builtin/#append"><code>append</code></a>
+and interface conversions.</li>
+<li>There is a new implementation of Go maps with significant reduction in
+memory footprint and CPU time.</li>
+<li>The garbage collector has been made more parallel, which can reduce
+latencies for programs running on multiple CPUs.</li>
+<li>The garbage collector is also more precise, which costs a small amount of
+CPU time but can reduce the size of the heap significantly, especially
+on 32-bit architectures.</li>
+<li>Due to tighter coupling of the run-time and network libraries, fewer
+context switches are required on network operations.</li>
 </ul>
 
 <h2 id="library">Changes to the standard library</h2>
@@ -598,7 +613,7 @@ a string, rather than a float64.\n </li>\n \n <li>\n-The <a href="/pkg/encoding/xml/"><code>endoding/xml</code></a> package
+The <a href="/pkg/encoding/xml/"><code>encoding/xml</code></a> package
 has a new function,\n <a href="/pkg/encoding/xml/#EscapeText"><code>EscapeText</code></a>,\n which writes escaped XML output,\n

コアとなるコードの解説

このコミットは、doc/go1.1.html ファイルの <h2 id="performance">Performance</h2> セクションを更新しています。

  • 削除された行:

    • TODO introduction: パフォーマンスセクションの導入部分のプレースホルダーが削除されました。
    • TODO better code generation (inlining, ...?): コード生成とインライン化に関するプレースホルダーが削除されました。
    • TODO parallel gc: 並行GCに関するプレースホルダーが削除されました。
    • TODO more precise gc: 高精度GCに関するプレースホルダーが削除されました。
    • TODO networking is more efficient (known to runtime): ネットワーク効率に関するプレースホルダーが削除されました。
    • The <a href="/pkg/encoding/xml/"><code>endoding/xml</code></a> package: encoding/xml パッケージ名のタイプミス (endoding -> encoding) が修正されました。
  • 追加された行:

    • パフォーマンスセクションの導入として、Go 1.1でコンパイルされたコードがGo 1.0と比較して30%-40%程度のパフォーマンス向上が見られること、そしてその理由となる主要な変更点がリストアップされる旨が記述されました。
    • 具体的なパフォーマンス改善点として、以下の6つの項目が箇条書きで追加されました。
      1. gc コンパイラによるコード生成の改善(特に32ビットIntelアーキテクチャでの浮動小数点演算)。
      2. append やインターフェース変換を含む、より積極的なインライン化。
      3. メモリフットプリントとCPU時間を大幅に削減する新しいGoマップの実装。
      4. 複数CPUで実行されるプログラムのレイテンシを削減する、より並行なガベージコレクタ。
      5. わずかなCPUコストでヒープサイズを大幅に削減できる、より高精度なガベージコレクタ(特に32ビットアーキテクチャで有効)。
      6. ランタイムとネットワークライブラリの密接な結合による、ネットワーク操作でのコンテキストスイッチの削減。

この変更により、Go 1.1のパフォーマンスに関するドキュメントが、具体的な技術的詳細を含む、より情報量の多いものになりました。

関連リンク

  • Go 1.1 Release Notes (公式ドキュメント): このコミットが更新しているドキュメントの最終版は、Go 1.1のリリースノートとして公開されています。
  • Go言語公式ウェブサイト: https://golang.org/
  • Go言語のコードレビューシステム (Gerrit): https://golang.org/cl/7577050 (コミットメッセージに記載されているコードレビューリンク)

参考にした情報源リンク

  • Go言語の公式ドキュメント (Go 1.1リリースノートなど)
  • Go言語のガベージコレクションに関する一般的な情報源
  • コンパイラ最適化(インライン化など)に関する一般的な情報源
  • オペレーティングシステムのコンテキストスイッチに関する一般的な情報源