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

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

このコミットは、Go言語の公式ドキュメントの一部である doc/go1.2.txt ファイルを更新するものです。このファイルは、Go 1.2リリースにおける主要な変更点や改善点をまとめたリリースノートのような役割を果たします。具体的には、ネットワーク関連のパフォーマンス改善と、sync/atomic パッケージへの新しい関数の追加に関する記述が追記されています。

コミット

  • コミットハッシュ: d1cefd6b6d6c0fc5b7dfe527cc8527401709f21d
  • Author: Dmitriy Vyukov dvyukov@google.com
  • Date: Tue Aug 13 17:21:33 2013 +0400

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

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

元コミット内容

doc: update go1.2.txt

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/12851043

変更の背景

このコミットは、Go 1.2のリリースに向けて、その変更点をユーザーに伝えるためのドキュメント更新の一環として行われました。Goプロジェクトでは、各メジャーリリースにおいて goX.Y.txt という形式のファイルで、そのバージョンで導入された重要な変更点、新機能、パフォーマンス改善などがまとめられます。

この特定のコミットでは、以下の2つの重要な変更が go1.2.txt に追記されました。

  1. Windows環境におけるnetパッケージのパフォーマンス改善: Windows上でのネットワーク操作の効率が最大30%向上したという、ユーザーにとって非常に大きなメリットとなる変更です。
  2. sync/atomicパッケージへのSwap関数の追加: 並行処理において、より効率的かつ安全なアトミック操作を可能にする新しいAPIが提供されたことを示しています。

これらの変更は、Go 1.2の重要な改善点であり、ユーザーが新しいバージョンに移行する際に知っておくべき情報であるため、ドキュメントに明記されました。

前提知識の解説

Go 1.2リリース

Go 1.2は、2013年12月にリリースされたGo言語のメジャーバージョンです。このリリースでは、ガベージコレクションの改善、ランタイムの最適化、新しい標準ライブラリの追加、ツールチェインの強化など、多岐にわたる変更が加えられました。特に、並行処理のパフォーマンスと安定性の向上が重視されており、本コミットで言及されている変更もその一環です。

netパッケージ

netパッケージは、Go言語におけるネットワークI/Oの基本的な機能を提供する標準ライブラリです。TCP/IP、UDP、Unixドメインソケットなどのネットワークプロトコルを扱うためのインターフェースや関数が含まれています。クライアント/サーバーアプリケーションの構築、HTTP通信、DNSルックアップなど、ネットワーク関連のあらゆる処理の基盤となります。

Windows環境におけるネットワークパフォーマンス

Windowsオペレーティングシステムは、そのI/OモデルやシステムコールがLinuxなどのUnix系OSとは異なるため、ネットワークプログラミングにおいて特有の課題を抱えることがあります。特に、高負荷なネットワークアプリケーションでは、OSのI/O処理の効率が全体のパフォーマンスに大きく影響します。Goランタイムは、各OSの特性に合わせて最適化されており、このコミットで言及されている改善は、Windows固有のI/Oメカニズムをより効率的に利用することで達成されたと考えられます。

sync/atomicパッケージ

sync/atomicパッケージは、Go言語において低レベルなアトミック操作(不可分操作)を提供する標準ライブラリです。アトミック操作とは、複数のゴルーチン(軽量スレッド)が同時にアクセスしても、その操作が中断されることなく、常に一貫した状態を保つことが保証される操作のことです。これにより、ミューテックス(排他ロック)を使用せずに、共有メモリ上の変数を安全に操作でき、並行処理のパフォーマンス向上やデッドロックの回避に役立ちます。

アトミックSwap関数

アトミックSwap関数は、指定されたメモリ位置の値を新しい値にアトミックに置き換える操作です。この操作は、読み取りと書き込みが単一の不可分なステップとして実行されるため、他のゴルーチンがそのメモリ位置にアクセスしている最中に値が中途半端な状態になることを防ぎます。例えば、atomic.SwapInt32(&val, newVal) は、val の現在の値を newVal に置き換え、置き換え前の val の値を返します。これは、ロックを使用せずに共有カウンタやフラグを更新する際などに非常に有用です。

CL (Change List)

Goプロジェクトでは、コードの変更は「Change List (CL)」という単位で管理されます。これは、Perforceなどのバージョン管理システムで使われる概念に由来しており、Gitのコミットに似ていますが、より広範な意味合いを持つことがあります。各CLには一意の番号が割り当てられ、コードレビューシステム(Gerritなど)を通じてレビューされ、承認された後にメインのコードベースにマージされます。コミットメッセージに記載されている CL 8670044CL 12670045 は、それぞれ対応する実際のコード変更が行われたChange ListのIDを示しています。

技術的詳細

このコミット自体はドキュメントの変更ですが、その内容が指し示す技術的な詳細を掘り下げます。

net: Windowsパフォーマンスの最大30%改善 (CL 8670044)

このパフォーマンス改善は、GoランタイムがWindowsのネットワークI/Oを処理する方法における根本的な最適化によるものです。具体的な技術的詳細については、元のCL 8670044を参照する必要がありますが、一般的にWindowsにおけるネットワークパフォーマンスの最適化は以下の点に焦点を当てます。

  • I/O完了ポート (IOCP): Windowsの高性能な非同期I/Oモデルです。GoランタイムがIOCPをより効率的に利用するように変更された可能性があります。これにより、多数の同時接続を扱う際のコンテキストスイッチのオーバーヘッドが削減され、スケーラビリティが向上します。
  • システムコールオーバーヘッドの削減: Windows API呼び出しの回数を減らす、またはより効率的なAPIを使用することで、カーネルモードとユーザーモード間の切り替えコストを削減します。
  • バッファ管理の最適化: ネットワークデータの送受信におけるバッファの割り当て、コピー、解放の効率を改善することで、メモリ帯域幅の使用を最適化し、CPUキャッシュのヒット率を高めます。
  • スケジューリングの改善: Goのゴルーチンスケジューラが、Windowsのネットワークイベントとより密接に連携するように調整された可能性があります。これにより、ネットワークI/Oが完了した際に、関連するゴルーチンがより迅速に実行されるようになります。

CL 8670044のタイトルは "net: improve windows performance by up to 30%" であり、これは net パッケージの内部実装、特にWindows固有のネットワークAPIとの連携部分に大きな変更があったことを示唆しています。この改善は、GoアプリケーションがWindowsサーバー上で動作する際のネットワークスループットとレイテンシに直接的な影響を与え、特に高負荷なWebサーバーやデータベースプロキシなどで顕著な効果を発揮します。

sync/atomic: Swap関数の追加 (CL 12670045)

CL 12670045によって、sync/atomicパッケージに以下のSwap関数が追加されました。

  • func SwapInt32(addr *int32, new int32) (old int32)
  • func SwapInt64(addr *int64, new int64) (old int64)
  • func SwapUint32(addr *uint32, new uint32) (old uint32)
  • func SwapUint64(addr *uint64, new uint64) (old uint64)
  • func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)

これらの関数は、それぞれ指定された型(32ビット整数、64ビット整数、ポインタ)の値を、新しい値にアトミックに置き換え、置き換え前の値を返します。

技術的な意義:

  • 不可分性: これらの操作はCPUの命令レベルでアトミックに実行されるため、複数のゴルーチンが同時に同じメモリ位置を操作しようとしても、データ競合(data race)が発生しません。これにより、ロックを使用せずに共有状態を安全に更新できます。
  • パフォーマンス: ミューテックス(sync.Mutex)などのロック機構を使用する場合と比較して、アトミック操作は通常、オーバーヘッドが非常に小さいです。これは、ロックがOSのスケジューラとのやり取りを伴うのに対し、アトミック操作は多くの場合、CPUの特殊な命令(例: XCHGCMPXCHG)によって直接サポートされるためです。高頻度で共有変数を更新するようなシナリオでは、アトミック操作がパフォーマンス上のボトルネックを解消する鍵となります。
  • 並行データ構造の構築: Swap関数は、ロックフリーなデータ構造(例: ロックフリーキュー、スタック、ハッシュマップ)を実装する上で不可欠なプリミティブです。例えば、リンクリストのヘッドポインタを更新する際に、SwapPointerを使用することで、他のゴルーチンがリストを走査している最中でも安全にヘッドを切り替えることができます。
  • 簡潔なコード: Swap関数を使用することで、LoadStoreを組み合わせて手動でアトミックな交換ロジックを実装するよりも、コードが簡潔になり、バグの発生リスクが低減します。

これらのSwap関数の追加は、Go言語における並行プログラミングの表現力を高め、より高性能で堅牢な並行アプリケーションを構築するための重要な基盤を提供しました。

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

このコミットにおけるコアとなるコードの変更は、doc/go1.2.txt ファイルへの以下の4行の追加です。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -8,6 +8,9 @@ Please keep the descriptions to a single line, starting with the
 package or cmd/xxx directory name, and ending in a CL number.
 Please keep the list sorted (as in sort.Strings of the lines).
 
+Performance:
+net: improve windows performance by up to 30% (CL 8670044).
+
 cmd/5a: removed support for R9/R10 (use m/g instead) (CL 9840043).
 cmd/5l: add MOVBS, MOVHS etc for sub-word moves (CL 12682043).
 cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).
@@ -44,6 +47,7 @@ runtime: allow SetFinalizer with a func(interface{}) (CL 11858043).\n runtime: preemption of goroutines at function entry (CL 12371043).\n sort: new Stable function provides stable sort (CL 9612044).\n strings: add IndexByte, for consistency with bytes package (CL 12214044).\n+sync/atomic: add Swap functions (CL 12670045).\n syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).\n testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).\n time: Allow Parse and Format to handle time zone offsets with seconds (CL 8132044)

コアとなるコードの解説

追加された行は、Go 1.2のリリースノートに、以下の2つの重要な変更点を明記するためのものです。

  1. Performance: net: improve windows performance by up to 30% (CL 8670044). この行は、Go 1.2でWindows環境におけるnetパッケージのパフォーマンスが大幅に改善されたことを示しています。具体的な改善はCL 8670044で行われました。これは、Windows上でネットワークを多用するGoアプリケーションにとって非常に重要な情報であり、ユーザーはGo 1.2にアップグレードすることで、追加の努力なしにパフォーマンスの恩恵を受けられることを期待できます。

  2. sync/atomic: add Swap functions (CL 12670045). この行は、sync/atomicパッケージに新しいSwap関数群が追加されたことを示しています。これらの関数は、並行処理において共有変数をアトミックに交換するためのもので、ロックを使用せずに安全かつ効率的な並行プログラミングを可能にします。CL 12670045でこれらの関数が実装されました。この情報は、並行データ構造を構築したり、パフォーマンスが重要な並行処理ロジックを記述したりする開発者にとって、新しいツールが利用可能になったことを意味します。

これらの記述は、Go 1.2の主要な改善点を簡潔にまとめ、開発者が新しいバージョンで利用できるようになった機能や改善された領域を迅速に把握できるようにすることを目的としています。

関連リンク

参考にした情報源リンク