C++ CPU密集型闹钟 编辑:

C++ CPU密集型闹钟 编辑:,c++,cpu,clock,C++,Cpu,Clock,我要感谢大家的快速回复^^Sleep()工作正常,我的CPU不再被这个程序恶意吞噬!我将保留这个问题,但要让大家知道,CPU问题已经得到了方便和专业的回答:D 作为旁白,我肯定会确保在面对更大、更重要的问题时,微优化保持在最低限度 ================================================================================ 出于某种原因,我的程序,一个我为欢笑和练习制作的控制台闹钟,是非常CPU密集型的。它消耗大约2mB的RAM

我要感谢大家的快速回复^^Sleep()工作正常,我的CPU不再被这个程序恶意吞噬!我将保留这个问题,但要让大家知道,CPU问题已经得到了方便和专业的回答:D

作为旁白,我肯定会确保在面对更大、更重要的问题时,微优化保持在最低限度

================================================================================

出于某种原因,我的程序,一个我为欢笑和练习制作的控制台闹钟,是非常CPU密集型的。它消耗大约2mB的RAM,这对于这样一个小程序来说已经是相当大的一部分了,但它有时会用超过50%的资源破坏我的CPU

大多数时候,我的程序除了倒数秒之外什么都不做,所以我想我的程序的这一部分会给我的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.
 }
/*等待函数在返回到*
*被调用函数。*/
无效等待(常数整数和秒)
{
clock\u t endwait;//需要与clock()进行比较的类型
endwait=clock()+(秒*每秒时钟);
而(clock()
如果有人浏览CPlusPlus.com,这是他们作为clock()示例编写的clock()函数的真实副本/粘贴。为什么注释
//这里什么都不需要做
如此平淡无奇。我还不能完全确定clock()到底做了什么

程序的其余部分调用另外两个函数,每60秒才激活一次,否则返回调用方并再倒计时一秒,所以我认为这不会太占用CPU—虽然我不知道,但这是我第一次尝试优化代码

第一个功能是使用
system(“cls”)
进行控制台清除,我知道这非常非常慢,不是一个好主意。我将改变后加速,但是,因为它只会每60秒激活一次,并且有一个明显的滞后峰值,我知道这在大多数情况下不是问题

第二个函数以更新后的剩余时间重新写入屏幕内容,也仅每六十秒一次


我将在调用wait、clearScreen和display的函数中进行编辑,如果确定此函数不是问题所在。我已经尝试引用大多数变量,这样它们就不会被复制,也避免了
endl
,因为我听说它比
\n

慢了一点,这称为忙等待。CPU在
循环中全速旋转车轮。您应该将while循环替换为对
sleep
usleep
的简单调用


我不知道2MB,尤其是不知道整个程序,但这真的不是什么值得强调的事情。可能是由于效率原因,C运行时库在启动时占用了那么多时间。

在这里,您在旋转而不屈服,因此消耗CPU周期也就不足为奇了

丢下

  Sleep(50);
在while循环中。

此:

while( clock() < endwait ) {} 
这将实际停止您的程序在指定的秒数内执行,并且在执行时不会占用任何处理器时间


根据您的平台,您需要包括
(UNIX和Linux)或
(Windows)来访问此功能。

当线程获得要执行的时间片时,
while
循环会使处理器忙。如果您只希望等待确定的时间量,则不需要循环。您可以通过调用
sleep
usleep
nanosleep
(取决于平台和粒度)来替换它。它们将暂停线程执行,直到指定的时间结束

或者,您可以在剩余的时间片上放弃(yield),调用
Sleep(0)
(Windows)或
sched_yield()
(Unix/Linux/etc)


如果您想了解此问题的确切原因,请阅读。

while(clock()CPU问题已经得到了很好的解决。至于内存问题,目前还不清楚2MB的实际大小。它可能是映射到应用程序地址空间的所有库的总大小

运行并检查一个只包含

int main() { for (;;) }

测量您平台上的基准内存使用情况。

即使使用sleep(),这仍然称为忙等待,但它肯定会解决您的CPU问题。嗯?按指定的时间间隔睡觉(当指定的时间间隔是您要等待的,而不是指定的条件时)不是忙等待。@neilwhitaker1,您对术语“忙等待”的理解是什么
sleep
将调用线程置于睡眠状态(因此得名),并在时间到时将其唤醒;我认为@neil的评论是基于在while循环中添加一个调用
sleep(n)
,其中
n
小于
seconds
(就像Per的回答一样),而不是破坏整个
wait
函数并在其位置使用
sleep
。+1,Nick;谢谢你指出这一点。我已经对答案进行了调整,以避免这种可能的混淆。顺便说一句,在您了解到底是什么导致代码变慢或CPU密集之前,请确实避免进行微观优化,例如将
std::endl
替换为
'\n'
。当有很多更大的问题需要解决时,试图修复和处理一些无关紧要的小事情只会使代码变得越来越不可读和不可维护
int main() { for (;;) }