Связанная информация:
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(){}
будет всегда медленнее. но, видимо, это не так.