2010-05-21 48 views
6

是這樣的:Linq更快,更慢還是相同?

Box boxToFind = AllBoxes.FirstOrDefault(box => box.BoxNumber == boxToMatchTo.BagNumber); 

高於或低於此:

Box boxToFind ; 
foreach (Box box in AllBoxes) 
{ 
    if (box.BoxNumber == boxToMatchTo.BoxNumber) 
    { 
     boxToFind = box; 
    } 
} 

兩個給我,我要找(boxToFind)的結果。這將在我需要表現認真的移動設備上運行。

+2

你的第一個方法不會編譯。在哪裏返回一個IEnumerable。爲了相當於最後一個,你會喜歡做AllBoxes.Last(box => ...) – 2010-05-21 17:29:30

+0

好點。我改變了我的第一種方法。 (雖然我沒有使用最後一個,因爲它「應該」只有唯一的值) – Vaccano 2010-05-21 17:37:26

+0

第二種方法將編譯,但會給你最後一個匹配的方框。休息一下;當你退出if時。 – Rubys 2010-05-21 17:38:51

回答

8

它應該大致相同,除了您需要撥打First(或與您的代碼相匹配的號碼Last),而不是Where
打電話給Where會給你一組匹配項(IEnumerable<Box>);你只需要一個匹配項目。

通常,使用LINQ時,您需要了解延遲執行。在你的具體情況下,這是無關緊要的,因爲你得到一個單一的項目。

+1

FirstOrDefault以避免異常 – hunter 2010-05-21 17:29:06

+11

@hunter:除非他想要例外。 – SLaks 2010-05-21 17:30:08

+0

@SLaks或者知道一個合適的元素總是存在。 – Thomas 2014-03-01 07:22:16

2

如果微型優化是你的事情,LINQ表現更差,this is just one article,還有很多其他的帖子你可以找到。

+8

**先期優化是所有邪惡的根源**這與他很不相關。 – SLaks 2010-05-21 17:31:23

+0

不知道您是否閱讀了該文章的評論,但大部分問題不是迭代,而是隱含在他原始代碼中。 Anders Hejlsberg指出,不涉及每次迭代投射操作的查詢合理地接近for循環。 – 2010-05-21 19:58:12

0

最快的是當你使用循環。但差別非常小,您無視它。如果你正在構建一個實時應用程序,但這對於那些應用程序來說可能只是C#並不是最好的選擇!

8

除非通過分析確定此特定循環爲性能瓶頸,否則這種差異並不重要。

如果分析確實發現它是一個問題,那麼您需要查看備用存儲。將數據存儲在字典中,該字典提供了比循環數組更快的查找。

+0

字典比數組提供更快的查找速度?它確實沒有。字典由數組支持,每次訪問元素時都會進行額外的計算。因此,字典不可能比迭代中的數組快。 – Rubys 2010-05-21 17:36:57

+5

@Rubys - 字典查找是O(1),遍歷數組是O(n),所以字典查找對於足夠大的集合(假設一個合理的散列函數)更快。 – Lee 2010-05-21 17:50:07

+0

@Rubys,Dictionary的數組支持。散列碼用於標識要檢索的第一個數組中的哪個元素。沒有循環,只是一個簡單的數學計算。這給了你第二個數組,通常被稱爲桶。然後代碼在桶中循環查找確切的項目。一個好的集合大小和散列碼將導致只有少數項目的桶。最終的結果是字典比數組循環快得多。 – 2010-05-21 18:02:07

1

微型優化會殺了你。
首先,完成整個班級,然後,如果您有性能問題,請運行一個分析器並檢查應用程序的熱點。
確保你使用的是最好的算法,然後然後轉向這樣的微觀優化。 (不推薦的最後一個選項)>快速
LINQ <的foreach <爲<不安全 -
慢:

如果你已經做了。
抽象將使您的代碼更慢,95%的時間。

0

如果AllBoxes是IQueryable,它可能比循環更快,因爲可查詢可能具有Where-operation的優化實現(例如索引訪問)。

+0

@Sam:IQueryable繼承IEnumerable,所以foreach循環可以工作 – Rauhotz 2010-05-21 18:29:49

0

LINQ絕對慢100%

取決於你想在你的程序中完成什麼,但大多數情況下,這絕對是我所說的懶惰程序代碼...

如果你正在執行,你將基本上「失速」任何複雜的查詢,連接等......這些類型的函數/方法的總體位置 - 只是不使用它。如果你這麼做的話,那麼從長遠來看,你會變得更加幸福......而且表現將會是一個天壤之別。

注意

我絕對不會推薦LINQ的專爲速度/同步任務/計算 (即HFT買賣& /或交易的i-0-1對於初學者)的任何程序。

TESTED

花了近10秒的時間完成的 「LINQ」 與< 1毫秒的時間內加入。