編集:私はジェネリックタイプのインスタンスのルックアップは、ジェネリックタイプの作成実行時に私のハーネスのものは、コンパイラがアクセス可能なので、コンパイラはアドレスの参照にコンパイルすることができます。私はまだかなりの興味を持っています.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;
}
実行時にtypeof(Lookup <>)を使用すると、どのように動作するのですか?(試してみました) – mcintyre321
私はそれを持っていると思っています。しかし、私はsloooowである私のタイプの反射を使わずに.oに行く方法がありません。 .oにアクセスするには、コンパイラにジェネリックタイプを伝えなければなりません。 – mcintyre321