2014年6月29日日曜日

Golang Cafe #35

6/22(日)に開催された「Golang Cafe #35」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でした。

今回は「Go Conference 2014 springを開催しました #gocon」の中から「Five things that make Go fast」が選択され、「二 Inlining」まで読み進めました。

「Goを速くする5つの事柄」ということで、コーディングテクニックやイケてるパッケージの紹介かと思いきや、Goコンパイラーにおける速度向上の仕組みや工夫に関する内容でした。

個人的には好きな方の話だったので、都度、感心しながら読み進められました。

以下、ざっくり、かつ、超意訳にまみれた内容紹介ですm(__)m

最初に「Gopherに聞きました!Goを採用した理由トップ3」が紹介されていました。

  • 同時実行
  • デプロイが簡単
  • パフォーマンス

今回、Dave Cheneyさんはパフォーマンスを「Goの速さ」と捉えて説明されています。

一 Values

Goにてint32型で値を定義した場合は1byte/桁のメモリを消費します。(「2014」なら4byte)

Pythonでは何回もメモリを確保したり、Javaではプリミティブ型はGoに近いですがクラス型はVMのbit数に左右されるなど、落ち着きがありません。

メモリはより大容量になり、CPUはより高速になっているため、データをやりとりするバスの差は広がる一方ですが、その差を埋めるためにCPUキャッシュが導入されています。

Goは正確にメモリを確保するため、CPUキャッシュを有効に活用することができ、結果としてパフォーマンスの向上につながっています。

二 Inlining

関数呼び出しにはコストがかかり、そのオーバーヘッドを軽減させる技術として「関数のインライン化」があります。

インライン化のデメリットはバイナリーファイルのサイズが大きくなることです。

Goは単純な関数に対してインライン化を行います。複雑な関数では呼び出し時のオーバーヘッドは関数本体の処理に比べて影響が少ないためインライン化を行いません。

パッケージがコンパイルされる際、インライン化に適した単純な関数にマークが付けられます。

.a ファイルでは、コンパイラーが迅速に処理できるようにソースが少し変換されています。

コンパイラーは、到達不能なコードがあれば排除します。

Goコンパイラーはファイルやパッケージ全体に対して自動的に関数のインライン化を行います。これには標準ライブラリーからインライン化可能な関数を呼び出すコードが含まれています。

以上、ざっくり、かつ、超意訳にまみれた内容紹介でしたm(__)m

次回(本日 ^^;)は「Google I/O 2014」でのGo関連の資料を見て行く模様です。

0 件のコメント: