[Yarv-devel] Efficient method dispatch (Re: VM Speedup Tech.)
K.Sasada
ko1 @ namikilab.tuat.ac.jp
2004年 2月 9日 (月) 23:22:48 EST
MAEDA Atusi <maeda-yarv at atusi.org> wrote :
[ [Yarv-devel] Efficient method dispatch (Re: VM Speedup Tech.) ]
at 09 Feb 2004 22:59:54 +0900
> クラスがメソッドを持たないとすると、どうやってlookupするんでしょう。
>
> クラスの継承関係をトポロジカルソートで全順序にしておいて、セレクタごと
> のテーブル内では一番leafのクラスから順に並べておくとか?
>
m_table = { ClassA => method_body_of_A,
ClassB => method_body_of_B,
ClassC => method_body_of_C, }
てなことを考えてました。
で、
def send obj, selector, *args
klass = obj.class
m_table = selector.m_table
unless m_table.has_key? klass
klass = klass.superclass
return obj.method_missing(*args) unless klass
end
m_table[klass].invoke(*args)
end
(現状は、m_table = { selectorA => m_body_of_A, ... } )
複数テーブルを渡らなくていいので、他になんか最適化できないかなぁ、とか。
いっそ、このメソッドテーブル自体をメソッドキャッシュと同様の扱いにしてし
まうとか。使いまわしは効かなくなっちゃうんですが。
> あと、メソッドテーブルはキャッシュじゃないですよね。効率って?
CPUなどのキャッシュメモリの効率、という意味でした。効率がいい=キャッ
シュメモリのヒット率が高い、を考えていました。
> これだと(CISCOと同じく)メモリの量を定数で抑えられますしね。
>
> あと、今のハッシュ表でもそうですけど、ヒット率を上げる工夫をする余地は
> あるかもです。ミスした時に何回か(2回とか)プローブする(疑似セットアソシ
> アティブ) とか。(c)だと4回とか8回とかやってもヒット時の処理は遅くなら
> ないのが良い。
なぜ (c) だとヒット時の処理が遅くならないのかがわかりませんでした。
あ、追い出されにくくなるからか。
そうですね。まずは調査が先か。何を走らせればいいんだろう。
とりあえず tDiary?(面倒そう・・・)
--
// SASADA Koichi @ namikilab.tuat.ac.jp
//
Yarv-devel メーリングリストの案内