読者です 読者をやめる 読者になる 読者になる

Cより速いJava

Java

今日友達と飯を食っていて、俺が「CよりJavaのほうが速い場合がある」と言ったら友達が信じられない、という反応を示した。俺も「どっかでそんなことが聞いたことあるな」レベルで喋っていたので「どういう場合に速いのか」は説明できなかった。たしか、どっかにそういう話があったはず・・、ということで寝る前に少しだけググってみたら以下を発見。

http://www.idiom.com/~zilla/Computer/javaCbenchmark.html

この論文で以下のよーなことを主張している(意訳。あやしい)。

ポインタによって最適化が難しくなる場合

「Cコード中に変数xを指すポインタpが定義されている場合、Cコンパイラはxの値をレジスタに格納できないので、キャッシュに保持して必要なときに読み込むようにする必要がある。一方でJavaだとポインタがないから変数は必ずレジスタに格納される。Cだとキャッシュの読み書きが発生するので、その分だけ遅くなることがあるぜ」
みたいなことを言っている?

GC

「GCは遅い遅い言われてますが、明確な理由もなく議論はできません。ある研究者は以下のように述べています。new/mallocする場合のことを考えてみます。
まずCの場合。1)メモリアロケータが適切なサイズのメモリスロットを探して、そのポインタを返します。2)ポインタは広大なメモリ空間中においてランダムな場所を指します。
次にJava。1)メモリアロケータはメモリを走査する必要はありません。なぜなら確実に空いてるアドレスを知っているから(ヒープ領域のことかな)。2)獲得したメモリ領域は必ず隣接しています。」
メモリを割り当てる領域が決定していて、かつ隣接しているから、メモリをあちこち探しまわる必要ないぜ!ということかな。

動的コンパイル

JITコンパイラJavaプログラムが実行されるプロセッサの種類を知っている。P4のキャッシュは大きいぜとか。特定のプロセッサ向けにいろいろ怪しい事もできると。一方でプリコンパイラ(Cのコンパイラ?)では汎用的なプロセッサ向けにコンパイルされる(少なくとも市販のソフト場合)。また、JITコンパイラは実際にどのクラスが使われて、どのメソッドがコールされるか知っているからインライン展開なども頑張ってくれる。」
う〜ん。

まとめ

普通に考えれば「CよりJavaが速い」なんて状況はほぼ無い気がしますね。論文のベンチマークテストではなんかBase-Cよりかなり速い事になってますが。どうなんでしょうか。あとでちゃんと読んでみよう。ああ眠い。
まあ、アホなCコードより、Javaコードの方が速い、ということは確かだとは思いますが(と、アホなCコードし書けないであろう俺が言ってみるテスト)。