clock_gettime返回一个无意义的值

时间:2013-03-08 06:07:48

标签: c++ linux time

我试图在linux中模拟一个以恒定速率下降的点。为了实现这一点,我需要花时间达到毫秒级的分辨率。现在这部分很好,但是我遇到了 clock_gettime 的问题。

当' tv_nsec'字段回绕到大约100000000,它开始回到零附近, clock_gettime 检索的时间是在上一次迭代检索的时间之前。请注意,每次字段换行时都不会发生这种情况,但确实会发生。

为了调试,我让它写下从 clock_gettime 返回的值并重新获得delta值:

  

迭代:

     

gettime.seconds:1362720808,gettime.us:993649771,总数:1362721801649我们
  delta:0.014

     

另一次迭代:

     

gettime.seconds:1362720808,gettime.us:993667981,总数:1362721801667我们
  delta:0.015

     

另一次迭代:

     

gettime.seconds:1362720808,gettime.us:993686119,总数:1362721801686我们

  delta:0.015

     

有问题的迭代:

     

gettime.seconds:1362720809,gettime.us:20032630,总数:1362720829032我们
  delta:-972.661

请注意,delta是以秒为单位的,这是通过将毫秒除以1000来计算的,其中结合从过去的时间减去未来的时间,等于负数,然后将其除以1000,三角洲是积极的。

重现问题的代码在这里:

 
#include <iostream>
#include <sys/time.h>

using namespace std

double prevMillis = 0.0;

double getMillis()
{
    timespec ts;

    clock_gettime(CLOCK_REALTIME, &ts);

    cout << "gettime.seconds: " << ts.tv_sec << " , gettime.us: " << ts.tv_nsec << ", total: " << ((ts.tv_sec * 1000) + (ts.tv_nsec / 1000)) << " ms" << endl;

    return ((ts.tv_sec * 1000) + (ts.tv_nsec / 1000)) + 0.5;
}

int main()
{
    double delta = 0.0;

    prevMillis = getMillis();

    while(delta >= 0)
    {
        delta = (getMillis() - prevMillis) / 1000;

        prevMillis = getMillis();

        cout << "Delta: " << delta << endl << endl;
    }

    return 0;
}

请注意,必须使用&#39; -lrt&#39;用于时钟功能。

这将循环直到问题发生,即由于时间而Δ为负。我的电脑上只需几秒钟。

对于冗长的问题感到抱歉,但感谢您提前获得的任何帮助:)

1 个答案:

答案 0 :(得分:4)

tv_nsec 纳秒,即一秒的十亿分之一(1 / 1,000,000,000)。然而,你的计算就是将其视为微秒。

以下是修复:

return ((ts.tv_sec * 1000) + (ts.tv_nsec / 1000000)) + 0.5;
                                               ^^^