2013-02-12 89 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

有沒有差異。它會在同一時間產生相同的結果。它基本上是具有不同語法的相同代碼。