当我注意到在更多线程上使用独立优先级队列实际上会降低性能时,我试图使用工作线程来加速更大的算法。所以我写了一个小测试用例。
在其中我查询要启动多少个线程,将每个线程设置为自己的处理器,并从我的优先级队列中推送和弹出很多东西。每个线程都拥有自己的优先级队列,它们是单独分配的,所以我不怀疑错误共享。
我把测试用例放在这里,因为它比一个片段长。(处理器亲和位来自NCrunch)
优先级队列是我自己创建的,因为 .NET 没有内置队列。如果这有什么不同,它会使用配对堆。
无论如何,如果我用一个线程和一个核心运行程序,它的使用率大约是 100%。 两个线程/两个内核的使用率下降 最终所有 8 个内核的使用率下降到 30%。
这是一个问题,因为性能下降抵消了多线程带来的任何好处。是什么导致性能下降?每个队列完全独立于其他线程的