2013-02-12 84 views
3

假设有一个内存列表上运行两个查询;性能比较呼吁

首先查询(采用扩展方法):

var temp = listX.Where(q => q.SomeProperty == someValue);

第二个查询:

var temp = from o in listX 
       where o.SomeProperty == someValue 
       select o; 

有没有在性能方面两个查询之间的差;如果有,为什么?

+0

你为什么不试试自己? – 2013-02-12 14:43:45

+0

我可能会尝试,但隔离是一个问题(虽然我可能只是检查装配输出)。如果两者之间存在细微的差异,则仅通过创建样本来尝试它可能无效。 – daryal 2013-02-12 14:47:05

回答

8

没有,在所有没有区别。编译器在内部将第二个版本转换为第一个版本。

的C#规范(§7.6.12)规定:

C#语言没有指定查询表达式 的执行语义。相反,查询表达式被转换为坚持查询表达式模式(§7.16.3)的方法的调用 。 具体来说,查询表达式被翻译成GroupBy 方法命名WhereSelectSelectManyJoinGroupJoinOrderByOrderByDescendingThenByThenByDescending,调用,预计Cast。这些 方法有特定的签名和结果类型,如§7.16.3中所述的 。这些方法可以被查询的 物体或扩展方法是外部 对象的实例方法,它们实现查询的实际执行。

从查询表达式到方法调用翻译是已经执行了任何类型 绑定或重载分辨率之前发生的一个 句法映射。翻译是保证 语法正确的,但不能保证产生 语义正确的C#代码。在翻译查询 表达式后,生成的方法调用将作为常规 方法调用进行处理,而这可能会反过来发现错误,例如 (如果方法不存在,参数的类型错误或者方法是通用的并且类型推断失败。

+1

+1,第二个选项将被编译为第一个选项,在使用LINQPad时很容易看到。 – 2013-02-12 14:42:25

+0

@Jon所以我可以假设使用扩展方法根本不会增加任何开销? – daryal 2013-02-12 14:43:09

+0

@daryal:当然。 – Jon 2013-02-12 14:45:09

4

有没有差异。它会在同一时间产生相同的结果。它基本上是具有不同语法的相同代码。