c# - parameter - wpf lambda expression




在.Net中LINQ和Lambda表達的效率和性能是什麼? (4)

我使用.Net 3.5和VS 2008一個多月了。 像大多數.Net開發人員一樣,我已經從.Net 1.0&2.0和VS 2005的多年經驗發展而來。就在最近,我發現了LINQ和Lambda表達式的簡單性和強大功能,就像我最近的問題一樣,例如在列表中查找項目LINQ使用Lambda或LINQ 類實例轉換或映射到另一個實例的列表 ,並使用Lambda或LINQ 將類列表轉換或映射到另一個類列表

我承認Lambda和LINQ更簡單易讀,看起來非常強大。 在幕後,.Net編譯器必須生成大量代碼才能實現這些功能。 因此,我有點猶豫是否要切換到新語法,因為我已經知道實現相同結果的“舊”方法。

我的問題是關於Lambda和LINQ的效率和性能。 也許Lambda表達式大多是內聯函數,在這種情況下我猜Lambda應該沒問題。 LINQ怎麼樣?

讓我們將討論限制為LINQ-to-Objects LINQ-to-SQL(LINQ-to-SQL)。 任何評論,比較和經驗?


LINQ查詢和Lambda表達式之間沒有性能差異。

在研究性能問題之前,您應該完全理解LINQ功能(Lambda,LINQ查詢)如何在.Net中工作。

基本上,您可以使用LINQ查詢和Lambda表達式中的任何一個。

LINQ查詢

  1. 它是高級可讀查詢。

  2. 它被轉換為等價的Lambda表達式,並將Lambda表達式作為節點添加到表達式樹中。 表達樹,它構成了lambda表達式的結構。 這是由編譯器完成的。

  3. 查詢提供程序查看表達式(在表達式樹中添加為節點)並生成等價的SQL查詢運算符,從而在運行時形成等價的sql查詢。

  4. 返回類型:結果集(IEnumerable)。

Lambda表達式

  1. 它是一組表達式/語句,並創建委託/表達式樹。 它可以作為參數傳遞給函數。

  2. 它支持所有LINQ方法,如LINQ查詢。 (其中,選擇,計數,總和,等等)

  3. 形成表達式樹,其形成lambda表達式的結構。 這是由編譯器完成的。

  4. 查詢提供程序查看表達式(表達式樹)並在運行時生成等價的SQL查詢。

  5. 返回類型:Delagate / Expression Tree

哪個最好?

你可以理解LINQ(查詢,Lambda)如果你看一下上面的幾點。

LINQ查詢的優點 - 可讀。

Lambda的優勢

  1. Lambda將具有優勢,因為它創建了一個委託,並且通過使用delagte,您只需傳遞輸入參數並獲得不同輸入參數的結果。您也不需要為不同的標準編寫不同的查詢。

  2. 您可以使用Lambda表達式和表達式樹創建動態查詢。

  3. 如果要將語句結果作為參數傳遞給方法,則可以使用Lambda表達式。

  4. 表達式更短。

因此,Lambda表達式對於LINQ查詢的開發是最佳的。


不要過早優化。 如果Linq和新的擴展方法提高了可讀性並在之後對應用程序進行了分析,那麼請大量使用它們。

大多數情況下,Linq和使用plain for循環之間的差異根本不相關。 代碼的可維護性提高應該值幾毫秒。 Linq可能會更慢,因為它適用於作為狀態機實現的枚舉器。 因此(...)循環很簡單會更快。

我建議按照Lasse V. Karlsens的建議,將http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html添加到他的鏈接列表中。


對於LINQ查詢,使用“新語法”,生成的IL(代碼)基本上與直接調用Enumerable和Queryable提供的擴展方法沒有什麼不同。


從技術上講,最快的方法是自己控制所有細節。 以下是一些性能測試 。 請注意,foreach關鍵字和ForEach LINQ構造的使用速度遠比僅使用和編寫過程代碼要慢得多。

但是,編譯器可以並且將會得到改進,您可以隨時分析代碼並優化任何有問題的區域。 通常建議使用更具表現力的功能,使代碼更容易閱讀,除非你真的需要額外的納秒。





lambda