AO Bench on MacRuby 0.5/0.6, MRI 1.9.2 branch and 1.8.7-p249

下のほうに日本語版があります。

[En]
AO Bench is a small ambient occlusion renderer for benchmarking floating point performance by Syoyo Fujita. AO Bench was ported to various languages. See http://lucille.atso-net.jp/aobench/

A Ruby version of AO Bench is ported by id:miura1729

I rewrote ao-render.rb to eliminate redundant statements and reduce temporary objects. I also wrote ao-render-gcd.rb using Grand Central Dispatch support with MacRuby. The new version of AOBench ruby script file was uploaded on Gist.

http://gist.github.com/399234

Note that ao-render-gcd.rb can runn only by MacRuby 0.6 or higher.

Result

The best score of 5 times calculation are shown.

real(sec) user(sec) system(sec)
MRI 1.9.2(r27709) 200.74 200.69 0.17
MRI 1.8.7-p249 557.49 557.31 0.16
MacRuby 0.5(r3010) 271.19 316.03 5.45
MacRuby 0.6(pkg) 387.91 417.16 8.26
MacRuby 0.7(r4161) 265.40 288.38 6.17

MacRuby 0.6 seems slower than 0.5 in this situation.

MacRuby 0.6 receive SIGSEGV when execute ao-render-gcd.rb

[updated at 2010-05-27] MacRuby's performance is improved at trunk (revision:4161) and slightly faster than 0.5! MRI 1.9.2 is still a champion. It is expected that GCD version may become fastest if it works without SEGV.

[Ja]
MacRuby 0.6 がリリースされたので、0.5 との比較、MRI (Matz's Ruby Implementation) との比較のために再び AOBench を走らせてみました。前回の結果はこちら→「AO Bench on MacRuby 0.5, ruby-trunk, 1.9.2-preview1, 1.8.7-p160 - PB memo

syoyo さんの AO Bench (no title) は 3D レンダリングを実行する現実的な浮動小数点数演算のベンチマークで、とても多くの言語に移植されています。

Ruby 版は yarv2llvm の作者である id:miura1729 さんによって移植されています。

今回はそのスクリプトをベースに、冗長なメソッド定義を削ったり、一時オブジェクトの生成を抑制するように少しチューニングを施したものでベンチマークを採取しました。また MacRuby 0.6 向けに Grand Central Dispatch を利用してスキャンライン(横一列のピクセル)毎に並列実行するようにしたバージョン(ao-render-gcd.rb)も作成しました。利用したスクリプトは Gist に上げています。

http://gist.github.com/399234

実行条件は上の英語版に書いたとおりです。今回は 1.9.2-preview1 はもうかなり古くなってしまったということと、Ruby の 1.9.2 の branch が切られたばかりということから 1.9.2 は svn repository の ruby_1_9_2 から checkout して compile しました。これはテスト時点ではほとんど trunk と同じでしたので、trunk での結果は取っていません。MacRuby は 0.5 は以前 trunk からコンパイルしたもの、0.6 は pkg ファイルからインストールしたものを利用しています。

結果

それぞれ 5回計算してもっとも早く終了した結果です。

real(sec) user(sec) system(sec)
MRI 1.9.2(r27709) 200.74 200.69 0.17
MRI 1.8.7-p249 557.49 557.31 0.16
MacRuby 0.5(r3010) 271.19 316.03 5.45
MacRuby 0.6(pkg) 387.91 417.16 8.26
MacRuby 0.7(r4161) 265.40 288.38 6.17

今回も MRI 1.9 が最も高速で、1.8 が遅い、MacRuby はその中間という結果でしたが、0.6 が 0.5 よりも遅くなってしまっていました。

また ao-render-gcd.rb でベンチマークと取ろうとすると、MacRuby 0.6 は SEGV で終了してしまいました。Multi Thread での挙動にはまだ不安がありそうです。

[2010-05-27 追記] MacRuby の trunk に最適化らしい差分がコミットされていたので revision:4161 でビルドして結果を取りました。0.5 よりも早くなっています。まだ MRI 1.9.2 にはまだすこし敵わないようです。あとは GCD が動いてくれれば逆転しそうですけど。