производительность IDictionary <Type, object> против универсального свойства Type - PullRequest
3 голосов
/ 25 ноября 2010

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;
}

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

JIT-компилятор знает адрес статической переменной o.Выделил его в кучу загрузчика.То, что он является членом универсального класса, не имеет значения.Другими словами, разрешение адреса статической переменной не требует поиска во время выполнения, это делается во время компиляции.Сгенерированный машинный код тривиален:

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

Обратите внимание на жестко закодированные адреса.

2 голосов
/ 25 ноября 2010

Я думаю, что сопоставления с вашими шаблонами создаются во время компиляции, тогда как словарь выполняет поиск во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...