↑を調べるときに http://mono.kmc.gr.jp/~oxy/d/?date=20050404 を発見したので今更ながらのツッコミ。
なるほど見ていてびっくりの遅さですが、うーん OO は遅いのかなあと。
まずこういう場合、普通の OCaml プログラマは vector 的なものにはタプルかレコードを使うでしょう。タプルを使うとこんな感じ。
let size = 10000
let _ =
let v = (2, 1)
and result ref 0 in
for i = 0 to size - 1 do
for j = 0 to size - 1 do
result := !result + fst v - snd v
done
done;
print_int !result;
print_newline()
レコードなら type vector = { x : int; y : int } を宣言しておく必要があり、 v.x や v.y でアクセスできます。どっちが速いかというと、 fst 程度はインライン展開されてそうな気もするので、大差ないのかも。
実行してみた。
タプル版 ocamlopt 100000000 real 0.69 user 0.67 sys 0.00 レコード版 ocamlopt 100000000 real 0.66 user 0.65 sys 0.00 C言語 100000000 real 0.59 user 0.59 sys 0.00
うむ、遜色ありません。
あーただ、 ocamlopt は謎なものをたくさんリンクしてるからか、バイナリファイルのサイズが馬鹿でかいですな。 strip しても C の20倍くらいのサイズになりました。実行ファイルのサイズを気にする人もそんなにいないだろうけど、にしてもなぜという大きさですな。
……MLton で試そうと思ったけど、 for ループはないらしいので公平になりそうにないし、ていうより SML が書けない体になっていることがわかったので(いまいちわからん)、やめておく。きっと大差ないと思うんだけど。