2010-11-25 7 views
3

編集:私はジェネリックタイプのインスタンスのルックアップは、ジェネリックタイプの作成実行時に私のハーネスのものは、コンパイラがアクセス可能なので、コンパイラはアドレスの参照にコンパイルすることができます。私はまだかなりの興味を持っています.MakeGenericTypeはバックグラウンドの背後にあります。IDictionaryのパフォーマンス<タイプ、オブジェクト> vジェネリックタイプのプロパティ

IDictionaryから値を取得し、静的プロパティを持つジェネリック型から値を取得することを簡単に比較しました。 100000000件の検索のための

結果:

辞書:14.5246952 ジェネリックタイプ:00.2513280

.NETこんなに早くジェネリックのインスタンスにマッピングするために、バックグラウンドで使用している魔法のどのような?私は、ハッシュテーブルに似た何かがルックアップに使われなければならないと考えていたでしょう。たぶんそれはうんざりする...私は知らない!あなたは?

ここに私のテストハーネスがあります。間違いがたくさんあるので、修正が必要なことを教えてください!

void Main() 
{ 
    var sw = new Stopwatch(); 
    var d = new Dictionary<Type, object>() 
    { 
    { typeof(string), new object() }, 
    { typeof(int), new object() } 

    }; 
    var stringType = typeof(string); 
    var intType = typeof(int); 
    sw.Start(); 
    for (var i = 0; i < 100000000; i++) 
    { 
     Debug.Assert(d[stringType] != d[intType]); 
    } 
    sw.Stop(); 
    sw.Elapsed.Dump(); 
    sw.Reset(); 

    Lookup<string>.o = new object(); 
    Lookup<int>.o = new object(); 
    sw.Start(); 
    for (var i = 0; i < 100000000; i++) 
    { 
     Debug.Assert(Lookup<string>.o != Lookup<int>.o); 
    } 
    sw.Stop(); 
    sw.Elapsed.Dump(); 
} 

class Lookup<T> 
{ 
    public static object o; 
} 

答えて

2

あなたのジェネリックへのマッピングはコンパイル時に行われますが、辞書は実行時にルックアップを実行するのに対し、

+0

実行時にtypeof(Lookup <>)を使用すると、どのように動作するのですか?(試してみました) – mcintyre321

+0

私はそれを持っていると思っています。しかし、私はsloooowである私のタイプの反射を使わずに.oに行く方法がありません。 .oにアクセスするには、コンパイラにジェネリックタイプを伝えなければなりません。 – mcintyre321

4

JITコンパイラは、静的変数のアドレスを認識します。これは、ローダーヒープでそれを割り当てました。ジェネリッククラスのメンバであることは関係ありません。言い換えれば、静的変数のアドレスを解決するには、実行時ルックアップは必要ありません。コンパイル時に実行されます。生成されたマシンコードは簡単です:

000000f8 mov   eax,dword ptr ds:[02785D0Ch] 
000000fd cmp   eax,dword ptr ds:[02785D10h] 

ハードコードされたアドレスに注意してください。

関連する問題