id:kazamaさんがDeveloperWorksのBrian Goetz氏の記事を読んで、こう仰られていた。
実際,大学院の講義で学生にレポートを書かせたりしても,「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の悲劇の例もある。ほとんどの商用JavaはLinux向けに実装されている。それらは同じようなUnixでも実行できない。現在は状況が改善されているかもしれないが、FreeBSDで速いJavaを求めるのは難しかった。
速いということは相対的なものだ。
C言語でも同じことが言える。C言語は速いのか?
同じIA32の上でも、GCCとIntelのCコンパイラでは速度が違う。Intel製のほうが速い。これはベンチマークでも確認できる。
ただの言葉遊びにしか読めないかもしれないが、まとめておく。
速いJavaは存在する。しかし同時に遅いJavaも存在する。
Javaが速いというときに単純な表現は誤解を生じる。
単にJavaが遅いという人も何も考えていない。