2012-11-30

compare performance in Dictionary and ConcurrentDictionary

Dictionary 類別,是不支援 thread safe 的。
意思是說,在 multi-thread 環境下,如果同時直接 read/write dictionary 、而不 lock (或沒有使用 InterChange) 的話,就有可能發生 exception。

在 .net 4.0 之後,針對平行處理提供了許多類別,其中之一就是 ConcurrentDictionary (so also)。
也就是在 multi-thread 環境,就算有同時 read/write 的可能,也不用自己實做 lock 機制,系統支援了。

這當然是一個好消息。

但是,第一個首要擔心的是: 效能會不會掉。

這裡,先就 single thread 來簡單測試一下:




    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
                compareDictionary(true);
            else
                compareDictionary(false);
        }

        ///



        /// 比較 dictionary vs concurrentdictionary
        ///

        static void compareDictionary(bool useDictionary)
        {
            int dicCount = 100000;
            int max = dicCount + 10000;
            double sp = 0;
            Stopwatch sw = new Stopwatch();
            if (useDictionary)
            {
                Dictionary dic = new Dictionary();
                for (int i = 0; i < dicCount; i++)
                    dic[i] = i;
                sw.Start();
                for (int i = 0; i < max; i++)
                {
                    int v;
                    if (dic.TryGetValue(i, out v))
                    {
                     
                    }
                }
                sw.Stop();
             
            }
            else
            {
                ConcurrentDictionary condic = new ConcurrentDictionary();
                for (int i = 0; i < dicCount; i++)
                    condic[i] = i;
                sw.Start();
                for (int i = 0; i < max; i++)
                {
                    int v;
                    if (condic.TryGetValue(i, out v))
                    {
                    }
                }
                sw.Stop();
            }
            sp = sw.Elapsed.TotalSeconds;
            Console.WriteLine("useDictionary: " + useDictionary.ToString() + ". sp: " + sp.ToString("0.00000"));

        }
    }



結果如下:


result of Dictionary:
useDictionary: True. sp: 0.00158
useDictionary: True. sp: 0.00174
useDictionary: True. sp: 0.00161
useDictionary: True. sp: 0.00174
useDictionary: True. sp: 0.00175
useDictionary: True. sp: 0.00158
useDictionary: True. sp: 0.00158
result of ConcurrentDictionary:
useDictionary: False. sp: 0.00276
useDictionary: False. sp: 0.00249
useDictionary: False. sp: 0.00253
useDictionary: False. sp: 0.00255
useDictionary: False. sp: 0.00247
useDictionary: False. sp: 0.00272


還真的有差別:
1. 簡單測試起來,看來是 ConcurrentDictionay 比較慢一點。
2. 實際上線的話,不知道結果如何。
3. multi-thread 的話,目前沒有測試,真好奇 PK 起來不知如何。希望 ConcurrentDictionary 是個 killer 級的類別!!


0 意見:

張貼留言