【问题标题】:Performance: Iterate linq VS iterate datatable性能:迭代 linq VS 迭代数据表
【发布时间】:2021-11-06 09:23:59
【问题描述】:

一般文化问题:

在相对较小的记录集(例如 5000 条记录)中,迭代 Linq 对象或数据表会更加优化。

linq 示例:

var _rows_ref_carga = from _row in list_cargas
                 where ref_carga == "XXXXX"
                 select _row;
                 

foreach (var _r in _rows_ref_carga)   {
   OTHER OPERATION
}

数据表示例:

 foreach (DataRow _r in _datatable.Rows)   {
       OTHER OPERATION
    }

我的问题是:迭代“_rows_ref_carga”比迭代“_datatable.Rows”效率更高???

谢谢。

【问题讨论】:

  • 您进行过性能测试吗?
  • 还没有,我正在完成一门 Linq 课程,但我对迭代一组寄存器的性能表示怀疑,以后我必须在这些寄存器上执行其他操作。我在征求具有 Linq 经验的程序员的意见。 (无论如何我会自己做性能测试)谢谢
  • 比什么更优化? LINQ 可以在数据表上使用,因此不清楚您在此处讨论的 LINQ 部分是什么后端。 DataTable 很少是任何性能问题的答案。如果您正在谈论将数据在内存中保存一段合理的时间(不是每次操作都获取它),那么是的,这可能会有所帮助,但可能通过List<T>?
  • @MarcGravell:我目前正在处理一个使用 DataTables 的项目,并且执行的操作的性能很好(所有对数据的操作都是使用 DataTables 执行的)。 List 是我们正在引入的一个选项,但大多数代码都是遗留的,如果可以使用 Linq 改进它,我将推动它在任何新的相关开发中使用。谢谢
  • @raBinn 你误会我了; LINQ 是一种方法,而不是特定的东西。 “with LINQ”有十几种解释。 究竟你想在这里比较什么?更重要的是:您是否简单地测量了它们?

标签: c# performance winforms


【解决方案1】:

通过编辑,您看起来像是在比较数据表上的 LINQ-to-Objects 和数据表上的 foreach(使用 Where 与 if)。使用基准测试工具(例如 benchmarkdotnet)与您的实际数据进行调查将是一件很棒的事情。其他需要考虑的事项:

  • 您预计有多少匹配?如果是 1,字典会更好吗?还是 ToLookup? (假设数据不会不断变化)
  • List-T 的开销会更少吗?

但是!是的,LINQ-To-Objects 增加了一层抽象和间接,这意味着:开销。通常这种开销并不重要,代码的清晰性是值得的。如果有问题的代码对性能至关重要,那么foreachif 通常会更快,但只有一点点。更相关的因素通常是:

  1. 能否改进底层存储? (因此我提到了列表、字典、查找)和
  2. 你能改进其他操作吗,这通常是主要的时间;如果迭代只是成本的 0.1%无论如何,那么改进它并不能很好地利用您的时间

【讨论】:

  • 非常感谢您的解释,它很清楚。无论如何,我将使用真实数据进行测试,看看我得到了什么结果。非常感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多