具有优先级队列的慢工作线程性能

时间:2013-02-19 16:33:14

标签: c# priority-queue worker-thread pairing-heap

当我注意到在更多线程上使用独立优先级队列实际上降低了性能时,我试图使用工作线程来加速更大的算法。所以我写了一个小测试用例。

我在其中查询要启动的线程数,将每个线程设置为自己的处理器,并从我的优先级队列中推送和弹出很多东西。每个线程都拥有自己的优先级队列,并且它们是单独分配的,所以我不怀疑虚假共享。

我放了测试用例here,因为它比片段更长。 (处理器关联位来自NCrunch

优先级队列是我自己创建的,因为.NET没有内置队列。如果有任何不同,它会使用Pairing Heap

无论如何,如果我使用一个线程和一个核心运行程序,它的使用率大约为100%。 One core 使用率下降两个线程/两个核心 Two cores 并最终将所有8个内核的使用率降至30%。 eight cores

这是一个问题,因为性能下降会使任何从多线程中获得的收益无效。是什么导致性能下降?每个队列完全独立于其他线程的

2 个答案:

答案 0 :(得分:2)

解决pi这样的问题更适合并行化和超线程实际上可以让你加快速度。当你处理像你这样的重度内存问题时,超线程无法帮助并且实际上可能会受到伤害。查看CPU架构中的“流水线”。

使用2-cpus可以获得2倍的加速,实际问题并不多。 cpu越多,开销越大。在您的测试用例算法中,我怀疑核心必须等待内存子系统。如果调整内存要求,当内存需求更接近CPU缓存大小时,您会看到性能(和利用率)的提升。

答案 1 :(得分:0)

操作系统正在将处理分配给它希望的任何CPU。因此,您看到每个处理器都做了一些工作。

此外,当您说“性能下降”时,您是否检查了系统创建的争用次数?你可能正在解除线程中的争论。