Js_of_ocamlでaobench

なんかAO Benchが続く。
画像処理をブラウザでやりたかったけれど、JavaScriptが1000行近くなったあたりで面倒になってきたので、http://d.hatena.ne.jp/camlspotter/20111015/1318664763を見てそのうち試そうと思ってたJs_of_ocamlを試してみた。

とりあえずざっくり実行速度見てみるために、http://d.hatena.ne.jp/h013/20110625/1309114394のaobenchを移植。
といっても基本的に変更なしでCanvas描画を付け加えるだけで動いた。つまらん。
http://peppermint.jp/temp/ao/

プロファイルとって見ると、Random.floatがOCamlでの実装をJSにコンパイルしたものになって重い様子なのでMath.randomを呼ぶように変更した。

let rnd f:float =
  let r = Js.Unsafe.meth_call (Js.Unsafe.variable "Math") "random" [||] in
  r *. f

調子に乗って画像のfloat配列もFloat32Arrayに置き換えてみたけれど、AOのループの外でしかアクセスしないせいかあんまり影響なかった。
後は、普通にレイトレの処理に時間を食ってるようだ。vdotはインライン展開してくれてもいい気がするけど、そのままでもtracing treeで展開されるんだっけ。

ocamloptでコンパイルしたものに比べると半分くらいの速度だけど、バイトコード実行よりはだいぶ早い。