edit : Я основывал этот вопрос на ложном предположении - что поиск экземпляров универсального типа, который я выполнял, был бы такой же работой, как и при работе с универсальными типами, созданными во время выполнения.Те, что в моем жгуте, доступны для компилятора, поэтому он может скомпилировать их в поиск адресов.Я все еще очень заинтересован в том, что .MakeGenericType делает за кулисами.
Я только что сделал быстрое сравнение между получением значения из 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;
}