Javaが速いということ

id:kazamaさんがDeveloperWorksのBrian Goetz氏の記事を読んで、こう仰られていた。

2005-11-04

実際,大学院の講義で学生にレポートを書かせたりしても,「Java言語は遅い」と既存のメディアの記事を鵜呑みにした学生がいたりするし,企業の技術者や大学の先生にも,ちらほらまだ誤解している人も見受けられ,まさに「都市伝説」となっているのは痛切に感じる.

確かに世の中にJavaが遅いといまだに考えている人が多い。
仕事でJavaを使いたくてもこういう人のおかげでCOBOLやCになってしまうことは多い。*1

速いJavaは存在する。
現に産総研の首藤氏の記事によるとIA32上のSun製JDK1.5.0はC言語の95%の速度で実行されるという。またベンチマークの種類によってはC言語よりも速い実行結果を叩き出すのだ。


Brianの連載にもあるようにJavaはメモリのアロケーションが速い。
でも、ちょっと待って。
今、そのメモリのアロケーションフラグメンテーションを起こさないから速いという説明はJVMの仕様だろうか?否だ。
Mustangでエスケープ分析が実装された。それはJVMの仕様だろうか。否だ。
じゃぁ、速いのはJavaなのか。


簡単にJavaが速いというのは難しい問題だ。
Brianが言っているのはSunのJDK1.4以上が世代別GCを採用し、メモリアロケーションが速いということだし、SunのMustangの実装にてエスケープ分析が実装されたので、SunのMustangの実装は速いということだ。*2


遅いJavaというのはまだ存在する。例えばWindowsXpでは標準では付かなくなったがIE上のMSJVMはJDK1.1の中途半端な実装のままのはずだ。Windows95の頃は最速を誇ったが今では遅い。またFreeBSDの悲劇の例もある。ほとんどの商用JavaLinux向けに実装されている。それらは同じようなUnixでも実行できない。現在は状況が改善されているかもしれないが、FreeBSDで速いJavaを求めるのは難しかった。


速いということは相対的なものだ。
C言語でも同じことが言える。C言語は速いのか?
同じIA32の上でも、GCCIntelのCコンパイラでは速度が違う。Intel製のほうが速い。これはベンチマークでも確認できる。


ただの言葉遊びにしか読めないかもしれないが、まとめておく。
速いJavaは存在する。しかし同時に遅いJavaも存在する。
Javaが速いというときに単純な表現は誤解を生じる。
単にJavaが遅いという人も何も考えていない。


僕らはJavaが遅いという人に聞かなければいけない。
「それはどこのなんてJavaですか?」

*1:先日JavaCOBOLのように死ぬとBruce Tateが書いていたがそう言える環境がうらやましい。言語もOSも簡単に絶滅には至らない。

*2:DeveloperWorksのフォーラムにてIBM製のJVMには既に実装されていると主張している人がいた。確認できないけどここにも写しておく。