代码性能问题

本文关键字:问题 性能 代码 | 更新日期: 2023-09-27 17:58:12

假设我有一个名为MyBigList的对象MyObjectModel的相对较大的列表。MyObjectModel的一个性质是一个称为ObjectIDint。理论上,我认为MyBigList的大小可以达到15-20MB。我的数据库中还有一个表,它存储了这个列表的一些标量,以便以后可以重新组合。

什么会更有效率?

选项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传递给一个函数,该函数从列表中提取标量,将其存储在DB中,并返回生成这些条目的行。在选项B中,我将MyBigList保留在page方法中,在该方法中提取标量,然后将其传递给PutScalarsInDB函数。

什么是更好的选择,可能是另一个更好?我担心传递这种大小的对象和内存使用情况

代码性能问题

我认为您不会看到这两种方法之间有实质性的区别。从你的描述来看,无论哪种方式,听起来你都会消耗相同的CPU周期。重要的是:

  • 获取列表
  • 遍历列表以获取ID
  • 遍历列表以更新数据库

这三个活动发生的顺序,以及它们发生在单个方法还是子例程中,都无关紧要。所有其他活动(声明变量、分配结果等)对性能的影响为零到可以忽略不计。

在其他条件相同的情况下,你的第一个选项可能会稍微更具性能,因为我认为你只会迭代一次,一次提取ID和更新数据库。但与更新数据库的成本相比,迭代的成本可能非常小,所以你可能不会注意到这是一个性能差异。

话虽如此,还有很多很多因素可能会影响性能,例如您正在迭代的列表类型、连接到数据库的速度等,这些因素可能会使这些其他因素相形见绌。无论哪种方式,它看起来都不像太多代码。我强烈建议同时构建和测试它们。

然后让我们知道你的结果!

如果您想知道哪种方法的性能更高,可以使用秒表类来检查每个方法所需的时间。有关秒表的用法,请参阅此处:http://www.dotnetperls.com/stopwatch

我认为asp.net应用程序还有其他问题需要验证:

  1. 从哪里读你的清单?如果您从数据库中读取它,那么在存储过程中的数据库中进行工作会更高效吗
  2. 它存放在哪里?它是只读取并销毁的,还是存储在会话或应用程序中