gpt4 book ai didi

linq - 优化 "tune"LINQ 表达式的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 17:55:43 27 4
gpt4 key购买 nike

构建 LINQ 表达式(对我来说,是 linq to object)时,有很多方法可以完成某件事,其中一些方法比其他方法更好、更高效。

  • 有没有好的方法来“调整”或优化这些表达式?
  • 人们采用哪些基本指标?您如何收集这些指标?
  • 有没有办法获得“总迭代次数”计数或其他一些指标,让您“知道”越低越好?

编辑

感谢理查德/乔恩的回答。

我真正想要的是一种为 LINQ 表达式获取简单操作计数“OCount”的方法,尽管我不确定 LINQ 中是否存在允许这样做的钩子(Hook)。假设我有特定机器硬件的目标性能水平(SLA)。理想情况下,我会添加一个单元测试来确认通过该查询移动的典型数据将在指定的时间内(来自 SLA)进行处理。问题是这将在构建服务器/开发人员机器/等上运行。这可能与 SLA 的机器硬件没有什么相似之处。因此,我的想法是,我会确定表达式的可接受的最大“OCount”,因为知道如果 OCount 小于 X,则它肯定会在目标“典型”硬件上的 SLA 下提供可接受的性能。如果 OCount 超过此阈值,构建/单元测试将生成警告。理想情况下,我想要这样的东西(伪代码):

var results = [big linq expression run against test dataset];
Assert.IsLess(MAXALLOWABLE_OCOUNT, results.OCount)

其中 results.OCount 只会给出生成结果集所需的总迭代次数 (n)。

为什么我会喜欢这个?

即使对于中等大小的 LINQ 表达式,小的更改/添加也会因增加总体操作计数而对性能产生巨大影响。应用程序代码仍然会通过所有单元测试,因为它仍然会产生正确的结果,但部署时运行速度非常慢。

另一个原因是为了简单的学习。如果你做了某件事并且 OCount 上升或下降了一个数量级,那么你就学到了一些东西。

编辑#2我也会提出一个可能的答案。这不是我的,它来自Cameron MacFarland我问的另一个问题催生了这个问题。事实证明,我认为这个问题的答案可以在单元测试环境中工作,就像我在这个问题的第一次编辑中描述的那样。

其本质是在单元测试装置中创建测试数据集,您可以按照本答案中概述的方式将其输入到 LINQ 表达式中,然后将迭代计数相加并与最大允许迭代计数进行比较。

参见Cameron's answer here

最佳答案

您基本上需要计算出复杂性函数。这取决于运算符(operator),但不幸的是,这往往没有很好的记录。

(对于一般原则,我同意 Richard 的回答 - 这只是 LINQ to Objects 的东西。)

如果您对特定的运算符感兴趣,那么值得询问它们,但这是我的想法:

  • 选择 = O(n)
  • 其中 = O(n)
  • Join = O(inner +outer + matches)(即,它并不比 inner +outer 便宜,但可能与 inner *outer 一样糟糕,具体取决于结果)
  • GroupJoin = 与 Join 相同,但缓冲而不是通过外部流式传输
  • 排序依据 = O(n log n)
  • SelectMany = O(n + 结果)
  • Count = O(1) 或 O(n),具体取决于它是否实现 IList
  • 计数(谓词)= O(n)
  • 最大/最小 = O(n)
  • 全部/任意 = O(n)(可能提前退出)
  • 不同 = O(n)
  • 跳过/继续 = O(n)
  • SkipWhile/TakeWhile = O(n)

确切的特征取决于操作符是缓冲还是流。

关于linq - 优化 "tune"LINQ 表达式的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/658506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com