Простой базовый вопрос - PullRequest
0 голосов
/ 23 апреля 2011

Извините, что задал такой простой вопрос, но хотел прояснить концепцию.

Ниже приведен мой код, в котором я создаю словарь внутри для цикла

if(condition)
{
  // some code here
  for(int i=0; i<length; i++)
  {
    Dictionary<string, string> parameter = new Dictionary<string, string>();
    parameter.Add("ServiceTypeID", "1");
    parameter.Add("Description", "disc");
  }
}

вместо создания словарного объекта каждый раз, когда я должен создавать словарный объект перед циклом for и применять метод clear к объекту словаря, например

if(condition)
{
  Dictionary<string, string> parameter = new Dictionary<string, string>();
  // some code here
  for(int i=0; i<length; i++)
  {
    parameter.clear();
    parameter.Add("ServiceTypeID", "1");
    parameter.Add("Description", "disc");
  }
}

Из этих двух вариантов, какой будет лучше для производительности.

Спасибо, ноль

Ответы [ 3 ]

2 голосов
/ 23 апреля 2011

В большинстве практических сценариев разница близка к нулю.

Можно подумать, что очистка структуры данных происходит быстрее, чем инициализация пустой. Это не всегда так. Обратите внимание, что в современных языках (C #, Java) диспетчер памяти оптимизирован для выделения множества небольших объектов (это связано с тем, как работают сборщики мусора). В C ++ из-за отсутствия GC менеджер памяти настроен на выделение нескольких больших объектов. Таким образом, восстановление словаря внутри цикла сопоставимо (с точки зрения производительности) с его очисткой.

Кроме того, clear () не обязательно освобождает всю выделенную память. Может случиться так, что он только сбрасывает некоторые указатели / индексы. Поэтому, если вы используете clear (), ваш словарь может по-прежнему занимать большие куски памяти, что может замедлить работу других частей вашего кода.

Итог: не беспокойтесь об этом, если профилировщик не скажет вам, что это узкое место вашей программы.

0 голосов
/ 23 апреля 2011

В двух словах о производительности, очевидно, что второй цикл лучше, потому что вы создаете только один объект, а затем в цикле добавляете элементы.

Однако в первом цикле переменная параметра бесполезна, поскольку в конце for она больше не существует ...

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

0 голосов
/ 23 апреля 2011

Если оба эти решения работают для вас, вы должны запомнить два пункта:

  • первый создает объект словаря в каждом цикле, поэтому его скорость ниже из-за выделения памяти в каждом цикле
  • второй быстрее. но сохраняет объект Dictionary больше времени, поэтому память будет заполнена, если GC не предпримет никаких действий с ним! (GC удаляет его после окончания области видимости), поэтому в длинных блоках кода отнимает используемую память на большее время!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...