Feature #6972
closed特化命令opt_emptyの追加
Description
YARVの特化命令opt_emptyの追加を提案します。
opt_emptyはrecv.empty?に対応する特化命令で、opt_sizeやopt_lengthと同じくString、Array、Hashがレシーバである場合に有効です。
次のベンチマークでopt_emptyを有効にした場合のパフォーマンスを比べました。
require 'benchmark'
Ary = []
Times = 10_000_000
Benchmark.bm do |x|
x.report do
Times.times { Ary.empty? }
end
end
trunk(r36890):
user system total real
1.070000 0.000000 1.070000 ( 1.086783)
proposed:
user system total real
0.730000 0.000000 0.730000 ( 0.745782)
およそ1.46倍に高速化されている事がわかります。
約1.46倍の高速化が他の特化命令と比較して有効であるかどうかを調べる為に、opt_emptyに似た特化命令であるopt_sizeと比較してみました。
上記と同じtrunkのr36890で、compile.cの1874行目(iseq_specialized_instruction()でopt_sizeを使用する部分です)をコメントアウトして
opt_sizeを無効にし、上記のベンチマークのAry.empty?をAry.sizeに置き換えたものを実行して比較したところ、以下のようになりました。
特化命令opt_sizeを無効にした場合:
user system total real
1.060000 0.000000 1.060000 ( 1.061210)
有効にした場合:
user system total real
0.750000 0.000000 0.750000 ( 0.765943)
ほぼ同様の結果となりました。
opt_emptyは、特化命令として妥当な効果があると言えそうです。
recv.empty?は、イテレーションの中で用いられるようなケースも多く(要素がemptyなら何かする or emptyなら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。
Files