2011-09-22 59 views
4

我在想以下哪種LINQ表達式更好(特別是在性能方面)。哪個LINQ表達式更好?

注:

長度的
  • SearchKeywords通常是關鍵字大約50
  • 長度通常約爲3
  • 此方法是圍繞100,000次

此稱爲一?

keywords.All(a => SearchKeywords.Contains(a)); 

或這一個

keywords.Except(SearchKeywords).None(); 

注:.None()是簡單地返回。任何我的擴展方法()

有沒有更好的方式來寫這個?

問候

+1

那麼,你的績效測量結果如何? – AakashM

+0

你應該在這裏添加AsParallel。 – Nahum

+0

我想平行3項是中性的 –

回答

8

Except將大約快一個極大的時間,因爲它使用一個Hashtable找到一套difference¹,因此會給O(n)性能。

Contains/All組合將不得不在keywords每個元素做一個天真的線性search²超過SearchKeywords,所以我們說的O(N²)性能(實際上n * m,但你給的數字是在相同的範圍,並採取任何我可以鍵入指數的藉口)。

更新:與預期的一樣,it's not even close除非您明確創建HashSet


當然¹UnlessSearchKeywords已經是一個HashSet<string>,爲FLQ的評論非常正確地指出。

²至少如果我們討論IEnumerable,它使用LINQ來對象標準實現。一個IQueryable理論上可以檢測到這一點,並以任何喜歡的方式實現它。

+1

除非SearchKeywords *是* HashSet,我認爲除了首先必須構造。 – flq

+0

@flq:非常真實。我更新了答案和基準以反映這一點。 – Jon

1

不知道,但我認爲

keywords.Except(SearchKeywords).None(); 

比前一個更快,因爲它可能需要throught一次掃描SearchKeywork的集合。

0

第一個選項是更具可讀性,並與兼容LINQ到SQL如果SearchWords是本地收集

第二個選項是不兼容的LINQ到SQL。

+0

你甚至可以將第一個重寫爲'Keywords.All(SearchWords.Contains)' –