如何做好主动睡眠?

时间:2009-07-14 13:32:41

标签: c++ c profiling sleep

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

例如。如果我有一个函数:

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

将配置文件工具用作gprof,f1似乎不会消耗任何时间。

我正在寻找的方法比空闲的循环更好,可以进行主动睡眠,例如:

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

7 个答案:

答案 0 :(得分:2)

因为当你打电话给我们睡觉时,CPU会被用于其他东西1秒钟。因此,当前线程不使用任何处理器资源,这是一件非常聪明的事情。

积极的睡眠是绝对可以避免的,因为它浪费资源(最终通过将电力转换为热量来破坏环境;))。

无论如何,如果你真的想要这样做,你必须为处理器做一些实际的工作,这是编译器优化不会考虑的事情。例如

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

答案 1 :(得分:2)

我假设您想要了解总时间(挂钟时间,实际时间,您正在观看应用程序运行的时间)f1(),而不是CPU时间。我会调查看看gprof是否可以给你一个挂钟时间而不是处理时间。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

“睡眠”功能的全部要点是您的应用程序未运行。它被置于休眠队列中,OS将控制转移到另一个进程。如果您希望应用程序运行但不执行任何操作,则空循环是一个简单的解决方案。但是你失去了睡眠的所有好处(让其他应用程序运行,节省CPU使用/功耗)

所以你要问的是没有意义的。您无法让应用程序休眠,但仍在运行。

答案 4 :(得分: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;
    }
}

答案 5 :(得分:0)

这就是为什么在分析时查看“Switched Out%”时间非常重要。基本上,虽然你的功能的专属时间可能很少,但如果它执行例如I / O,DB等等待外部资源,然后“Switched Out%”是需要注意的指标。

答案 6 :(得分:0)

这是你用gprof得到的混乱,因为你关心的是挂钟时间。我使用this