1

我正在运行一些分析测试,而 usleep 是一个有用的功能。但是当我的程序处于休眠状态时,这一次并没有出现在配置文件中。

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

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

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

我正在寻找的是一种比空while循环更好的方法来进行主动睡眠,例如:

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

7 回答 7

2

因为当您调用 usleep 时,CPU 会在 1 秒内投入其他工作。所以当前线程不使用任何处理器资源,这是一件非常聪明的事情。

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

无论如何,如果你真的想这样做,你必须给处理器做一些真正的工作,这不会被编译器优化所考虑。例如

for (i = 0; i < 1000; i++)
    time(NULL);
于 2009-07-14T13:44:21.620 回答
2

我假设您想找出 f1() 所花费的总时间(挂钟时间、实际时间、您坐着观看应用程序运行的时间),而不是 CPU 时间。我会调查看看 gprof 是否可以给你一个挂钟时间而不是一个处理时间。

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

于 2009-07-14T13:45:41.727 回答
2

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

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

于 2009-07-14T14:19:20.793 回答
1
for (int i = i; i < SOME_BIG_NUMBER; ++i);

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

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

于 2009-07-14T13:45:46.610 回答
0

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

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

例如

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;
    }
}
于 2009-07-14T13:47:03.567 回答
0

这就是为什么在分析时查看“Switched Out %”时间很重要的原因。基本上,虽然您的函数的独占时间可能很少,但如果它执行例如 I/O、DB 等,等待外部资源,那么“Switched Out %”是需要注意的指标。

于 2009-07-14T14:56:45.147 回答
0

这是您对 gprof 的困惑,因为您关心的是挂钟时间。我用这个

于 2009-07-14T15:11:14.407 回答