【C#】Dictionary.Values.ElementAt(i) vs Dictionary[key] 效能比較

一直知道 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

集合小時效能沒有明顯的差異,當集合大時效能差異就很驚人了!真的是沒測不知道,一測嚇一跳!
平常還是維持良好的寫作習慣,以免坑害了未來的自己。

參考資料:
https://learn.microsoft.com/zh-tw/dotnet/standard/collections/hashtable-and-dictionary-collection-types

分類: C#

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *