aobenchによるSMLベンチマークを書いた

aobenchというのはアンビエントオクルージョン(AO)というアルゴリズムを使用したレンダリングを行う、浮動小数点数計算のベンチマークです。
オリジナルはC言語の400行に満たない小さなプログラムです。これをSMLに移植して実行時間のベンチマークを行いました。(絵が出ると楽しい)


ベンチマークに使用したコードはgithubに置いてあります> eldesh/aobench_sml
C言語をできるだけそのままSMLに持ってきた実装です。ただし私の趣味で画像の配列以外で参照は使わないようにしました。

動かし方

トップディレクトリで ./meta-aobench.sh すると、SML/NJ, MLton, SML# (とgcc) のうち見つかったものをそれぞれ動かします。
それぞれの結果は aobench-gcc.ppm aobench-mlton.ppm aobench-sml.ppm aobench-smlsharp.ppm という画像ファイルとして得られます。

以下のようにすればpngに変換できます。

for file in *.ppm;do
  pnmtopng $file > ${file%ppm}png
done

結果

結果です。(SML#はcygwinで動かないので同一PC上のmingwでの参考記録)

処理系 real user sys
gcc 0m3.773s 0m3.740s 0m0.002s
smlnj 0m9.529s 0m9.419s 0m0.032s
mlton 0m6.410s 0m6.324s 0m0.034s
smlsharp 0m51.094s 0m50.488s 0m0.171s
処理系 real user sys
gcc 0m2.384s 0m2.355s 0m0.000s
smlnj 0m3.692s 0m3.571s 0m0.105s
mlton 0m2.314s 0m2.137s 0m0.015s
smlsharp 0m22.660s 0m0.016s 0m0.015s


linuxcygwinで大分差があります。
NJはインタプリタにも関わらず gccの1/2〜1/3倍速 なのでかなり頑張ってますね。MLtonはgccの1〜1/2倍速くらいなのでこちらも中々の速度じゃないでしょうか。


で、えー…。SML#遅すぎでしょ。これはバグと言っていいレベルじゃないでしょうか?
どうしてこうなった?( ^ω^ )