如果所有操作都在单个线程中完成,则在一个线程中使用 ConcurrentDictionary 或同步访问是没有意义的。当然字典会打败 ConcurrentDictionary。
很大程度上取决于使用模式和线程数。这是一个测试,表明 ConcurrentDictionary 的性能优于字典和锁,并随着线程数的增加而增加。
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Run(1, 100000, 10);
            Run(10, 100000, 10);
            Run(100, 100000, 10);
            Run(1000, 100000, 10);
            Console.ReadKey();
        }
        static void Run(int threads, int count, int cycles)
        {
            Console.WriteLine("");
            Console.WriteLine($"Threads: {threads}, items: {count}, cycles:{cycles}");
            var semaphore = new SemaphoreSlim(0, threads);
            var concurrentDictionary = new ConcurrentDictionary<int, string>();
            for (int i = 0; i < threads; i++)
            {
                Thread t = new Thread(() => Run(concurrentDictionary, count, cycles,  semaphore));
                t.Start();
            }
            Thread.Sleep(1000);
            var w = Stopwatch.StartNew();
            semaphore.Release(threads);
            for (int i = 0; i < threads; i++)
                semaphore.Wait();
            Console.WriteLine($"ConcurrentDictionary: {w.Elapsed}");
            var dictionary = new Dictionary<int, string>();
            for (int i = 0; i < threads; i++)
            {
                Thread t = new Thread(() => Run(dictionary, count, cycles, semaphore));
                t.Start();
            }
            Thread.Sleep(1000);
            w.Restart();
            semaphore.Release(threads);
            for (int i = 0; i < threads; i++)
                semaphore.Wait();
            Console.WriteLine($"Dictionary: {w.Elapsed}");
        }
        static void Run(ConcurrentDictionary<int, string> dic, int elements, int cycles, SemaphoreSlim semaphore)
        {
            semaphore.Wait();
            try
            {
                for (int i = 0; i < cycles; i++)
                    for (int j = 0; j < elements; j++)
                    {
                        var x = dic.GetOrAdd(i, x => x.ToString());
                    }
            }
            finally
            {
                semaphore.Release();
            }
        }
        static void Run(Dictionary<int, string> dic, int elements, int cycles, SemaphoreSlim semaphore)
        {
            semaphore.Wait();
            try
            {
                for (int i = 0; i < cycles; i++)
                    for (int j = 0; j < elements; j++)
                        lock (dic)
                        {
                            if (!dic.TryGetValue(i, out string value))
                                dic[i] = i.ToString();
                        }
            }
            finally
            {
                semaphore.Release();
            }
        }
    }
}
线程:1,项目:100000,周期:10 ConcurrentDictionary:00:00:00.0000499 字典:00:00:00.0000137
线程:10,项目:100000,周期:10 ConcurrentDictionary:00:00:00.0497413 字典:00:00:00.2638265
线程:100,项目:100000,周期:10 ConcurrentDictionary:00:00:00.2408781 字典:00:00:02.2257736
线程:1000,项目:100000,周期:10 ConcurrentDictionary:00:00:01.8196668 字典:00:00:25.5717232