2009-09-02 4 views
1

ちょっとしたデザインの質問があります。私はコードがパフォーマンスの差を持つことになりました。このコード最もパフォーマンスの高いものは何ですか?

public Interface Test 
{ 
    void Xyz(); 

} 


public class1 : WebControl , Test 
{ 
public void XyZ() 
{ 
    // do someting 
} 

public OnLoad() 
{ 
    ((Test)this).Xyz(); 

// or 

    Test ctrl = this as Test; 
    ctrl.Xyz(); 

// or 

    Xyz(); 

} 

} 

を得た場合

?私はXyz()直接呼び出しが速くなると思うが、私は確信していない((テスト)これ).Xyz()は直接呼び出しとの違いがあります。

ご意見、または参考資料はありますか。

おかげ

PS:私はちょうど差パフォーマンス、と...あなたはキャストやインターフェイスを指定したい理由がない答えを持っていwhant。私は、私はちょうど私の方法

+2

両方の方法でコードを書いてください。ストップウォッチを入手してください。毎回百万回試してみてください。それからあなたは答えを知るでしょう!私たちがここで言うことができるものはただの推測*です。パフォーマンスの質問に実際に答える*ための唯一の方法は、実際に試してみることです。 –

答えて

7

私はコンパイラがキャストと "as"の両方を取り除くことができれば、両方が成功することを保証できると期待します。もしそうでなければ、JITはうまくいくかもしれません。 明示的なインターフェイス実装を使用している場合は、にはキャストまたはasオペレータが必要です。その場合、私はキャストを使用します:の値がでない場合(バグ以外の状況で)、私は個人的にasを使用してください。

最終的にパフォーマンスの差はほとんどありませんが、可読性のために可能な限りキャストなしでやります。

+0

+1 JIT最適化について言及します。 –

+0

答えをありがとう。 –

3

方法の実装は現在のクラスにまだあるようインターフェイスタイプにthis参照をキャストする必要がない、直接メソッドを呼び出して、直接呼び出すことができます知っています。クラスをインタフェース型にキャストする場合は、不要な間接参照を追加して、利用可能なメソッドを取得します。

Jonが指摘しているように、JITはすべてのキャストを不要にするため、すべてのキャストを削除する可能性が高いと思いますが、可読性のために直接メソッドを呼び出すだけです。

関連する問題