Странные результаты производительности при использовании словаря <> - PullRequest
4 голосов
/ 25 августа 2011

Похоже, что производительность Dictionary <,> зависит от размера хранимого элемента (что кажется странным).

Вот мой простой класс:

public class MyObject
{
    public Guid Key { get; set; }
}

И два простых теста:

private long _Iterations = 1000000;

[TestMethod]
public void ShouldTestDefaultConstructorPerformance()
{
    for (var i = 0; i < _Iterations; i++)
    {
        var obj = new MyObject() { Key = Guid.NewGuid() };
    }
}

[TestMethod]
public void ShouldTestDefaultGuidDictionaryPerformance()
{
    var dict = new Dictionary<Guid, MyObject>();
    for (var i = 0; i < _Iterations; i++)
    {
        var obj = new MyObject() { Key = Guid.NewGuid() };
        dict.Add(obj.Key, obj);
    }
}

Изначально я получаю следующее время:

ShouldTestDefaultConstructorPerformance    : 00:00:00.580
ShouldTestDefaultGuidDictionaryPerformance : 00:00:01.238

Теперь я изменю класс MyObject:

public class MyObject
{
    public Guid Key { get; set; }

    private Dictionary<string, string> _Property0 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property1 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property2 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property3 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property4 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property5 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property6 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property7 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property8 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property9 = new Dictionary<string, string>();
}

И снова запустить тесты:

ShouldTestDefaultConstructorPerformance    : 00:00:01.333
ShouldTestDefaultGuidDictionaryPerformance : 00:00:07.556

Во втором тесте построение объекта длится в 1,72 раза дольше, но добавление в словарь занимает в 6,11 раза дольше . Я ожидал, что тесты займут больше времени, но почему Словарь добавляет , чтобы намного дольше добавлять большие объекты?

Ответы [ 4 ]

1 голос
/ 25 августа 2011

Я думаю, что люди должны читать вопросы более внимательно, а не торопиться, чтобы опубликовать ответ. Если вы внимательно посмотрите на его пример кода (ОБА тесты), разница между наличием MyObject с Guid и MyObject с Guid и 10 Dict составляет менее секунды (конструкция объекта) для его цикла. Однако добавление словаря занимает не менее 5 секунд.

0 голосов
/ 25 августа 2011

Я думаю, что var obj = new MyObject() { Key = Guid.NewGuid() }; эта строка на самом деле занимает гораздо больше времени, а не Add() словаря.Вы делали измерения внутри предоставленными методами?

0 голосов
/ 25 августа 2011

Я думаю, что мой ответ будет таким: используйте профилировщик и определите, какой бит на самом деле занимает больше .

Это, вероятно, выдвинет на первый план экземпляр. Может быть:)

0 голосов
/ 25 августа 2011

Каждый объект, который вы добавляете в словарь, получает специальный уникальный идентификатор, чтобы ускорить его поиск и поиск в памяти.Этот специальный уникальный идентификатор (называемый хешем) вычисляется путем анализа всего содержимого объекта.Чем больше объект, тем медленнее будет вычисляться хеш.

Если вас интересуют тонкие детали его работы, посмотрите этот пример из университетского курса: http://www.ccs.neu.edu/home/sbratus/com1101/hash-dict.html

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