- 有没有一种好的方法来“调整”或优化这些表达式? - 人们使用哪些基本指标以及如何收集它们? - 是否有一种方法可以获取“总迭代次数”或其他指标,从而可以“知道”较低的意味着更好?
编辑:
感谢Richard / Jon的答案。
看起来我真正想要的是一种获得LINQ表达式的简单操作计数“OCount”的方法,但我不确定LINQ中是否存在这样的钩子。假设我有一个特定机器硬件的目标性能级别(SLA)。理想情况下,我将添加一个单元测试,以确认通过该查询移动的典型数据将在分配的时间范围内(从SLA)处理(接近SLA)。问题在于,这将在构建服务器/开发者机器等上运行,这些机器可能与SLA的目标机器硬件差异很大。因此,我的想法是,我将确定表达式的可接受最大“OCount”,如果OCount小于X,则在目标“典型”硬件上肯定会提供可接受的性能。如果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的答案。