一直知道 Dictionary 因為是用 hash 的方式存資料,取資料時用 key 找資料校能比較好,因此習慣宣告若為 Dictionary 型別就使用 key 來找資料。
最近 code review 時發現有宣告成 Dictionary 卻用 Linq extension method 來抓資料的情況。
簡單跑個效能差異,看看兩者效能到底差多少。
public static void Main(string[] args)
{
Dictionary<int, Book> dictionary = new Dictionary<int, Book>();
for (int i = 0; i < 100000; i++)
{
dictionary.Add(i, new Book()
{
Price = 0
});
}
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < dictionary.Count; i++)
{
dictionary.Values.ElementAt(i).Price += 1;
}
sw.Stop();
Console.WriteLine($"dictionary.Values.ElementAt(i):{sw.ElapsedMilliseconds}");
sw.Restart();
foreach (int key in dictionary.Keys)
{
dictionary[key].Price += 1;
}
sw.Stop();
Console.WriteLine($"dictionary[key]:{sw.ElapsedMilliseconds}");
}
private class Book
{
public decimal Price { get; set; }
}
//500筆資料的result
dictionary.Values.ElementAt(i):1ms
dictionary[key]:0ms
//2000筆資料的result
dictionary.Values.ElementAt(i):863ms
dictionary[key]:0ms
//100000筆資料的result
dictionary.Values.ElementAt(i):19785ms
dictionary[key]:2ms
集合小時效能沒有明顯的差異,當集合大時效能差異就很驚人了!真的是沒測不知道,一測嚇一跳!
平常還是維持良好的寫作習慣,以免坑害了未來的自己。