2009-07-28 13 views

答えて

17

は、拡張メソッドは、シンタックスシュガーに包まれたばかりの静的メソッドを呼び出していることを忘れないでください。それでは、あなたが本当に求めていることは

で静的およびインスタンスメソッドの性能差が

あります答えはイエスであり、この主題で利用可能なさまざまな記事

いくつかのリンクがあります

+0

私はあなたがまだ何かを見つけていないので、これらの記事にいくつかの引用を追加することを望んでいました。おそらく私は間違った言葉をGoogleに入れているだろう。 –

+0

@Colin me too :)私は前回の提出でヒットしなかったと思う。 「CLRメソッド呼び出しのパフォーマンス」を検索してみてください。ほとんどの記事は一般的なアプローチですが、インスタンスと静的な違いについて説明します。 – JaredPar

+0

ありがとうございます - 良い読書のように見えます...私はすぐに戻ってきます:) –

5

すべての構文的な砂糖であるため、パフォーマンスの違いはありません。コンパイラは他のメソッド呼び出しと同じようにコンパイルするだけですが、別のクラスの静的メソッドを除いてコンパイルします。

糖衣構文についての私のブログからいくつかの詳細:http://colinmackay.co.uk/2007/06/18/method-extensions/

+0

-1あなたのブログでは、静的メソッドを静的メソッドと比較しています。それはインスタンスメソッドとは異なります... –

+0

そのブログエントリは2年以上前に書かれており、その目的はこの正確な質問に答えることではありませんでした。拡張メソッドが基本的なILを表示し、拡張メソッドが一般的にどのように機能するかを示すことで、拡張メソッドが構文的な砂糖であることを実証することは、私の包含でした。しかし、ダウン投票に感謝します! –

0

引数の数がメソッドに渡されるため、わずかなパフォーマンスの差があります。たとえば、以下のクラスを見て:

次のコードを実行している
public class MyClassInstance 
{ 
    public int MyProperty { get; set; } 

    public MyClassInstance(int prop) 
    { 
     MyProperty = prop; 
    } 

    public void IncrementInstance() 
    { 
     MyProperty++; 
    } 
} 

public static class MyClassStatic 
{ 
    public static void IncrementStatic(this MyClassInstance i) 
    { 
     i.MyProperty++; 
    } 
} 

 DateTime d = DateTime.Now; 

     MyClassInstance i = new MyClassInstance(0); 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementInstance(); 
     } 

     TimeSpan td = d - DateTime.Now; 

     DateTime e = DateTime.Now; 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementStatic(); 
     } 

     TimeSpan te = e - DateTime.Now; 

による事実のために、TD = 0.2499秒

TE = 0.2655秒

をインスタンスメソッドは引数を渡す必要はありません。

heresパフォーマンス

+1

インスタンスメソッド呼び出しの "this"参照はどうなりますか?それはどこに行くの?それはどうやって渡されますか?このメソッドはどこかから取得する必要がありますか? –

+0

基本的に、IncrementInstanceとIncrementStaticの両方が、MyPropertyプロパティのSetメソッドを呼び出します。インスタンスメソッドはインスタンスメモリを直接参照し、静的メソッドは引数として渡されたインスタンスを参照します。 –

+1

奇妙なことに、私はあなたのコードをとり、私のマシンでそれを走らせました。あなたが同じ数の繰り返しを使用するとき、数字がお互いに飛び乗る。場合によってはインスタンスメソッドが勝利することもあります。私はタイマーが十分ではないので、イテレーションを20億(int.MaxValue)以上に設定しました。これでかなり安定した結果が得られました。インスタンスメソッドを使用する反復では46ナノ秒かかるため、拡張メソッドを使用する反復では45ナノ秒かかる。私は違いがナノ秒に基づいて何かを最適化しようとしています。 –

3

に少し日付が、良い記事では、これは、任意の大きな違いはありません。 this articleを参照してください。

私はテストの結果を確認して、スタティックバリアントにタイプがSampleのパラメータがある別のテストを行いました。私のシステムでは21億コールで11495ms(+/- 4ms)を要しました。記事によれば、これについて心配するべきではありません。

ここでの例とテストのほとんどは、メソッドのインライン展開が可能であるため無効です。 )もしメソッドが空であればコンパイラで特に簡単;)

(興味深いのは、私のシステムではテストが記事のものより遅いことに興味があります。正確に遅くはありませんが、64ビットOS )

+0

そのリンクはもう動作しません... – takrl

+0

私は、どこに他の人がオンラインで置いているのかを著者に確認しています。その間、http://web.archive.org/web/20090624234442/http://gregbeech.com/blogs/tech/archive/2007/01/11/static-vs-instance-methodで読むことができます。 -performance.aspx – Thorarin

+0

ありがとう、私は彼の現在のブログをチェックしましたが、それはもうありませんでした。 – takrl