增加C ++程序CPU使用率

时间:2011-06-23 04:28:05

标签: c++ windows performance memory-management cpu

我有一个用C ++编写的程序,它每秒运行一些for循环而不使用任何会让它等待任何原因的东西。它始终使用2-10%的CPU。有没有办法强制它使用更多的CPU并进行更多的计算而不会使程序更复杂?另外,我在Windows计算机上使用C :: B进行编译。从本质上讲,我在问是否有办法通过增加CPU的使用率来提高程序的速度,如果有的话,是怎么做的。

6 个答案:

答案 0 :(得分:5)

这取决于为什么它只使用10%的CPU。如果是因为你使用的是多CPU机器并且你的程序只使用一个CPU,那么不需要,你必须在代码中引入并发才能使用额外的功能。

如果它被其他东西限制(例如,将数据复制到磁盘和从磁盘复制数据),那么您不需要关注CPU,您需要关注瓶颈。最有可能的是,限制器将从磁盘读取,您可以通过使用更好的缓存机制来改进。

答案 1 :(得分:4)

从系统中获取额外资源并不是程序的权利或责任。这是操作系统的工作,作为资源调度程序。

如果需要使用比操作系统认为合适的更多CPU时间,则应使用与平台相关的API从操作系统请求。在这种情况下,这似乎与SetPriorityClassSetThreadPriority一致。

答案 2 :(得分:2)

假设您的应用程序具有强大的权限(PROCESS_SET_INFORMATION访问权限),您可以使用SetPriorityClass来提升您的优先级(当然,这会损害所有其他进程)。

你可以ABOVE_NORMAL_PRIORITY_CLASS(先试试这个),HIGH_PRIORITY_CLASS(对这个问题要非常小心)或REALTIME_PRIORITY_CLASS(我强烈建议你可能 shouldn' t 给这个人一个机会。)

如果您尝试更高优先级并且它仍然处于非常低的时间,则可能是因为您不受CPU限制(例如,如果您将数据写入输出文件)。如果是这种情况,您可能必须找到一种方法使自己受CPU限制。

请记住,这样做可能没有必要(甚至可取)。如果你的运行优先级高于其他线程并且你仍然没有吸收大量的CPU,那可能是因为Windows(很可能是理所当然地)决定你不需要它。

答案 3 :(得分:1)

创建一个线程&给予线程更高的优先级可能是一种方式。

答案 4 :(得分:0)

如果您使用C ++,请考虑使用Intel Threading Building Block。您可以找到一些示例here

答案 5 :(得分:0)

有些分析器可以很好地指示代码中的瓶颈所在。例如 - CodeAnalyst(仅适用于AMD芯片)具有每循环比率的指令。我相信英特尔的个人资料很相似。

正如Billy O'Neal所说,如果你在8核上运行,那么卡在10%的cpu上是正确的。如果这是您的问题,则Windows msvc ++具有标准算法的并行模式(parallel patterns library)。如果用c ++方式编写循环,它可以免费提供并行化(它仍然有责任确保你的循环是线程安全的)。我没有使用msvc版本,但是gnu::__parallel_for_each等可以使用。