Project

General

Profile

Feature #6972

特化命令opt_emptyの追加

Added by Glass_saga (Masaki Matsushita) about 8 years ago. Updated about 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-dev:46102]

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

patch.diff (2.35 KB) patch.diff Glass_saga (Masaki Matsushita), 09/03/2012 11:24 PM
patch2.diff (3.86 KB) patch2.diff Glass_saga (Masaki Matsushita), 09/05/2012 10:07 PM

Updated by ko1 (Koichi Sasada) about 8 years ago

いいんでないかと思うのですが,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

Updated by Glass_saga (Masaki Matsushita) about 8 years ago

ささださんからご指摘頂いた点ですが、特化命令の名前をopt_empty_pに変更し(idEmptyやBOP_EMPTYも同様)、テストを追加しました。

#3

Updated by ko1 (Koichi Sasada) about 8 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r37036.
Masaki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • insns.def: add new instruction opt_empty_p' for optimizeempty?' method. Apply a patch proposed at [ruby-dev:46120] [ruby-trunk - Feature #6972] by Glass_saga (Masaki Matsushita).
  • compile.c (iseq_specialized_instruction), vm.c, vm_insnhelper.h: ditto.
  • id.c, template/id.h.tmpl: ditto.
  • test/ruby/test_optimization.rb: test for this changes.

Updated by ko1 (Koichi Sasada) about 8 years ago

遅くなってすみません.
コミットしました.

(2012/09/05 22:07), Glass_saga (Masaki Matsushita) wrote:

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なら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。

--
// SASADA Koichi at atdot dot net

Updated by Glass_saga (Masaki Matsushita) about 8 years ago

ありがとうございました。

Also available in: Atom PDF