我有一个使用常数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();
}
我猜它当然必须是计时器。但我肯定不知道。
感谢。
答案 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循环而不是递归。