今日友達と飯を食っていて、俺が「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)獲得したメモリ領域は必ず隣接しています。」
メモリを割り当てる領域が決定していて、かつ隣接しているから、メモリをあちこち探しまわる必要ないぜ!ということかな。