假設有一個內存列表上運行兩個查詢;性能比較呼籲
首先查詢(採用擴展方法):
var temp = listX.Where(q => q.SomeProperty == someValue);
第二個查詢:
var temp = from o in listX
where o.SomeProperty == someValue
select o;
有沒有在性能方面兩個查詢之間的差;如果有,爲什麼?
假設有一個內存列表上運行兩個查詢;性能比較呼籲
首先查詢(採用擴展方法):
var temp = listX.Where(q => q.SomeProperty == someValue);
第二個查詢:
var temp = from o in listX
where o.SomeProperty == someValue
select o;
有沒有在性能方面兩個查詢之間的差;如果有,爲什麼?
沒有,在所有沒有區別。編譯器在內部將第二個版本轉換爲第一個版本。
的C#規範(§7.6.12)規定:
C#語言沒有指定查詢表達式 的執行語義。相反,查詢表達式被轉換爲堅持查詢表達式模式(§7.16.3)的方法的調用 。 具體來說,查詢表達式被翻譯成
GroupBy
方法命名Where
,Select
,SelectMany
,Join
,GroupJoin
,OrderBy
,OrderByDescending
,ThenBy
,ThenByDescending
,調用,預計Cast
。這些 方法有特定的簽名和結果類型,如§7.16.3中所述的 。這些方法可以被查詢的 物體或擴展方法是外部 對象的實例方法,它們實現查詢的實際執行。從查詢表達式到方法調用翻譯是已經執行了任何類型 綁定或重載分辨率之前發生的一個 句法映射。翻譯是保證 語法正確的,但不能保證產生 語義正確的C#代碼。在翻譯查詢 表達式後,生成的方法調用將作爲常規 方法調用進行處理,而這可能會反過來發現錯誤,例如 (如果方法不存在,參數的類型錯誤或者方法是通用的並且類型推斷失敗。
有沒有差異。它會在同一時間產生相同的結果。它基本上是具有不同語法的相同代碼。
你爲什麼不試試自己? – 2013-02-12 14:43:45
我可能會嘗試,但隔離是一個問題(雖然我可能只是檢查裝配輸出)。如果兩者之間存在細微的差異,則僅通過創建樣本來嘗試它可能無效。 – daryal 2013-02-12 14:47:05