インスタンスメソッドと拡張メソッドの間にパフォーマンスの違いはありますか?パフォーマンス拡張メソッドとインスタンスメソッド
答えて
は、拡張メソッドは、シンタックスシュガーに包まれたばかりの静的メソッドを呼び出していることを忘れないでください。それでは、あなたが本当に求めていることは
で静的およびインスタンスメソッドの性能差が
あります答えはイエスであり、この主題で利用可能なさまざまな記事
いくつかのリンクがあります
私はあなたがまだ何かを見つけていないので、これらの記事にいくつかの引用を追加することを望んでいました。おそらく私は間違った言葉をGoogleに入れているだろう。 –
@Colin me too :)私は前回の提出でヒットしなかったと思う。 「CLRメソッド呼び出しのパフォーマンス」を検索してみてください。ほとんどの記事は一般的なアプローチですが、インスタンスと静的な違いについて説明します。 – JaredPar
ありがとうございます - 良い読書のように見えます...私はすぐに戻ってきます:) –
すべての構文的な砂糖であるため、パフォーマンスの違いはありません。コンパイラは他のメソッド呼び出しと同じようにコンパイルするだけですが、別のクラスの静的メソッドを除いてコンパイルします。
糖衣構文についての私のブログからいくつかの詳細:http://colinmackay.co.uk/2007/06/18/method-extensions/
-1あなたのブログでは、静的メソッドを静的メソッドと比較しています。それはインスタンスメソッドとは異なります... –
そのブログエントリは2年以上前に書かれており、その目的はこの正確な質問に答えることではありませんでした。拡張メソッドが基本的なILを表示し、拡張メソッドが一般的にどのように機能するかを示すことで、拡張メソッドが構文的な砂糖であることを実証することは、私の包含でした。しかし、ダウン投票に感謝します! –
引数の数がメソッドに渡されるため、わずかなパフォーマンスの差があります。たとえば、以下のクラスを見て:
次のコードを実行している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パフォーマンス
インスタンスメソッド呼び出しの "this"参照はどうなりますか?それはどこに行くの?それはどうやって渡されますか?このメソッドはどこかから取得する必要がありますか? –
基本的に、IncrementInstanceとIncrementStaticの両方が、MyPropertyプロパティのSetメソッドを呼び出します。インスタンスメソッドはインスタンスメモリを直接参照し、静的メソッドは引数として渡されたインスタンスを参照します。 –
奇妙なことに、私はあなたのコードをとり、私のマシンでそれを走らせました。あなたが同じ数の繰り返しを使用するとき、数字がお互いに飛び乗る。場合によってはインスタンスメソッドが勝利することもあります。私はタイマーが十分ではないので、イテレーションを20億(int.MaxValue)以上に設定しました。これでかなり安定した結果が得られました。インスタンスメソッドを使用する反復では46ナノ秒かかるため、拡張メソッドを使用する反復では45ナノ秒かかる。私は違いがナノ秒に基づいて何かを最適化しようとしています。 –
に少し日付が、良い記事では、これは、任意の大きな違いはありません。 this articleを参照してください。
私はテストの結果を確認して、スタティックバリアントにタイプがSample
のパラメータがある別のテストを行いました。私のシステムでは21億コールで11495ms(+/- 4ms)を要しました。記事によれば、これについて心配するべきではありません。
ここでの例とテストのほとんどは、メソッドのインライン展開が可能であるため無効です。 )もしメソッドが空であればコンパイラで特に簡単;)
(興味深いのは、私のシステムではテストが記事のものより遅いことに興味があります。正確に遅くはありませんが、64ビットOS )
- 1. 静的メソッドとインスタンスメソッド、マルチスレッド、パフォーマンス
- 2. 静的メソッドまたはインスタンスメソッドを.NETで拡張しますか?
- 3. 拡張メソッドと列挙
- 4. HttpClientとReadAsAsync ()拡張メソッド
- 5. LINQとCount拡張メソッド
- 6. IsOrderedBy拡張メソッド
- 7. ジェネリック拡張メソッド
- 8. 拡張メソッド - デコレータパターン
- 9. MVC拡張メソッド
- 10. 拡張メソッドは
- 11. 拡張メソッド
- 12. 拡張メソッドは
- 13. LINQの拡張メソッド - GetYearWeekFormat拡張
- 14. Rubyメソッドの拡張
- 15. 仮想拡張メソッド?
- 16. 拡張メソッドのパートタイムバグ
- 17. NhQueryable LINQ拡張メソッド?
- 18. スタティックオブジェクトの拡張メソッド
- 19. Dの拡張メソッド?
- 20. 静的拡張メソッド
- 21. ユニットテストの拡張メソッド
- 22. LINQの拡張メソッド
- 23. 変換クラスの拡張性(拡張メソッドとParitalクラス)
- 24. MVC 4と拡張メソッドとカミソリ
- 25. 拡張メソッド:あまりにも多く使用するとパフォーマンスの問題?
- 26. C#でparamsと拡張メソッドを使用
- 27. 拡張メソッドとローカル 'this'変数
- 28. .NET:ForEach()の拡張メソッドと辞書
- 29. PHPクラスの継承と拡張メソッド
- 30. プロトコル拡張インスタンスメソッドから静的VARを読む
両方の方法でコードを書いてください。ストップウォッチを入手してください。それからあなたは知っているでしょう。 –