我的电脑是双核core2Duo。我已经在我的应用程序的缓慢区域中实现了多线程,但我仍然注意到cpu的使用率从未超过50%,并且在多次迭代后仍然滞后。这是正常的吗?我希望它能让我的cpu达到100%,因为我将它分成4个线程。为什么它仍然可以限制在50%?
由于
请参阅What am I doing wrong? (multithreading)
我的实现,除了我修复了该代码有
的问题答案 0 :(得分:1)
根据您的描述,我们很少继续,但是,让我看看我是否可以提供帮助:
首先研究这些方面。
答案 1 :(得分:1)
查看你的代码,你在紧密的循环中进行大量的分配 - 在每次迭代中你动态分配两个双元素向量,然后将它们推回到结果向量上(从而制作两者的副本)那些载体);最后一次推回会偶尔导致重新分配和矢量内容的副本。
即使您的实现对小块使用快速,固定大小的分配器,堆分配也相对较慢。在最坏的情况下,通用分配器甚至可以使用全局锁;如果是这样,它将消除你可能从多线程获得的任何收益,因为每个线程将花费大量时间等待堆分配。
当然,分析会告诉您堆分配是否会限制您的性能,或者它是否是其他东西。我会提出两个具体建议来减少你的堆分配:
std::array
(或std::tr1::array
或boost::array
); array
“容器”不对其元素使用堆分配(它们像C数组一样存储)。reserve()
可以为这些元素留出足够的空间。