[#46102] [ruby-trunk - Feature #6972][Open] 特化命令opt_emptyの追加 — "Glass_saga (Masaki Matsushita)" <glass.saga@...>
5 messages
2012/09/03
[#46105] 拡張ライブラリの質問 — SASADA Koichi <ko1@...>
ささだです.
12 messages
2012/09/04
[#46110] Re: 拡張ライブラリの質問
— "NARUSE, Yui" <naruse@...>
2012/09/05
成瀬です。
[#46112] Re: 拡張ライブラリの質問
— Urabe Shyouhei <shyouhei@...>
2012/09/05
On 09/05/2012 09:52 AM, NARUSE, Yui wrote:
[#46114] Re: 拡張ライブラリの質問
— "NARUSE, Yui" <naruse@...>
2012/09/05
2012年9月5日 11:11 Urabe Shyouhei <[email protected]>:
[#46131] HaikuOS上でruby trunkのbuildが通るようになりました — Takashi Toyoshima <toyoshim@...>
こちらのMLでは初めてご挨拶させて頂きます、とよしまと申します。
7 messages
2012/09/12
[#46132] Re: HaikuOS上でruby trunkのbuildが通るようになりました
— KOSAKI Motohiro <kosaki.motohiro@...>
2012/09/12
> こちらのMLでは初めてご挨拶させて頂きます、とよしまと申します。
[#46159] [ruby-trunk - Feature #7047][Open] Add new C API: rb_newobj_with — "authorNari (Narihiro Nakamura)" <authorNari@...>
9 messages
2012/09/22
[#46162] Re: [ruby-changes:24978] nobu:r37030 (trunk): insns.def: super from at_exit — SASADA Koichi <ko1@...>
2点ほど.
4 messages
2012/09/25
[#46174] [ruby-trunk - Bug #7084][Open] RubyVM::InstructionSequence.compile("1+"*10000 + "1") causes SystemStackError or Segmentation Fault — "mrkn (Kenta Murata)" <muraken@...>
7 messages
2012/09/29
[ruby-dev:46102] [ruby-trunk - Feature #6972][Open] 特化命令opt_emptyの追加
From:
"Glass_saga (Masaki Matsushita)" <glass.saga@...>
Date:
2012-09-03 14:24:02 UTC
List:
ruby-dev #46102
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なら何かしない、など)、比較的「よく呼ばれる」メソッドであると思います。
かつ、メソッド呼び出しのコストに対して実体の処理が小さいので、新たな特化命令として導入する価値があると思うのですが、いかがでしょうか。
--
http://bugs.ruby-lang.org/