代码之家  ›  专栏  ›  技术社区  ›  Jérôme

如何进行积极睡眠?

  •  1
  • Jérôme  · 技术社区  · 17 年前

    我正在运行一些分析测试,usleep是一个有用的函数。但当我的程序正在休眠时,这一次不会出现在配置文件中。

    如果我有一个功能:

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

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

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

    while (1) {
        if (gettime()  == whatiwant)
            break;
    }
    
    7 回复  |  直到 17 年前
        1
  •  2
  •   Keith Smith    17 年前

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

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

        2
  •  2
  •   IlDan    17 年前

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

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

    不管怎样,如果您真的想这样做,您必须给处理器一些实际的工作,这是编译器优化无法解决的问题。例如

    for (i = 0; i < 1000; i++)
        time(NULL);
    
        3
  •  2
  •   J. Polfer    17 年前

    我假设您想找出f1()所花费的总时间(墙时钟时间、现实世界时间、您坐在那里观看应用程序运行的时间),而不是CPU时间。我会调查一下gprof是否能给你一个挂钟时间而不是处理时间。

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

        4
  •  1
  •   Stack Overflow is garbage    17 年前
    for (int i = i; i < SOME_BIG_NUMBER; ++i);
    

    在“sleep”函数中,您的应用程序没有运行。它被放入一个睡眠队列,操作系统将控制权转移到另一个进程。如果您希望应用程序运行,但什么都不做,空循环就是一个简单的解决方案。但是您会失去睡眠的所有好处(让其他应用程序运行,节省CPU使用率/功耗)

    所以你的要求毫无意义。您不能让应用程序休眠,但仍在运行。

        5
  •  0
  •   Goz    17 年前

    唯一的选择是做一个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;
        }
    }
    
        6
  •  0
  •   Ariel    17 年前

    这就是为什么分析“关闭百分比”时间很重要的原因。基本上,虽然您的函数的独占时间可能很短,但如果它执行I/O、DB等操作,等待外部资源,那么“switched out%”就是要注意的指标。

        7
  •  0
  •   Community Mohan Dere    9 年前

    这是你对gprof的困惑,因为你关心的是挂钟时间。我用 this .