2016-05-10 7 views
2

Juliaは、ジャストインタイムの静的型の導出に大いに依存していることを理解しています(基本的にすべてのコードはC++テンプレートと考える必要があります)。これは、コンパイル時に型が既知である限り、異なる型のオブジェクトに対して単一のアルゴリズムを使用するときに実行時のオーバーヘッドがないことを意味します。Juliaの実行時ポリモーフィズムのオーバーヘッド

ランタイムポリモーフィズムに関しては、私は物事の仕組みがあまり明確ではありません。ここで

abstract Shape 

type Circle <: Shape 
    radius::Float64 
end 

type Square <: Shape 
    width::Float64 
end 

dist(x::Circle, y::Circle) = ... 
dist(x::Circle, y::Square) = ... 
dist(x::Square, y::Circle) = ... 
dist(x::Square, y::Square) = ... 


s = get_shape() 
t = get_shape() 
a = dist(s,t) 

get_shapeは、いずれかの円や正方形を返すことができ、例えば基づいて:私たちは次のような状況があるとユーザ入力。 C++では、ディスパッチは単純に仮想テーブル検索を行います。 Juliaではどのように機能しますか?複数の発送の仕組みは何ですか?それははるかに高価な仮想テーブルのルックアップですか? SquareCircleの両方を同じ抽象タイプから派生させることによる利点はありますか?これは実行時ディスパッチのコンテキストではまったく関係ありませんか?

EDT:この例で実行されている@code_warntypeができます:

Variables: 
    s::Union{Circle,Square} 
    t::Union{Circle,Square} 

Body: 
    begin # none, line 2: 
     s = (Main.get_shape)()::Union{Circle,Square} # none, line 3: 
     t = (Main.get_shape)()::Union{Circle,Square} # none, line 4: 
     return (Main.dist)(s::Union{Circle,Square},t::Union{Circle,Square})::ASCIIString 
    end::ASCIIString 

をので、コンパイラは、sとtの種類について完全に無知ではありません。 distに電話をするときは、この知識は派遣を迅速にするために使用されていますか?

+0

コンパイル時の型が複合型の連合である場合、私は自分自身を推測しなければならないとしたら、コンパイラは4つの仮想テーブルを生成し、時間ディスパッチはC++に匹敵します。それは正しいと思いますか? – krcools

答えて

8

同じ関数に対して複数のメソッドがある場合、juliaは、どのメソッドを呼び出すかを決定するために、型の交差(引数の型とシグネチャの型の一致)によるメソッドの参照を使用します。型が推論できる場合、コードがコンパイルされているときにその計算を実行できます。あらかじめルックアップを実行することで、実行時にタイプ交差を実行する必要がなくなり、これにより最高のパフォーマンスが得られます。

タイプが予測不可能な場合、juliaはどのメソッドを実行時にディスパッチするかを判断する必要があります。呼び出される関数が些細な作業をしている場合は、実行時にボトルネックになることがあります。 (多くの作業をしている場合、検索は基本的にパフォーマンスにとって重要ではありません)。

juliaはOOP言語よりも少し複雑ですが、正しい方法は最初の引数だけでなくすべての引数に依存するためです。

+0

その場合、現在何をしていますか?たとえば、可能な型が2つしかなく、他のすべての型がわかっている場合、単純な比較を1回しか実行できず、ある型または他の型に最適化されたコードに分岐できないようにしてくださいオーバーヘッドが、私はそれが現在のケースだとは思わない。この場合、4つのタイプの組み合わせが可能で、2つの比較だけで最適化されたメソッドを選択できるはずです。 –

+0

ScottJonesは、パフォーマンスのトレードオフに関する十分な情報に基づいた決定を下すために、私が興味を持っている実装の詳細のタイプにちょうど触れています。もしJuliaがディスパッチする前に複雑な型識別をしなければならないとすれば、 'get_shape'は返された型に対応するenum値を返さなければならないようです。私は次に、ネストされた 'if'(2x2ブランチ)ブロックでこのタイプのIDを使用して、安価なディスパッチを手動で行うことができます。しかし、私はまだJulia JITコンパイラが私の代わりにこのような 'if'ブロックを作成することを期待しています。それが起こる可能性はありますか? – krcools

+0

私はJuliaコンパイラが現在このような 'if'ブロックを作成しているとは思わないが、少なくとも数が限られている場合はいつかは妥当と思われる。しかし、enum値を返す代わりにあなたの 'if'ブロックで' isa'でタイプをチェックしてください。 –

関連する問題