2010-08-09 73 views
7

我正在遍歷一個具有大約1000個元素的匿名類型。linq foreach性能

這裏的問題是,我的循環如何才能完成需要將近3秒的時間,而循環內部發生的時間少於1毫秒。有一千個元素,我認爲循環必須在第二秒鐘內完成,而不是3.

有沒有辦法讓迭代更快?

// takes 1ms to complete 
     var x = tt.Where(p => p.Methods.Count() > 0 && p.PerWeek != this.Project.WorkDaysCount && !p.IsManual); 

// takes almost 3 seconds to complete 
        foreach (var item in x) 
        { 
         // do stuff that takes < 1 ms 
        } 

回答

14

Linq使用延遲執行。您的linq查詢實際上不會執行,直到有人使用返回的IEnumerable。你看到的執行時間是查詢的結果,而不是foreach。

+0

Ofcourse。我沒有意識到。謝謝。 – Jeroen 2010-08-09 16:13:32

7

延期執行。 寫x.ToList();它也需要~3秒。

15

兩個直接的建議:

  • 不要使用p.Methods.Count() > 0 - 需要執行完整計數,即使你只需要知道,如果有任何元素。改爲使用p.Methods.Any()
  • 不要在每次迭代時計算this.Project.WorkDaysCount。我們不知道那裏發生了什麼,但它可能很昂貴。預先計算並使用常量。

下面是改進查詢代碼:

int workDaysCount = Project.WorkDaysCount; 
var x = tt.Where(p => p.Methods.Any() && 
       p.PerWeek != workDaysCount && 
       !p.IsManual); 

正如其他人所說,原因查詢建築本身不帶任何顯著時間,這就是它沒有做任何實際工作。但是,知道這並不會讓它更快,當然:)

除此之外,我們將需要更多地瞭解上下文。這是LINQ到對象,LINQ到SQL,還是其他? tt的類型是什麼?

+0

這是相當複雜的模塊的一部分。 tt是一個小組的結果,並建立一個子集合。方法基於一些標準。這是對象的邏輯。根據您的信息,我認爲我可以進一步優化。謝謝! – Jeroen 2010-08-09 16:20:23

1

您的IEnumerable(x)將不會被評估,直到您實現它