ablog

不器用で落着きのない技術者のメモ

Java、C/C++、Go の性能差

調べものをしようとパラパラッと見ていたら、面白いことが書かれていたのでメモ。

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

P.23

オンラインゲーム特有の理由による言語の性能差
表0.1 で、JavaスループットC/C++に比べて10倍も低くなっている理由はオンラインゲームに特有のことです。一般的にJIT(Just In Time)コンパイラを備えている仮想マシン(Virtual Machine、VM)では、Javaの実行速度はJITコンパイルの効果で速くなり、場合によってはC言語よりも速い場合があります。
ただし、その効果は処理内容がCPUセントリックなものだけで、OSとの入出力を頻繁に行うアプリケーションでは成り立ちません。
(中略)
これはJava VMシステムコールを呼び出す前後で、バッファオーバーフローのチェックや例外オブジェクトの処理などを毎回やるためです。これらは省けない処理なので、VMを使う処理系では限界があります。オンラインゲームのサーバはネットワークに対する入出力が毎秒数万回以上発生する状態になるので、JavaC言語の速度差が生じる典型的なケースなのです。ApacheMySQLなどのサーバソフトウェアがC/C++で書かれているのも同様の理由があると考えられます。
(中略)
ちなみに、GoogleのGo言語は静的言語でネイティブ実行ですが、ガベージコレクションがありプログラマが型付けの強さをコードの部分ごとに選択できるという新しい提案なので、サーバ性能を犠牲にせずに開発効率を上げられる可能性があり、筆者は期待しています。Goolgeはサーバ開発のことをほんとによくわかっているなぁと感嘆することしきりです。


Go についてぐぐってみたら、Google の鵜飼さんのコメントを発見した。

Go 言語は UNIXPlan9 をはじめ多くのシステムプログラムを作ってきた優れた開発者たちが作った言語ですから、彼らにとっていいプログラムを書きやすい言語になっているはずなので、いいプログラムを書きやすくなっていると思います。ネットワークサーバーなんかに向いていますね。最適化やガーベジコレクションの実装などは改善の余地があるので、高性能が厳しく要求されるところに使うのはまだ早いかもしれません。

Google Developers Japan: インタビュー:Go言語について

本家のサイトに行ってみると、「get the most out of multicore and networked machines」と書かれていますね。興味深い。

Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction.

The Go Programming Language


え、「今頃気付いた?」って。だいたい世の中の流行から3年遅れで興味を持ち出すんです、私w