下のほうに日本語版があります。
[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.
Note that ao-render-gcd.rb can runn only by MacRuby 0.6 or higher.
Note
- Mac OS X 10.6.3 (Snow Leopard)
- CPU : 2.4 GHz Intel Core 2 Duo (MacBook 2G)
- RAM : 4 GB 1067 MHz DDR3
- MacRuby 0.5 : http://svn.macosforge.org/repository/ruby/MacRuby/trunk revision:r3010
- MacRuby 0.6 : released pkg http://www.macruby.org/files/MacRuby%200.6.zip
- ruby-1.9.2 branch http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_9_2 revision:27709
- ruby-1.8.7-p249 ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.bz2
- MacRuby trunk(0.7) http://svn.macosforge.org/repository/ruby/MacRuby/trunk revision:r4161 [updated 2010-05-27]
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 に上げています。
実行条件は上の英語版に書いたとおりです。今回は 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 が動いてくれれば逆転しそうですけど。