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式の値が使えないし・・・。