【问题标题】:Getting Negative Values Using clock_gettime使用 clock_gettime 获取负值
【发布时间】:2013-07-16 08:38:36
【问题描述】:

在以下程序中,我尝试测量作业的执行时间(for 循环)。大多数时候它工作正常,但是,有时它会返回负值!我的第一个猜测是变量可能会溢出。谁能告诉我我是否正确?我该如何解决这个问题?

谢谢

int main(int argc, char **argv) 
{
long int ST;
long int ET;
struct timespec gettime_now;
clock_gettime(CLOCK_REALTIME, &gettime_now);
ST= gettime_now.tv_nsec;
for (i=0; i < 1000; i++)
  a[i]=b[i];
clock_gettime(CLOCK_REALTIME, &gettime_now);
ET= gettime_now.tv_nsec;
printf("Time diff: %ld\n", ET-ST);
}

【问题讨论】:

标签: c time clock


【解决方案1】:

在这两种情况下,您都忽略了tv_secstruct timespec,只使用纳秒,这是不正确的,因为STEV 的tv_nsec 可能具有不同的秒数。

来自man

tv_sec - 表示自纪元以来的秒数

tv_nsec - 当前秒,精度为纳秒(1/1000000000 秒)

最好编写自己的函数来找出差异。示例代码(未测试),

timespec diff(timespec start, timespec end)
{
    timespec temp;

    if ((end.tv_nsec-start.tv_nsec)<0
    {
            temp.tv_sec = end.tv_sec-start.tv_sec-1;
            temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    }
    else 
    {
            temp.tv_sec = end.tv_sec-start.tv_sec;
            temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}

请参阅this 了解实际的diff 功能和示例。

【讨论】:

  • 我确信我正在测量的工作不到 1 秒。所以,我忽略了 tv_sec 部分。
  • 是的,你是对的.... 明白了。我试一试,然后在这里报告结果。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多