Утечка памяти при использовании таблиц данных - PullRequest
1 голос
/ 26 мая 2010

У меня есть ситуация, в которой я вынужден извлекать 30 000 записей в 2 таблицы данных. Мне нужно сделать некоторые манипуляции и вставить их в записи на сервере SQL в функции Manipulate (dt1, dt2). Я должен сделать это в 15 раз, как вы можете видеть в цикле for. Теперь я хочу знать, каким будет эффективный способ использования памяти. Я использовал первый подход. Пожалуйста, предложите мне лучший подход.

(1)

for (int i = 0; i < 15; i++)
{
  DataTable dt1 = GetInfo(i);
  DataTable dt2 = GetData(i);
  Manipulate(dt1,dt2);
}

(ИЛИ)

(2)

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
for (int i = 0; i < 15; i++)
{
  dt1=null;
  dt2=null;
  dt1 = GetInfo();
  dt2 = GetData();
  Manipulate(dt1, dt2);
}

Ответы [ 2 ]

1 голос
/ 26 мая 2010

Теоретически, первый пример более эффективен, потому что во втором примере вы начинаете с создания двух DataTable объектов, которые не будут использоваться. Однако эти два DataTable объекта содержат мало данных, поэтому накладные расходы на использование памяти минимальны и практически невозможно измерить.

Попытка оптимизировать этот пример для производительности кажется мне преждевременной оптимизацией , что, конечно, является плохой вещью . Сначала вы должны выбрать наиболее читаемое решение, и только когда оно слишком медленное, оптимизируйте его.

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

0 голосов
/ 26 мая 2010

Из кода, который вы показали, вызовы new DataTable() и операторы присваивания для обнуления dt1 и dt2 снова не имеют смысла.Единственная часть, которая вас интересует, это то, что возвращают GetInfo(i) и GetData(i).Вы выделяете пустые объекты DataTable, когда в этом нет необходимости.

Мне интересно, возможно ли в вашем случае немного переосмыслить свой дизайн.Когда вы работаете с 30 000 записей, нереально делать несколько операций с базой данных для каждой записи.Я часто обнаруживал, что наибольшее снижение производительности при операциях, ориентированных на базы данных, вызвано введением нескольких операторов выбора, когда я мог бы сделать это в одном операторе.Думая в терминах операций set или batch, можно ли сделать один или два вызова базы данных, чтобы получить обратно список элементов и выполнить итерацию по ним?Если вы устраняете проблему с производительностью, это было бы неплохо для начала.

Прежде чем приступить к внесению изменений, измерьте и проверьте, какая операция занимает больше всего времени, введя код синхронизации и отслеживая приложение, чтобы увидетьсколько памяти это на самом деле использует.Сосредоточьте свои усилия на оптимизации самой медленной части.Я надеюсь, что вы найдете это полезным =) Я не имею в виду, что это каким-либо образом покровительствует.

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