既然LINQ是.NET的重要組成部分,那麼他們在編譯器級別上的優化是否會使用最佳路徑來獲取結果呢?LINQ在編譯器級別執行什麼類型的優化?
例如,假設您有一個整數數組並且想要獲得最低值。你可以在不使用LINQ的情況下使用foreach來做到這一點,但是在LINQ中使用Min函數肯定更容易。一旦使用LINQ編譯這個代碼,你最好完全跳過LINQ,還是把它轉換成類似於foreach的東西?
既然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