使用50%cpu的简单C应用程序

时间:2011-10-06 16:05:42

标签: c

我有一个使用常数50%的简单C应用程序。我不知道为什么,但我希望尽可能减少它。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void Wait(int seconds)
{
clock_t endwait;
endwait = clock () + seconds * CLK_TCK ;
while (clock() < endwait) {}
}

void main()
{
printf ("program running.\n");
/* Wait( 4 ); */
printf( "Done Waiting!\n" );
printwow();
/* exit(0); */
}

timer_func (void)
{
Wait( 4 );
printwow();
}

printwow()
{
printf ("Say hello");
timer_func();
}

我猜它当然必须是计时器。但我肯定不知道。

感谢。

6 个答案:

答案 0 :(得分:21)

你的循环:

while (clock() < endwait) {}

busy-waiting。您基本上与CPU进行了以下对话。

“我们还在吗?” “否”。

“我们还在吗?” “否”。

“我们还在吗?” “否”。

(重复几次)

“我们还在吗?” “是”。

最好使用像sleep()这样的函数告诉CPU何时准备就绪。

答案 1 :(得分:4)

是的,这是Wait()中的紧张循环。你可能有一台双核机器,所以你使用100%的一个核心。请改用sleep()

答案 2 :(得分:3)

使用一些不使用处理器周期来“等待”的内置睡眠功能,例如来自sleep的{​​{1}}。

答案 3 :(得分:2)

timer_func()printwow()永远相互呼唤。你最终会得到一个堆栈溢出。

答案 4 :(得分:1)

因为循环

while (clock() < endwait) {}

cpu必须一直检查clock()的值,使用sleep()而不是你自己的代码。

答案 5 :(得分:1)

如果你想让你的代码睡4秒钟,那么你可以使用sleep(4)来做到这一点,它几乎肯定不会像你的wait()函数那样消耗CPU。请注意,sleep(4)将阻止执行单线程程序的其余部分,如果你不想这样,那么你需要更复杂的东西,但我怀疑sleep(4)就足够了。

此外,您的代码最终会耗尽堆栈,因为printwow()调用timer_func()调用printwow(),它会在递归循环中无限地调用timer_func()等。你需要解决这个问题,可能是使用for / while循环而不是递归。