2006年10月15日

Java benchmark

最近しばらく更新してなかったが、また始めよう。三日坊主癖があるほうなのでいつ止まるか分かりませんがw

さて、最近ずっとJVMの勉強をしていてだいぶいろいろ分かってきた。
JavaといえばバイトコードインタプリタがJVMなんてたいそうな名前がついていて、この仮想マシンの上で動作するプログラミング言語なわけですが、
実際のところこいつのせいで遅く感じてしまうことが多いのです。もちろん単なるインタプリタという訳ではなくて、各種の高速化するための実相がなされていますが。
Web作成のバイトではPHPを使っているけど、やっぱJavaでやるJSPも使えるようになりたいというところなのですが、やっぱパフォーマンスが気になるなっていました。

ここでベンチマークサイトを一つ。
http://mathsrv.ku-eichstaett.de/MGF/homes/grothmann/java/bench/
JavaとC++によるほぼ同じことをしているコードによってどれくらいの差があるか確かめられます。
ただしSieveBits.javaのコードに問題があり、BitSetクラスのメソッドが全てsynchronizedになっています。
不要な同期というものは今のところ自動的には取り除けないためこれのせいでC++にくらべ非常に遅く、コード的にも等価とは程遠いものになっています。
なので、全てsynchronizedを取り除いてください。(マルチスレッドを使ってないので取り除いても安全なはずです)

使用したコンパイラは、gcc-4.1.1(gentoo-r1),sun-jdk-1.5.0.8,ibm-jdk-1.5.0.3です。

C++ 6sec
SunJava 9sec
IBMJava 84sec
GCJ 10sec
gij 176sec

となりました。IBMのだけ何故か恐ろしく速度が低下しているのは謎です。
GCC付属のバイトコードインタプリタじゃ他を圧倒して遅いです。
差が付きやすそうな計算処理主体のものだとさすがに1.5倍くらい差があります。
Javaからネイティブコードを吐き出すGCJがもうちょっと頑張ってくれるかな?と思ったのですが、HotSpotなJVMとあまり差がないようで残念。

この記事へのトラックバックURL

http://blogs.dion.ne.jp/rebels/tb.cgi/4347492
※ブログオーナーが承認したトラックバックのみ表示されます。
※半角英数字のみのトラックバックは受信されません。
 
※半角英数字のみのコメントは投稿できません。