2012-04-16 6 views
12

は、次のコードを考えてみましょう、一般的なシーケンスの作成者に新しい()制約を使用するよりも速くRELEASEのための私のテストでは...そんなに

をのFunc <>を使用しているのはなぜ(デバッグではない!)のx86での構築

CreateSequence() with new() took 00:00:00.9158071 
CreateSequence() with creator() took 00:00:00.1383482 

CreateSequence() with new() took 00:00:00.9198317 
CreateSequence() with creator() took 00:00:00.1372920 

CreateSequence() with new() took 00:00:00.9340462 
CreateSequence() with creator() took 00:00:00.1447375 

CreateSequence() with new() took 00:00:00.9344077 
CreateSequence() with creator() took 00:00:00.1365162 

新しいオブジェクトを作成するために、デリゲートを定義するためのFunc <>を使用すると6倍以上速く「新しいTを呼び出すよりもあると思われます。Windows 7のx64 PC(インテルi7の3GHzのは)私は、次のような結果を得ました()" 直接。

これは少し予期せず...ジッタによって行われたインライン化のためだと思いますが、「新しいT()」を最適化できると思っていました。

誰でも説明がありますか?

多分私は間違いをしています。 (ガベージコレクタの影響を考慮しましたが、コードを並べ替えてGC.Collect()などを追加しても結果は大幅に変更されません)。

とにかく、ここでのコードは次のとおりです。

+10

https://msmvps.com/blogs/jon_skeet/archive/2011/08/22/optimization-and-generics-part-1-the-new-constraint.aspx –

+0

関連:http:// stackoverflowを参照してください。 com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-when-calling-new-in – nawfal

答えて

13

new()制約のみに渡されたタイプは、パラメータなしのコンストラクタを持っていることを保証します。あなたが実際にnew T()(または任意のあなたのタイプの引数の名前です)を呼び出した場合、それは実際にこれを行います。その中核に、リフレクションを使用し、

Activator.CreateInstance<T>(); 

+1

ありがとう(そしてJonも興味深い記事のため)。非常に高速なコードが必要なときにはnew()制約を避け、代わりに "Func <> creator"アプローチを使用するように思われます! –

+1

@MatthewWatson:それは、私はそれがある理由として –

+1

をお勧めしたいものです見http://stackoverflow.com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-when-呼び出し元の新機能 – nawfal