代码性能问题
本文关键字:问题 性能 代码 | 更新日期: 2023-09-27 17:58:12
假设我有一个名为MyBigList
的对象MyObjectModel
的相对较大的列表。MyObjectModel
的一个性质是一个称为ObjectID
的int
。理论上,我认为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应用程序还有其他问题需要验证:
- 从哪里读你的清单?如果您从数据库中读取它,那么在存储过程中的数据库中进行工作会更高效吗
- 它存放在哪里?它是只读取并销毁的,还是存储在会话或应用程序中