【发布时间】:2013-02-20 01:38:51
【问题描述】:
当我注意到在更多线程上使用独立优先级队列实际上会降低性能时,我正试图使用工作线程来加速更大的算法。所以我写了一个小测试用例。
我在其中查询要启动多少个线程,将每个线程设置为自己的处理器,并从我的优先级队列中推送和弹出很多东西。每个线程都有自己的优先级队列,它们是单独分配的,所以我不怀疑错误共享。
我放了测试用例here,因为它比sn-p长。 (处理器亲和位来自NCrunch)
优先级队列是我自己创建的,因为 .NET 没有内置队列。如果这有什么不同,它会使用Pairing Heap。
无论如何,如果我用一个线程和一个内核运行程序,它的使用率大约是 100%。 两个线程/两个内核的使用率下降 最终将所有 8 个内核的使用率降至 30%。
这是一个问题,因为性能下降抵消了多线程带来的任何好处。是什么导致性能下降?每个队列完全独立于其他线程的
【问题讨论】:
-
如果您使用的 CPU 的物理内核很少(并且启用了超线程),这可能都是正常的。见superuser.com/questions/133082/… 和superuser.com/questions/420329/…
-
嗯,我将不得不尝试禁用超线程。但是,如果我执行stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-cCalculate Pi 之类的操作,我会得到 100% 的全面率。
-
@Tocs 请发布您的结果 - 我遇到了类似的问题,但没有意识到超线程可能是罪魁祸首。
-
对
Console.Write的调用是一个同步点。删除它会影响性能吗? -
@JimMischel 不明显,它被优先队列缓慢所掩盖。
标签: c# priority-queue worker-thread pairing-heap