相关简要信息:
AFAIK、并发堆栈、队列和包类是在内部使用链接列表实现的。
我知道争用少得多,因为每个线程都负责自己的链接列表。不管怎样,我的问题是关于ConcurrentDictionary<,>的
但是我正在测试这个代码:(单线程)
Stopwatch sw = new Stopwatch();
sw.Start();
var d = new ConcurrentDictionary < int, int > ();
for(int i = 0; i < 1000000; i++) d[i] = 123;
for(int i = 1000000; i < 2000000; i++) d[i] = 123;
for(int i = 2000000; i < 3000000; i++) d[i] = 123;
Console.WriteLine("baseline = " + sw.Elapsed);
sw.Restart();
var d2 = new Dictionary < int, int > ();
for(int i = 0; i < 1000000; i++) lock (d2) d2[i] = 123;
for(int i = 1000000; i < 2000000; i++) lock (d2) d2[i] = 123;
for(int i = 2000000; i < 3000000; i++) lock (d2) d2[i] = 123;
Console.WriteLine("baseline = " + sw.Elapsed);
sw.Stop();结果:(多次测试,相同值(+/-))。
baseline = 00:00:01.2604656
baseline = 00:00:00.3229741问题:
使ConcurrentDictionary<,>在单线程环境中慢得多的是什么?
我的第一反应是lock(){}总是慢一点。但显然不是。
发布于 2022-06-09 14:38:47
在.Net 4中,ConcurrentDictionary使用了非常糟糕的锁管理和争用解决方案,这使得它非常慢。具有自定义锁定和/或TestAndSet使用的字典,整个字典速度更快。
https://stackoverflow.com/questions/15252115
复制相似问题