最近優化一個where查詢條件,查詢時間很慢,改為用Dictionary就很快了。
一、樣例
假設:listPicsTemp 有100w條數據,pictures有1000w條數據。
使用第1段代碼執行超過2分鍾。
var listPicsTemp = new List<string>(); pictures = pictures.AsParallel().Where(d => listPicsTemp.Contains(d.Pic)).ToList();
使用第2段代碼執行十幾毫秒。
var listPicsTemp = new List<string>(); var dicPicsTemp = listPicsTemp.Where(d => d != null).Distinct().ToDictionary(d => d);//使用Dictionary類型,速度快很多 pictures = pictures.AsParallel().Where(d => dicPicsTemp.ContainsKey(d.Pic)).ToList();
二、為什么Dictionary這么快呢?查看了一下微軟官方文檔。
三、查看源碼
List的源碼:https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646
List的Contains,是循環for查找的。
Dictionary的源碼: https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,bcd13bb775d408f1
Dictionary的ContainsKey,是通過hash查找的。
四、小結:
1、Dictionary<TKey,TValue>類實現為哈希表。ContainsKey() 內部是通過Hash查找實現的,查詢的時間復雜度是O(1)。所以,查詢很快。(List的Contains是通過for查找的)
2、Dictionary不是線程安全的。(查看微軟官方文檔,確實能學到很多知識盲區。)