2009-07-14 40 views
1

我正在运行一些分析测试,而usleep是一个有用的功能。但是,当我的程序正在休眠时,这个时间不会出现在配置文件中。如何进行主动睡眠?

例如。如果我有一个功能:

void f1() { 
    for (i = 0; i < 1000; i++) 
     usleep(1000); 
} 

随着文件的工具gprof的,F1似乎并不花费任何时间。

我寻找一个方法不是空更好while循环做积极的睡眠,如:

while (1) { 
    if (gettime() == whatiwant) 
     break; 
} 
+0

感谢您的回复。也许它不是很清楚,但我不在乎效率,我正在运行一些测试(实际上,我将在test.c文件中使用它)。我知道等待队列调度等等。我正在寻找的是我更新的现有方法。 – 2009-07-14 14:59:54

回答

2

一个什么样的系统是你吗?在类UNIX系统中,您可以使用setitimer()在指定的时间段之后向进程发送信号。这是您需要实施您正在寻找的“主动睡眠”类型的工具。

设置计时器,然后循环直到收到信号。

2

因为当你调用usleep CPU被投入到工作中,以1秒别的东西。所以当前线程不使用任何处理器资源,这是一个非常聪明的事情。

积极的睡眠是绝对避免的,因为它浪费了资源(最终通过将电能转化为热量来损坏环境))。

无论如何,如果你真的想这么做,你必须对处理器做一些真正的工作,这些东西不会被编译器优化所分解。例如

for (i = 0; i < 1000; i++) 
    time(NULL); 
2

我假设你想找出的时间总量(挂钟时间,真实世界的时间,到时候你坐在那儿看你的应用程序运行)F1()走,而不是到CPU时间。我会调查一下,看看gprof是否能给你一个挂钟时间而不是处理时间。

我想它取决于你的操作系统,但是你没有看到在配置文件中占用任何进程时间的原因是因为它在技术上没有在那段时间使用任何其他正在运行的进程(假设这是在* nix平台上运行)。

+0

我认为你的意思是实时/挂钟时间。睡觉不应该使用用户时间。 – Nick 2009-07-14 13:52:44

+0

@Nick - 对。编辑。 – 2009-07-14 14:52:09

+0

嗯,很好的回应。已经在gprof中搜索过,这是不可能的。 – 2009-07-14 15:01:55

1
for (int i = i; i < SOME_BIG_NUMBER; ++i); 

“睡眠”功能的全部重点在于您的应用程序未运行。它被放入睡眠队列中,操作系统将控制转移到另一个进程。如果你想让你的应用程序运行,但什么也不做,空循环是一个简单的解决方案。但你失去了睡眠的所有好处(让其他应用程序运行,节省CPU使用率/功耗)

所以你问的是没有意义的。你不能让你的应用程序休眠,但仍然在运行。

0

AFAIK唯一的选择是做一个while循环。操作系统通常假定,如果您想等待一段时间,您将希望屈服于操作系统。

能够获得微秒准确的计时器也是一个潜在的问题。 AFAIK没有一个跨时代的做时机的方式(请有人纠正我,因为我喜欢跨平台的亚微秒计时器!:D)。在Win32下,当你在循环中花费足够的时间然后退出时,你可以用一些QueryPerformanceCounter调用来包围一个循环来计算出来。

e.g

void USleepEatCycles(__int64 uSecs) 
{ 
    __int64 frequency; 
    QueryPerformanceFrequency((LARGE_INTEGER*)&frequency); 
    __int64 counter; 
    QueryPerformanceCounter((LARGE_INTEGER*)&counter); 

    double dStart = (double)counter/(double)frequency; 
    double dEnd = dStart; 
    while((dEnd - dStart) < uSecs) 
    { 
     QueryPerformanceCounter((LARGE_INTEGER*)&counter); 
     dEnd = (double)counter/(double)frequency; 
    } 
} 
0

这就是为什么分析查看“切换出来的%”时间非常重要。基本上,虽然你的功能的独占时间可能很少,但如果它执行例如I/O,数据库等,等待外部资源,然后“切换%”是要注意的指标。

0

这是你用gprof得到的那种困惑,因为你关心的是挂钟时间。我使用this