вопрос производительности кода - PullRequest
0 голосов
/ 02 июня 2011

Допустим, у меня есть относительно большой список объекта MyObjectModel с именем MyBigList. Одним из свойств MyObjectModel является int, называемое ObjectID. Теоретически, я думаю, что MyBigList может достигать 15-20 МБ в размере. У меня также есть таблица в моей базе данных, в которой хранятся некоторые скаляры об этом списке, чтобы его можно было перекомпоновать позже.

Что будет более эффективным?

Вариант A:

   List<MyObjectModel> MyBigList = null;

   MyBigList = GetBigList(some parameters);

   int RowID = PutScalarsInDB(MyBigList);

Вариант B:

   List<MyObjectModel> MyBigList = null;

   MyBigList = GetBigList(some parameters);

   int TheCount = MyBigList.Count();

   StringBuilder ListOfObjectID = null;

   foreach (MyObjectModel ThisObject in MyBigList)
   {
      ListOfObjectID.Append(ThisObject.ObjectID.ToString());
   }

   int RowID = PutScalarsInDB ( TheCount, ListOfObjectID);

В варианте A я передаю MyBigList функции, которая извлекает скаляры из списка, сохраняет их в БД и возвращает строку, в которой были сделаны эти записи. В варианте B я сохраняю MyBigList в методе page, где я делаю извлечение скаляров, и просто передаю их в функцию PutScalarsInDB.

Какой вариант лучше, и может быть, еще один лучше? Я беспокоюсь о передаче объектов такого размера и использования памяти .

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

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

  • Получить список
  • Итерация по списку для получения идентификаторов
  • Итерация по списку для обновления базы данных

Порядок, в котором происходят эти три действия, и то, происходят ли они в рамках одного метода или подпрограммы, не имеет значения.Все остальные действия (объявление переменных, присвоение результатов и т. Д.) Имеют нулевое или незначительное влияние на производительность.

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

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

Тогда дайте нам знать ваши результаты!

0 голосов
/ 02 июня 2011

Если вы хотите узнать, какой метод обладает большей производительностью, вы можете использовать класс секундомера, чтобы проверить время, необходимое для каждого метода. см. здесь для использования секундомера: http://www.dotnetperls.com/stopwatch

Я думаю, что есть другие проблемы для приложения asp.net, которые вы должны проверить:

  1. Откуда ты читаешь твой список? если вы прочитаете его из базы данных, будет ли эффективнее выполнять вашу работу в базе данных в рамках хранимой процедуры.
  2. Где это хранится? Это только чтение и уничтожение или это сохраняется в сеансе или приложении?
...