2010-05-26 2 views
1

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

(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); 
} 
+0

Что делают 'GetInfo' и' GetData'? В '1' они принимают' i' в качестве аргумента, в '2' они этого не делают. – Oded

ответ

1

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

Попытка оптимизировать этот пример для исполнения, мне кажется premature optimization, что, конечно же, является bad thing. Сначала вы должны найти наиболее читаемое решение, и только когда оно будет слишком медленным, оптимизируйте его.

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

0

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

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

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

Смежные вопросы