【问题标题】:code performance question代码性能问题
【发布时间】:2011-09-07 08:12:54
【问题描述】:

假设我有一个相对较大的对象MyObjectModel 列表,名为MyBigListMyObjectModel 的属性之一是名为 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 传递给一个函数,该函数从列表中提取标量,将它们存储在数据库中并返回创建这些条目的行。在选项 B 中,我将 MyBigList 保留在我提取标量的页面方法中,然后将它们传递给 PutScalarsInDB 函数。

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

【问题讨论】:

  • 对于每种情况,方法 PutScalarsInDB 内部会发生什么?您是在问哪种方法提取标量是否会有所不同?
  • @both,它在数据库中创建一行,存储 1) 包含列表中 ObjectID 列表的字符串,2) 列表中对象的数量,3) 包含在生成列表的查询中使用的参数,4) 用户 ID。创建行后,它会返回该行。
  • 据我了解,这两种技术的结果相同。唯一的区别在于你在哪里工作。如果是这种情况,那么运行时将不会有可检测的差异。两者都不比另一个“更有效”。你如何编码是一个风格问题,而不是运行时性能问题。

标签: c# asp.net performance large-data-volumes


【解决方案1】:

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

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

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

在其他条件相同的情况下,您的第一个选项的性能可能会稍高一些,因为我假设您只会迭代一次,在一次通过中提取 ID 和更新数据库。但与更新数据库的成本相比,迭代成本可能非常小,因此您可能不会注意到性能差异。

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

那就让我们知道你的结果吧!

【讨论】:

  • 好的,我将添加一个秒表和测试时间。记忆方面的后果如何?我正在传递一个大小可能为 15MB 的对象。
  • 你指的是哪个对象?传递 MyBigList 不是问题 - 无论您在函数之间传递多少次,它都只会在内存中存在一个副本。
  • 对,所以复制它不会增加内存使用吗?
  • 只有指针被“传递”,而不是数据本身,所以列表的大小不会影响性能。 影响性能的是您最终提交给数据库的字符串的大小。如果 that 字符串的长度为 15MB,则更新数据库会很慢。但同样,无论您选择提供的代码示例中的哪一个,您都会遇到这个问题。
  • 如果我的上一个回答澄清了您的上一个问题,请告诉我。将对象传递给方法并不会复制该对象;因此,它不会对性能产生任何影响。
【解决方案2】:

如果您想知道哪种方法的性能更高,您可以使用秒表类来检查每种方法所需的时间。秒表用法见这里:http://www.dotnetperls.com/stopwatch

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

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

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2012-04-09
    • 1970-01-01
    • 2013-10-16
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多