Dot-Net

LINQ 查詢是否有很多成本?

  • July 26, 2009

IEnumerable<T>輕量級還是重量級的簡單 LINQ 查詢?它們與手寫forforeach循環相比如何?是否有關於何時更喜歡 LINQ 與手動搜尋的一般指南?

例如:

var lowNums =
   from n in numbers
   where n < 5
   select n;

相比:

List<int> lowNums = new List<int>();

foreach (int n in numbers)
{
   if (n < 5)
   {
       lowNums.Add(n);
   }
}

我正在和一位同事談論 LINQ,他對使用它表示了一些猶豫。他猜想,為了支持 LINQ 可以做的所有事情,“幕後”可能會發生很多事情。

上述範例之間是否存在顯著的性能差異?有沒有關於集合上 LINQ 性能的好資源?一個簡單的Google搜尋linq 性能出現了一些看似過時的文章。

LINQ in Action的作者使用 和 LINQ 查詢進行了一些基準測試for, foreach, List<T>.FindAll,它們都做同樣的事情。根據查詢的構造方式,LINQ 只慢了大約 10%。正如他們所說,

LINQ 不是免費的。

LINQ 是一個複雜的主題,但根據您對它的用途,它不必增加很多成本。通常,LINQ 已建構為盡可能依賴延遲執行,以節省記憶體和 CPU,直到您真正需要它為止。

但是,您必須了解不同查詢運算符的工作方式,因為更改查詢流可能會極大地改變它的執行方式。您描述的簡單查詢通常不是問題,但是像Reverse()和轉換運算符這樣的運算符可能會引發一些麻煩,因為它們需要立即迭代結果集。通常有多種方法可以編寫相同的查詢,並且根據您建構它的方式,您可能會看到最小的性能損失,或者您可以讓它比等效循環慢兩倍。

不過,它提供的便利性和簡潔性遠遠超過了我日常編碼中的大部分性能考慮。永遠不要預優化!

引用自:https://stackoverflow.com/questions/1185209