据我所知,在不同的顺序执行操作将产生不同的性能,如下面的慢速查询之间的区别:这一个更快的使用LINQ时谓词的顺序是否重要?
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
LINQ到什么地步? – SLaks 2012-02-24 19:09:41
我在想LINQ to Objects,但是我想这个问题对于LINQ to SQL更重要。 – Brett 2012-02-24 19:11:02
虽然我不知道LINQ____,但如果它与其他短语语言一样,顺序很重要,因为如果要评估的表达式变成绝对正确或绝对错误,其余谓词可以安全地丢弃。例如,在表达式'(1 == 1 || x == 3)'中,'x == 3'永远不会被评估,因为不管结果如何,表达式都是真实的。一个类似的简单例子可能是'(1 == 0 && x == 3)',在'1 == 0'后面发现它是错误的,它只是退出,因为表达式不可能是真的。对不起,如果这不是你要找的! – prelic 2012-02-24 19:13:27