изменить: я основал этот вопрос на ложном предположении, что поиск экземпляров универсального типа, который я выполнял, будет выполнять ту же работу, что и при выполнении для универсальных типов, созданных во время выполнения. Те, что есть в моей системе, доступны для компилятора, поэтому он может скомпилировать их для поиска адресов. Мне все еще очень интересно, что .MakeGenericType делает за кулисами.
Я только что провел быстрое сравнение между получением значения из IDictionary и получением значения из универсального типа со статическим свойством.
Результаты для 100000000 поисковых запросов:
Словарь: 14.5246952 Общий тип: 00.2513280
Какую магию использует .NET в фоновом режиме, чтобы так быстро сопоставить экземпляр Generic? Я бы подумал, что для поиска нужно использовать что-то похожее на хеш-таблицу. Может быть, это становится JITTED ... Я не знаю! Ты?
Вот мой тестовый комплект — я уверен, что он полон ошибок, так что дайте мне знать, что нужно исправить!
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;
}