意思是說,在 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)
{
Dictionarydic = 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
{
ConcurrentDictionarycondic = 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 意見:
張貼留言