Forum: Ruby-dev [ruby-trunk - Feature #6972][Open] 特化命令opt emptyの追加

Posted by Glass_saga (Masaki Matsushita) (Guest)
on 2012-09-03 16:24
(Received via mailing list)
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なら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。
Posted by SASADA Koichi (Guest)
on 2012-09-03 17:24
(Received via mailing list)
いいんでないかと思うのですが,2点ほど.

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

- テストは? 再定義された時のテストも忘れずに.
Posted by Glass_saga (Masaki Matsushita) (Guest)
on 2012-09-05 15:07
(Received via mailing list)
Issue #6972 has been updated by Glass_saga (Masaki Matsushita).

File patch2.diff added

ささださんからご指摘頂いた点ですが、特化命令の名前をopt_empty_pに変更し(idEmptyやBOP_EMPTYも同様)、テストを追加しました。
----------------------------------------
Feature #6972: 特化命令opt_emptyの追加
https://bugs.ruby-lang.org/issues/6972#change-29190

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なら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。
Posted by SASADA Koichi (Guest)
on 2012-09-26 11:43
(Received via mailing list)
遅くなってすみません.
コミットしました.
Posted by Glass_saga (Masaki Matsushita) (Guest)
on 2012-09-26 14:19
(Received via mailing list)
Issue #6972 has been updated by Glass_saga (Masaki Matsushita).


ありがとうございました。
----------------------------------------
Feature #6972: 特化命令opt_emptyの追加
https://bugs.ruby-lang.org/issues/6972#change-29753

Author: Glass_saga (Masaki Matsushita)
Status: Closed
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なら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.