yarv-dev:210
From: SASADA Koichi <ko1 atdot.net>
Date: Thu, 16 Sep 2004 17:42:12 +0900
Subject: [yarv-dev:210] Re: return from orphan Proc object
MAEDA Atusi <maeda-yarv atusi.org> wrote :
[ [yarv-dev:207] Re: return from orphan Proc object ]
at 16 Sep 2004 17:19:46 +0900
ささだです.
> ささださんが意図している最適化は、
> ・呼び出し側がProc.newを使わず { ... } を渡し、
> ・かつ、呼び出される側が暗黙の引数で受けとった時に、
> 一人前のProcを割り当てずに軽いもの(Lispの世界だとeasy closureとか呼ん
> だりする)だけ作って済まそうというものだと思います。
はい.そのとおりです.Ruby の場合,一般的には easy closure
ばかりが利用されるんじゃないかなー,と想像してます.
> 呼び出される側は、FullProcとEasyProcを区別せずにyieldできるのでしょう
> か? もし区別が必要だとすると、iterator側では両方のコードを用意するの
> でしょうか、それともどちらかにcanonicalizeするのでしょうか?
区別が必要なのは,yieldするときで,その yield 1命令だけが,
頑張ってそれぞれの処理を振り分ければ問題ないと考えています.
特に,その振り分け自体が難しいとも思えません.
Insn yield{
block = GET_BLOCK();
if(CLASS_OF(block) == Proc){
Proc な yield
}
else if(CLASS_OF(block) == Block){
Block な yield
}
}
> どうせ多くの場合FullProcにcanonicalizeすることになるんじゃないか、だと
> したらEasyProc なんて用意する意味はないんじゃないか、という意図です。
私は上記のとおり,根拠もなく easy なのばっかりじゃん? と
思っていたので,一度しっかり検証する必要はあるかもしれません.
Ruby で Proc って,ほんとにそんなに使うかなぁ?
x.times{|i|
hogehoge
}
はよく使いますけど,Proc オブジェクトを生成する必要はない
ですよね.
というわけで,期間中にベンチマークプログラムを作って調べて
みます.
あー,ベンチマーク用の何かも集めたりしないといけなかったなぁ.
> また、「EasyProcを作って渡したけれど、呼び出された側は名前のある引数で
> 受けとった」とすると、それをチェックしてFullProcに変換しなければなりま
> せんよね。最初から何も考えずにFullProcを作る場合よりオーバーヘッドがか
> かります。
EasyProc 生成のコストは 0 なので,「よりオーバーヘッドが増える」
ということはないと思います.
def m cond
a = 1
if cond
iter{
...
}
else
...
end
end
m
のようなコードがあったとき,m を実行した瞬間 m の環境をヒープ
に移すということですよねぇ.あれ,iter を実行した瞬間に,m の環
境を保存?
> いずれにせよ、EasyProcを作るなんていう最適化は完全にoptionalですから、
> 後回しにして良いんではないかと思います。
実は,さきにそっちを作っちゃったんです orz.楽だから.
--
// SASADA Koichi at atdot dot net
//
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
185 2004-09-15 21:12 [ko1 atdot.net ] return from orphan Proc object 187 2004-09-15 22:02 ┣[maeda-yarv atusi.org] 188 2004-09-16 01:01 ┃┗[matz ruby-lang.org ] 190 2004-09-16 01:45 ┃ ┗[ko1 atdot.net ] 192 2004-09-16 02:13 ┃ ┗[matz ruby-lang.org ] 193 2004-09-16 07:53 ┃ ┗[ko1 atdot.net ] 194 2004-09-16 08:14 ┃ ┗[matz ruby-lang.org ] 195 2004-09-16 08:37 ┃ ┣[ko1 atdot.net ] 196 2004-09-16 08:50 ┃ ┃┣[matz ruby-lang.org ] 198 2004-09-16 12:11 ┃ ┃┗[maeda-yarv atusi.org] 202 2004-09-16 16:32 ┃ ┃ ┗[ko1 atdot.net ] 211 2004-09-16 17:52 ┃ ┃ ┗[maeda-yarv atusi.org] 214 2004-09-16 18:02 ┃ ┃ ┗[ko1 atdot.net ] 197 2004-09-16 11:47 ┃ ┗[maeda-yarv atusi.org] 199 2004-09-16 14:04 ┃ ┣[matz ruby-lang.org ] 200 2004-09-16 16:23 ┃ ┃┣[ko1 atdot.net ] 204 2004-09-16 16:58 ┃ ┃┃┣[matz ruby-lang.org ] 208 2004-09-16 17:22 ┃ ┃┃┃┗[ko1 atdot.net ] 209 2004-09-16 17:30 ┃ ┃┃┃ ┗[matz ruby-lang.org ] 212 2004-09-16 17:53 ┃ ┃┃┃ ┗[ko1 atdot.net ] 216 2004-09-16 18:18 ┃ ┃┃┃ ┗[matz ruby-lang.org ] 207 2004-09-16 17:19 ┃ ┃┃┗[maeda-yarv atusi.org] -> 210 2004-09-16 17:42 ┃ ┃┃ ┗[ko1 atdot.net ] 213 2004-09-16 18:01 ┃ ┃┃ ┣[maeda-yarv atusi.org] 219 2004-09-16 18:24 ┃ ┃┃ ┃┗[ko1 atdot.net ] 224 2004-09-17 00:21 ┃ ┃┃ ┃ ┗[maeda-yarv atusi.org] 225 2004-09-17 00:45 ┃ ┃┃ ┃ ┗[ko1 atdot.net ] 226 2004-09-17 12:02 ┃ ┃┃ ┃ ┗[maeda-yarv atusi.org] 227 2004-09-17 12:11 ┃ ┃┃ ┃ ┣[ko1 atdot.net ] 228 2004-09-17 13:38 ┃ ┃┃ ┃ ┗[ko1 atdot.net ] 218 2004-09-16 18:22 ┃ ┃┃ ┗[matz ruby-lang.org ] 220 2004-09-16 18:31 ┃ ┃┃ ┗[ko1 atdot.net ] 221 2004-09-16 19:03 ┃ ┃┃ ┗[matz ruby-lang.org ] 222 2004-09-16 19:08 ┃ ┃┃ ┗[ko1 atdot.net ] 223 2004-09-16 19:12 ┃ ┃┃ ┗[ko1 atdot.net ] 201 2004-09-16 16:33 ┃ ┃┗[maeda-yarv atusi.org] 206 2004-09-16 17:01 ┃ ┃ ┗[matz ruby-lang.org ] 215 2004-09-16 18:06 ┃ ┃ ┗[maeda-yarv atusi.org] 217 2004-09-16 18:20 ┃ ┃ ┗[matz ruby-lang.org ] 203 2004-09-16 16:38 ┃ ┗[ko1 atdot.net ] 189 2004-09-16 01:04 ┗[matz ruby-lang.org ] 191 2004-09-16 01:51 ┗[ko1 atdot.net ] 205 2004-09-16 16:58 ┗[ko1 atdot.net ]