LINQ在编译器级别执行什么类型的优化?

时间:2010-09-10 06:56:17

标签: linq performance

既然LINQ是.NET不可或缺的一部分,那么它们在编译器级别的优化会使用最佳路径来获得结果吗?

例如,假设您有一个整数数组,并希望获得最低值。您可以使用foreach在没有LINQ的情况下执行此操作,但在LINQ中使用Min函数肯定更容易。一旦使用LINQ进入编译器,你最好完全跳过LINQ,还是只是将它转换为类似foreach的东西?

1 个答案:

答案 0 :(得分:2)

C#编译器根本没用 - 它只是调用你告诉它的方法,基本上。

您可能会认为删除不必要的Select调用是一种优化:

from x in collection
where x.Condition
select x
由于编译器将身份转换视为冗余,因此

编译为collection.Where(x => x.Condition)而不是collection.Where(x => x.Condition).Select(x => x)。 (对from x in collection select x形式的简并查询不受此优化的影响,但是,允许LINQ提供程序确保任何查询至少经过一个的方法。)

LINQ to Objects Min 方法只是做了一个foreach,是的。各种LINQ to Objects方法执行执行优化。例如,Count()将检查数据源是否实现ICollectionICollection<T>,如果是,则使用Count属性。正如madgnome在评论中指出的那样,我在blog post前写了一些关于此的内容。

当然,其他LINQ提供程序可以执行自己的优化。