2009-06-19
setn命令をサポートしたら速度が落ちた
|YARVにはsetnという命令があります。これをずっとサポートしていなかったのですが、なぜかAOベンチはこの命令を使っているのに動いていました。それはこういう状況で使っているからです。
if isect.hit then col = ambient_occlusion(isect) rad.x = rad.x + col.x rad.y = rad.y + col.y rad.z = rad.z + col.z end
ここで、if式の値はrad.z + col.zなんですが、この値はrad.zに格納するのにも使っています。そこで、こんなコードを生成しています。
NILをPUSH (1) radをPUSH rad.z + col.zを計算してその結果をPUSH (2) setn命令でスタックトップから2つ下((1)でPUSHしたNIL)を(2)の値で書き換える rad#z=メソッドを呼び出す rad#z=の戻り値を捨てる
結局、AOベンチではif式の値を使っていないのでsetnをサポートしていなくても問題なかったのでした。
ところが、昨日setnをサポートしたらAOベンチの速度が1割落ちてしまいました。これまで、NILを返すだけだったメソッドがDouble型を返すようになったためだと思いますが、これだけで1割速度低下とは驚きです。メソッドの型が変わっただけで処理が増えたわけじゃないですが。
そういうことで、setnをどうサポートすればいいか悩んでいます。サポートしないとif式の値が使えないし・・・。
コメントを書く
トラックバック - http://d.hatena.ne.jp/miura1729/20090619/1245407360
リンク元
- 20 http://www.rubyist.net/~kazu/samidare/
- 7 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GWYH_jaJP281JP281&q=バイナリパッチ+
- 5 http://www.google.co.jp/hws/search?hl=ja&q=バイナリパッチ&client=fenrir&adsafe=off&safe=off&lr=lang_ja
- 4 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=ruby+llvm&btnG=検索&lr=lang_ja
- 4 http://www.google.co.jp/search?hl=ja&q=RFC1213&lr=&aq=f&oq=
- 3 http://www.google.co.jp/hws/search?hl=ja&q=RFC1213&client=fenrir&adsafe=off&safe=off&lr=lang_ja
- 3 http://www.google.co.jp/search?q=谷山浩子 オールナイト&hl=ja&rlz=1T4ADBF_jaJP257JP257&start=10&sa=N
- 3 http://www.google.co.jp/search?q=RFC1213&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 2 http://a.hatena.ne.jp/Ddtana/
- 2 http://llvmruby.org/wordpress-llvmruby/