[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 メーリングリストの案内