.NET字典性能会因多线程访问而降低吗?

时间:2010-09-28 17:49:20

标签: .net dictionary

我的情况是,在多线程应用程序中,许多不同的线程同时访问Dictionary。看起来这可能是一个瓶颈,但目前还不清楚 - 一个看似合理的情况是多个线程可能正在尝试检索相同的值(请注意,数据结构是固定的 - 没有线程正在进行任何写入,但数十个可能试图读取相同的值)。问题是,多个线程可以同时读取相同的值,还是一次读取一个?如果是这样,是否还有其他可以使用的数据结构?

4 个答案:

答案 0 :(得分:2)

多个线程在读取相同内存值时应该没有问题。操作系统或硬件级别可能存在少量等待,而实际访问每个线程的内存,但在大多数情况下这是微不足道的,并且不容易解决。

我对你对这个问题的描述的注意力是“数十[线程]可能试图读取相同的值”。如果您同时处理了几十个活动线程,那么瓶颈就是线程管理。像任何事一样,有一个收益递减和规模不经济的法则;使用当前硬件,大约是“执行单元”(核心,HT逻辑处理器,但架构处理多线程执行)的活动线程数的两倍,您的CPU开始花费更多时间来调度线程执行和管理线程状态而不是实际执行线程指令。是的,您的任务管理器可能会显示数百个正在运行的线程,但其中绝大多数是“正在休眠”,正在侦听用户交互,或者只是等待(如轮询线程)。

我会考虑将每个“执行单元”的线程数减少到不超过两个,理想情况下只需要比执行单元数多一个(因此EU有一个线程可以“切换到”,而FSB是读取另一个线程的内存)。这将减少计算机管理所有这些线程的开销时间。

答案 1 :(得分:0)

可以,是的。这并不一定意味着它会发生。

如果您正在锁定字典以进行读/写访问,那么锁定的开销将会增加......更不用说死锁的可能性了。

没有锁定,性能不应该降低。

答案 2 :(得分:0)

如果您在访问相关lock()的任何地方没有Dictionary进行任何操作,我怀疑这可能是您遇到麻烦的根源。如果您只是阅读值而从不写,则不需要锁定(尽管您也应该考虑访问Dictionary项的成员变量)。

如果您经常锁定很多线程,锁定可能会导致一些降级,但如果是这种情况,我认为您会遇到其他方面的性能问题。当然,如果没有正确实现锁定,您可能会遇到死锁或不必要的锁定。

答案 3 :(得分:0)

如果您不需要提供锁定,那么当从集合中读取多个线程时,perf将达到标准或更好。可以检查反射器中的字典实现,看看是否有任何地方可以修改支持哈希表的状态。我不相信这会是一个问题。