我明白在不同的顺序执行操作会产生不同的性能,比如以下慢查询之间的差异:
List<TestItem> slowResults = items.OrderBy(item => item.StringItem)
.Where(item => item.IntItem == 100)
.ToList();
还有这个更快的:
List<TestItem> fastResults = items.Where(item => item.IntItem == 100)
.OrderBy(item => item.StringItem)
.ToList();
但那不是我的问题:
我的问题是关于短路计算与LINQ谓词的性能相关的。当我使用Where子句时,就像在这个例子中:
List<TestItem> results = items.Where(item => item.Item1 == 12 &&
item.Item2 != null &&
item.Item2.SubItem == 65 &&
item.Item3.Equals(anotherThingy))
.ToList();
参数的顺序有影响吗?例如,我会认为首先执行.Equals将导致查询总体变慢,因为Item1 == 12整数评估是更快的操作?
如果顺序很重要,它有多重要?当然,调用类似.Equals的方法可能会比仅比较几个整数导致更大的减速,但与LINQ操作的“缓慢”相比,它是否是一个相对较小的性能损失?由于LINQ进行了大量的方法调用,像.Equals这样的东西真的会很重要吗?除非被覆盖,否则它将执行本机框架代码,是吗?另一方面,标准的MSIL方法调用会慢得多吗?
此外,此查询上是否有任何其他编译器优化可能使其在幕后加速?
感谢您的想法和澄清! Brett
(1 == 1 || x == 3)
中,x==3
永远不会被评估,因为无论结果如何,表达式都将为真。类似的简单示例可能是(1==0 && x == 3)
,在发现1==0
为假后,它就会停止执行,因为表达式不可能为真。如果这不是您想要的内容,对不起! - prelic