2011-11-13 82 views
3

上週我收到一些代碼並被要求改進性能。所以從這項工作開始,不久我就看到他們使用了很多對象來存儲對象的大集合(10000到100000個以上的對象)。在代碼中,出於性能原因,他們使用HashSet<T>HashSet的性能<T>和Linq查詢

他們所做的唯一事情就是用對象填充HashSet,然後我們使用一些Linq在多個集合之間執行查詢。大多數查詢將加入1或n個HashSet,或從First()Where()中檢索集合中的特定對象。

我想知道如果我們獲得任何性能優勢與正常List<T>相比?因爲它們在代碼中使用的所有Linq擴展方法都是爲IEnumerable<T>而編寫的。

在互聯網上,很多文章都說List會更快,但有人說HashSet處理的巨大集合比List更好。

希望有人能給我更多的建議。

感謝。

+2

難道你不容易寫一個測試比較這兩個性能? – row1

+1

我還會注意到HashSet沒有排序 - 除非你需要一個任意元素,或者已經過濾除了一個元素之外的所有元素,否則考慮它的'First'元素是錯誤的。 – Kobi

+2

你的方法是非常沒有生產力的。使用分析器。 –

回答

9

如果您僅使用LINQ查詢,則不會獲得任何性能優勢,因爲您只是列舉了整個集合。事實上,由於連續的內部存儲空間,可能是List<T>的性能更好。

要得到HashSet<T>的PERF好處,你需要使用ISet<T>方法,最好有另一個HashSet<T>,因爲,看代碼,所以針對這種情況進行了優化。此外,由於HashSet<T>的性能基於哈希查找的O(1)性能特徵,所以操作只會更快利用成員對象的哈希代碼(如相等性測試)。不使用成員哈希代碼的操作(如成員屬性和成員本身的過濾)需要進行O(N)操作,使其與List<T>相同。