LINQ在编译器级别执行什么类型的优化?
问题描述:
既然LINQ是.NET的重要组成部分,那么他们在编译器级别上的优化是否会使用最佳路径来获取结果呢?LINQ在编译器级别执行什么类型的优化?
例如,假设您有一个整数数组并且想要获得最低值。你可以在不使用LINQ的情况下使用foreach来做到这一点,但是在LINQ中使用Min函数肯定更容易。一旦使用LINQ编译这个代码,你最好完全跳过LINQ,还是把它转换成类似于foreach的东西?
答
C#编译器根本就没有做太多工作 - 它只是调用你告诉它的方法。
你可以说,去除不必要的选择调用是一个优化:
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到对象Min
方法只是做一个foreach,是的。各种LINQ to Objects方法do执行优化。例如,Count()
将检查数据源是否实现ICollection
或ICollection<T>
,如果是,则使用Count
属性。正如madgnome在评论中指出的,前一段我在blog post中写了更多关于这方面的内容。
当然,其他LINQ提供者可以执行自己的优化。
乔恩斯威特在他的博客上写了一篇关于那个(有点)的文章:http://msmvps.com/blogs/jon_skeet/archive/2010/02/10/optimisations-in-linq-to-objects.aspx – 2010-09-10 06:59:17