いいんでないかと思うのですが,2点ほど.

- opt_empty だと empty なのか empty? なのかわからないから,opt_empty_p
がいいでしょうか.

- テストは? 再定義された時のテストも忘れずに.



(2012/09/03 23:24), Glass_saga (Masaki Matsushita) wrote:
> 
> Issue #6972 has been reported by Glass_saga (Masaki Matsushita).
> 
> ----------------------------------------
> Feature #6972: 特化命令opt_emptyの追加
> https://bugs.ruby-lang.org/issues/6972
> 
> Author: Glass_saga (Masaki Matsushita)
> Status: Open
> Priority: Normal
> Assignee: ko1 (Koichi Sasada)
> Category: YARV
> Target version: 
> 
> 
> 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なら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
> かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。
> 
> 


-- 
// SASADA Koichi at atdot dot net