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 |
linuxとcygwinで大分差があります。
NJはインタプリタにも関わらず gccの1/2〜1/3倍速 なのでかなり頑張ってますね。MLtonはgccの1〜1/2倍速くらいなのでこちらも中々の速度じゃないでしょうか。
で、えー…。SML#遅すぎでしょ。これはバグと言っていいレベルじゃないでしょうか?
どうしてこうなった?( ^ω^ )