我想感谢大家的快速回复^^ Sleep()按预期工作,我的CPU不再被这个程序恶意吞噬了!我将按原样保留这个问题,但是让每个人都知道CPU问题已经得到了方便和专业的回答:D
除此之外,我肯定会确保在面对更大,更重要的问题时将微优化保持在最低限度!
================================================== ==============================
出于某种原因,我的程序,我为笑和练习制作的控制台闹钟,是CPU密集型的.它消耗大约2mB的RAM,这对于这么小的程序来说已经相当多了,但它有时会破坏我的CPU超过50%的资源.
大部分时间我的程序除了倒数秒之外什么都不做,所以我想我的程序中的这部分是导致我的CPU压力太大的部分,尽管我不知道为什么.如果是这样的话,你可以推荐一种减少它的方法,或者如果问题不能轻易解决,可能会使用库吗?
/* The wait function waits exactly one second before returning to the *
* called function. */
void wait( const int &seconds )
{
clock_t endwait; // Type needed to compare with clock()
endwait = clock() + ( seconds * CLOCKS_PER_SEC );
while( clock() < endwait ) {} // Nothing need be done here.
}
Run Code Online (Sandbox Code Playgroud)
如果有人浏览CPlusPlus.com,这是他们编写的clock()函数的真正复制/粘贴,作为clock()的示例.很多为什么评论//Nothing need be done here如此黯淡无光.我还不完全确定clock()到底是做什么的.
程序的其余部分调用另外两个仅每六十秒激活一次的函数,否则返回调用者并倒计时另一秒,所以我不认为CPU太密集 - 虽然我不知道,这是我的第一次尝试在优化代码.
第一个功能是一个控制台清除使用system("cls"),我知道,它真的,非常慢,不是一个好主意.我将改变后匆忙,但是,因为它只是每60秒激活一次,并且有明显的滞后尖峰,我知道这不是大多数时候的问题.
第二个功能也只用每六十秒重写屏幕内容和更新的剩余时间.
我将在调用wait,clearScreen和显示的函数中进行编辑,如果很清楚这个函数不是问题.我已经尝试引用大多数变量,因此它们不会被复制,也可以避免,endl因为我听说它比它有点慢\n.
Tyl*_*nry 15
这个:
while( clock() < endwait ) {}
Run Code Online (Sandbox Code Playgroud)
不是"无所事事".当然,没有任何正在做内部的while循环,但测试clock() < endwait不是免费的.事实上,它正在一次又一次地执行,就像你的系统可以处理它一样快,这正在推动你的负载(可能是50%,因为你有一个双核处理器,这是一个单线程程序只能使用一个核心).
这样做的正确方法就是删除整个wait函数,而只是使用:
sleep(seconds);
Run Code Online (Sandbox Code Playgroud)
这实际上会阻止程序执行指定的秒数,并且在执行此操作时不会占用任何处理器时间.
根据您的平台,您需要包括<unistd.h>(UNIX和Linux)或<windows.h>(Windows)才能访问此功能.
这称为忙等待.CPU在while循环中以全油门旋转车轮.您应该通过简单的调用sleep或替换while循环usleep.
我不知道2 MB,特别是对整个程序一无所知,但这真的不是要强调的东西.可能是因为效率原因,C运行时库在启动时会吸收太多.