我有一个用C ++编写的程序,它每秒运行一些for循环而不使用任何会让它等待任何原因的东西。它始终使用2-10%的CPU。有没有办法强制它使用更多的CPU并进行更多的计算而不会使程序更复杂?另外,我在Windows计算机上使用C :: B进行编译。从本质上讲,我在问是否有办法通过增加CPU的使用率来提高程序的速度,如果有的话,是怎么做的。
答案 0 :(得分:5)
这取决于为什么它只使用10%的CPU。如果是因为你使用的是多CPU机器并且你的程序只使用一个CPU,那么不需要,你必须在代码中引入并发才能使用额外的功能。
如果它被其他东西限制(例如,将数据复制到磁盘和从磁盘复制数据),那么您不需要关注CPU,您需要关注瓶颈。最有可能的是,限制器将从磁盘读取,您可以通过使用更好的缓存机制来改进。
答案 1 :(得分:4)
从系统中获取额外资源并不是程序的权利或责任。这是操作系统的工作,作为资源调度程序。
如果需要使用比操作系统认为合适的更多CPU时间,则应使用与平台相关的API从操作系统请求。在这种情况下,这似乎与SetPriorityClass
或SetThreadPriority
一致。
答案 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
等可以使用。