我试图使用工作线程来加速更大的算法,当我发现在更多的线程上使用独立的优先级队列实际上会降低性能。于是我写了一个小测试用例。缓慢的工作线程性能与优先级队列
在其中我查询要启动多少个线程,将每个线程设置为它自己的处理器,并从我的优先级队列中推送和弹出很多东西。每个线程都拥有自己的优先级队列,并且它们分开分配,所以我不怀疑虚假分享。
我把测试用例here,因为它比片段更长。 (处理器关联位来自NCrunch)
优先级队列是我自己创建的,因为.NET没有内置队列。如果这有什么不同,它使用Pairing Heap。
无论如何,如果我用一个线程和一个核心运行程序,它会获得大约100%的使用率。 两根线程/两个核心的使用率下降 最终,所有8个核心的使用率降至30%。
这是一个问题,因为性能的下降会使任何操作都无效,这将会从多线程中获益。什么导致性能下降?每个队列完全独立于另一个线程
如果您运行的物理内核很少(并且启用了超线程),那可能都是正常的。请参阅http://superuser.com/questions/133082/hyper-threading-and-dual-core-whats-the-difference和http://superuser.com/questions/420329/single-threaded-program-takes-too -low-cpu – 2013-02-19 16:53:11
嗯,我将不得不尝试禁用超线程。但是,如果我做一些像http://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c计算Pi,我全面获得100%。 – Tocs 2013-02-19 17:02:48
@Tocs请发布你的结果 - 我一直有类似的问题,并没有意识到超线程可能是责备。 – AngryHacker 2013-02-19 17:44:48