我一直在使用win32,c,c ++。 我在Visual Studio上编码。 大多数情况下,我看到系统空闲进程使用更多的CPU利用率。 有没有办法分配更多的处理器周期到我的程序运行速度更快? 我知道I / O可能有一些限制,在这种情况下,这个问题没有任何意义。 还是我误解了任务pipe理器号码? 我很困惑,请帮助我。 我想在程序本身做什么,顺便说一句,如果答案是特定于Windows,我会很高兴。
在此先感谢〜卡尔文
如果你的程序是唯一需要做的事情(不要等待IO),那么它的线程总是被分配给一个处理器内核。
但是,如果您有多核处理器和单线程程序,则在任务管理器中显示的进程的CPU使用率将始终受限于100 / Ncore。
例如,如果你有一个四核机器,你的进程将是25%(使用一个核心),空闲进程在75%左右。 你只能通过把你的任务分割成单独的线程所能处理的块来增加CPU的能力,这些线程将在空闲内核上运行。
空闲进程只有在没有其他进程需要时才运行。 如果你想使用更多的CPU周期,然后使用它们。
如果你的程序空闲,它什么也不做,即没有任何事情可以做得更快。 所以CPU可能不是你的情况下的瓶颈。 你可能正在等待来自磁盘或网络的数据?
如果您的处理器具有多个内核,并且您的程序只使用一个内核,则使您的程序可以工作。
在多任务/多线程操作系统中,处理器的时间在线程之间被分割。
如果你想要一个特定的线程来获得更大的时间块,你可以用SetThreadPriority函数来设置它的优先级,但不是明智的做法。
只有特殊的软件(应该)混淆这些设置。
窗口应用程序的CPU使用率很低(我们在任务管理器中看到的)
因为大部分时间他们只是在等待消息。
使用线程来:
此外,从主线程中删除所有睡眠等待状态。
推迟所有I / O到一个线程,以便等待状态被限制在其中。 将实际的计算保留在前台线程中,并使用同步机制使I / O从线程在通信时等待主线程。
如果你的CPU是多核的,并且你的问题是可以并行化的,那么创建和核心一样多的线程,研究“设置亲和性”函数来在核心之间分配它们,并为所有的I / O保留一个单独的线程。
也请注意不要在主线程中等待–USLEEP(1)不会将您发送到背景1微秒,而是“不低于…”,这可能表示1ms到100ms之间的任何值,但几乎不会低于而且从来没有接近微秒。