The Java performance debate

Javaの性能についての議論

OSNews.comで,Javaの性能についての記事(The Java performance debate)が,かなり熱いことになっていました.

Javaの性能の話は,Javaが登場した10年前から,頻繁になされていて,たいぶ食傷気味なのですが,この記事では,いくつかの興味深いベンチマークに触れていたので,とりあげてみます.ちなみに,Java自身は,すこし前にJ2SE 5.0もリリースされたり,それなりに良くなっているのでが,昔からの「遅い」というイメージはなかなか払拭できていないようです.

記事の論調は,要約&超訳するとこんな感じです.

  1. Javaは遅い,Javaはメモリ食い」と一般的に言われている.
    • Perl/Python/PHPを使っている人が,Javaを遅い,と批判している.これは,客観的な批判とは言えないのでは.
    • JVMがあるので,メモリ消費は,どうしても大きくなってしまう.
    • 多くのベンチマークC++よりJavaが速い,という結果が出ている
  2. Javaの悪評の多くは,JVMの消費するメモリ・起動時間であり,アプリケーション自体ではない.
  3. クライアントアプリケーションの場合,Swingがボトルネックとなりやすい.
    • Swingが採用しているスレッドモデルは,Windowsなどの他のGUI Toolkitでも使われている一般的なものであり,ボトルネックとならないためのアプリケーションの実装が重要.
  4. Javaアプリケーションは,まだまだ性能上の改善の余地があるため,アプリケーションの問題をJavaの本質的な問題と混同しているのではないか.
    • Eclipseも最近のマイルストーン(M7,05/5/12リリース)では,(JVMではなく)内部ロジックの改善によって,性能がかなり改善されている.

主張する内容は,だいたいそうかな,と納得できるのですが,もうすこしサーバ側の観点や,C++相手だけではなく,Perl/Python相手の話も欲しかったところです.

各種ベンチマーク

上の記事で示されていたベンチマークで,興味深いのをいくつか紹介します.

The Computer Language Shootout Benchmarksでは,いろんなベンチマークを様々な言語上で動作させた結果を見ることができます.全体では,下のような結果(一部抜粋)になっています.Javaは,C++よりは遅く,Perlよりは速い,という,それなりの結果となっています.

言語 スコア(Overall)
C++(g++) 19.72
Java 18.57
Perl 12.50

ちなみに,オブジェクトのメソッド呼出しのベンチマーク(object-methods (deprecate) benchmark)は,言わゆる動的型付け言語は,静的型付け言語の2ケタ落ちぐらいの性能ですね.(でも,smalltalkは,かなり健闘してますね.なんででしょう?)

他にも,'The Java Faster than C++' Benchmark RevisitedとかPerformance comparison C++, C# and Javaとかが参考になります.

ただ,これらのベンチマークで言えることは,いずれも比較的小さなプログラムによるもので,ある程度の得意・不得意の傾向は捕む程度に過ぎないということがあります.本当に知りたいのは,ある程度の規模を持ったアプリケーションを実装するには,どの言語が適しているか?,ということで,この問題には,それほど答えてくれていません.結局のところ,開発する人の慣れや趣味,といった環境の要因のほうが大きそうです.