2012-12-09 9 views
12

私はジャック・ガリゲスによって、次のポストに出くわしたCAMLリストにいくつかの古い記事を読む:http://caml.inria.fr/pub/ml-archives/caml-list/2007/11/24e8215c8d844b05db58ed3f79c9645f.en.htmlメソッドディスパッチが時々遅いのはなぜですか?

私が気に引用符は以下の通りです:

方法は遅くなることがあります任意のオブジェクトを呼び出します。これは、 サブタイピングのために、場合によっては、 というメソッドがどこにあるかを知る方法がなく、バイナリ検索が行われなければならないからです。

誰にこのような理由が説明できますか?なぜ正確にサブタイプ化(このケースでは継承していると仮定している)がこれに影響を与えているのですか?これはOCamlの実装のケースですか、それとも他の言語もこれに苦しんでいますか?

これについては、私はもう失敗しています。

+3

サブタイプ!=継承。 – delnan

+0

うーん、私は何か読んでいるように見える... – rgrinberg

答えて

4

誰にもこのような理由が説明できますか?

各メソッドにはコンパイル時に一意の整数を割り当てることができるため、配列にインデックスを付けて仮想関数を見つけることができます。 (OCamlのような)構造的な型付けではこれを行うことはできませんので、構造体のハッシュ(メソッド名)を使って辞書内の仮想メソッドの関数ポインタを検索します。

サブタイピング(このケースでは私が仮定している継承)がこれに影響を与えるのはなぜですか?

サブタイプは、仮想ディスパッチの前提条件です。

これはOCamlの実装のケースですか、それとも他の言語にもこの問題がありますか?

ちょうどOCamlの実装。 F#では、リフレクションとランタイムコードの生成を使用して、そのようなインボーク時のパフォーマンスヒットがない場合と同じ効果を達成しました。

+0

これは良い答えですが、バイナリ検索が正確にどこに来るのかはまだ分かりません。 – rgrinberg

+0

オープンソースのサンプルコードがありますか? – Demi

10

私は、delamanのコメントは、OCamlで "Subtyping!= inheritance"がその説明に洞察を与えていると思います。上記

$ rlwrap ocaml 
     OCaml version 4.00.1 

# let f o = o#x + o#y ;; 
val f : < x : int; y : int; .. > -> int = <fun> 
# 

機能fメソッドx : inty : intを有する任意のオブジェクトoを受け付けます。これらのメソッドのオフセットが事前に修正されている可能性のあるクラスcから継承したオブジェクトではありません。 これらのメソッドのオブジェクト。私はこれを実装するのは難しいと思うし、ジャックが彼のメッセージで言及しているケースの1つかもしれない。

+0

ありがとうパスカル。私はまだ、検索が適切なvtableでハッシュテーブルを調べる以上のものでなければならない理由を理解していません。おそらく私はOCamlのコードを見てみるべきでしょう。いずれにせよ、他に誰も説明がない場合、私はあなたの答えを受け入れるでしょう... – rgrinberg

+4

@rgrinberg "ハッシュテーブルルックアップ"はできるだけ安価な実装だと言いますが、そうではありません。ハッシュテーブル参照とバイナリ検索(明らかに実際に使用されている)の両方が、コンパイル時定数インデックスを持つ配列参照と比べて(この抽象レベルの場合)かなり遅くなります。 – delnan

+1

@delnan私は彼がハッシュテーブルルックアップがバイナリ検索より高速で、なぜハッシュテーブルが代わりに使われないのだろうと思っていると思います。 – asm

関連する問題