2017-10-23 6 views
-1

などのインターフェースを使用して、任意のパフォーマンスへの影響があります:
1)基本クラスの参照
は、性能の点で優れている参照

abstract class BaseClass{} 

class A : BaseClass{} 
class B : BaseClass{} 

static void Main(){ 
BaseClass objectInstance = new A(); 
      objectInstance = new B(); 
} 

又は
2を介してオブジェクトへの参照。 )インタフェース参照によるオブジェクトへの参照:

interface IBase{} 

class A : IBase{} 
class B : IBase{} 

static void Main(){ 
    IBase objectInstance = new A(); 
    objectInstance = new B(); 
} 
+4

これはあなた自身をテストするために*スーパー*簡単です。おそらく、簡単なベンチマークを実行するよりも、この質問を正確に記述して書式設定するのに時間がかかりました。 –

+1

[どちらが速いのですか?](https://ericlippert.com/2012/12/17/performance-rant/) –

+2

このコードには何の影響もありません。重要なのは次の作業です。インタフェースメソッド呼び出しにはオーバーヘッドがあり、コールスタブを経由しなければならず、ジッタオプティマイザはメソッドをインライン化できません。 perfの違いは正確に測定するのが難しく、非常に速いコードであり、非インターフェイスメソッドを完全に消滅させることでベンチマークを乱すのはかなり簡単です。インターフェイスは構造的なデザインパターンです。あなたはそれらにオプトインしたり、それを放棄したりすることはできません。 CLRによって非常に大きく最適化されたマイクロソフトは、吸うことはありません。 –

答えて

-1

影響は微視的で、コードの実際のパフォーマンス重視の部分を書くまでは、あなたのニーズに最も適したものを使用しないでください。

ただし、インターフェイスでパフォーマンスの問題が発生する場合があります。これは、インターフェイスをパラメータとして受け取り、インターフェイスを実装する構造体を持つメソッドを持つときに発生します。

class Demo { 
    public static void Method(IInterface input) {}; 
} 

struct Struct: IInterface {} 


Demo.Method(new Struct(arg1, arg2)) 

このようなコードはstructのボクシングを引き起こします。あなたは、時間/速度性能の問題も発生することがありますボクシングに

class Demo { 
    public static void Method<T>(T input) where T: IInterface {}; 
} 
0

を避けるために制約を持つジェネリックを使用することを検討すべきであるが、youreの小さなコレクションを扱う場合の違いはごくわずかです。リストをパラメータとして使用する場合は、代わりにiListを使用します。これはあなた次第です。ここにリファレンスがあります... https://github.com/dotnet/coreclr/issues/9105

関連する問題