问题 如何选择并发字典的并发级别


我正在使用并发字典存储大约200万条记录,并想知道将字典的并发级别初始化为什么。

MSDN页面的示例代码中包含以下注释:

concurrencyLevel越高,可以在ConcurrentDictionary上同时执行的理论操作数越高。但是,随着concurrencyLevel的上升,调整字典大小等全局操作会花费更长的时间。

这是我能找到的最好的解释concurrencyLevel的含义,但它仍然很模糊。


11130
2018-05-07 21:30


起源



答案:


最重要的是要理解即使你有更多的并发访问 concurrencyLevel,操作仍然是线程安全的。也就是说,设定 concurrencyLevel 是表现的问题,而不是正确性。

concurrencyLevel 指定可用于映射操作的独立锁的数量。如果你有 n 线程同时访问字典,设置 concurrencyLevel 比......高 n 不会产生任何额外的好处。一般来说,最佳值 concurrencyLevel 但是,由于给定的工作人员不会花费大部分时间访问字典,因此将显着低于工作线程的数量。

分析您的应用程序确实是确定最佳应用程序的唯一方法 concurrencyLevel。但是,将其设置为预期的工作线程数是一个良好的开端。


11
2018-05-07 21:37



同意分析部分。这是唯一能说出来的方式。 - Jason Hernandez
你能解释一下你可以用什么工具来分析它(即VS Concurrency Visualizer)。另外,特别是我在分析期间要查找的是什么,这表明我应该增加/更改concurrencyLevel? - Jake Drew


答案:


最重要的是要理解即使你有更多的并发访问 concurrencyLevel,操作仍然是线程安全的。也就是说,设定 concurrencyLevel 是表现的问题,而不是正确性。

concurrencyLevel 指定可用于映射操作的独立锁的数量。如果你有 n 线程同时访问字典,设置 concurrencyLevel 比......高 n 不会产生任何额外的好处。一般来说,最佳值 concurrencyLevel 但是,由于给定的工作人员不会花费大部分时间访问字典,因此将显着低于工作线程的数量。

分析您的应用程序确实是确定最佳应用程序的唯一方法 concurrencyLevel。但是,将其设置为预期的工作线程数是一个良好的开端。


11
2018-05-07 21:37



同意分析部分。这是唯一能说出来的方式。 - Jason Hernandez
你能解释一下你可以用什么工具来分析它(即VS Concurrency Visualizer)。另外,特别是我在分析期间要查找的是什么,这表明我应该增加/更改concurrencyLevel? - Jake Drew