-1

我确信答案很简单,但我不太明白。我正在尝试struct timespec使用以下代码计算两者之间的增量:

struct timespec start, finish, diff;
int ndiff;

/* Structs are filled somewhere else */

diff.tv_sec = finish.tv_sec - start.tv_sec;
ndiff = finish.tv_nsec - start.tv_nsec;
if (ndiff < 0) {
    diff.tv_sec--;
    ndiff = 1L - ndiff;
}
diff.tv_nsec = ndiff;

printf("Elapsed time: %ld.%ld seconds.\n", diff.tv_sec, diff.tv_nsec);

但是,输出总是类似于Elapsed time: 0.300876000 seconds.这似乎表明我正在丢失纳秒的最后三位数字(因为这些数字不应该总是为零)。有人能指出是什么原因造成的吗?

4

1 回答 1

2

经过时间:0.300876000 秒。这似乎表明我正在丢失纳秒的最后三位数字(因为这些数字不应该总是为零)。有人能指出是什么原因造成的吗?

代码的时钟报告精度为 1000 ns。 @ 约翰布林格@rici

和/或

diff.tv_sec不一定是long. 使用匹配的说明符。

// printf("Elapsed time: %ld.%ld seconds.\n", diff.tv_sec, diff.tv_nsec);
// Also insure fraction is printed with 9 digits
printf("Elapsed time: %lld.%09ld seconds.\n", (long long) diff.tv_sec, diff.tv_nsec);

此外,更新ndiff.

ndiff = finish.tv_nsec - start.tv_nsec;
if (ndiff < 0) {
  diff.tv_sec--;
  // ndiff = 1L - ndiff;
  ndiff += 1000000000;
}

更好的是,删除int diff变量。

diff.tv_sec = finish.tv_sec - start.tv_sec;
diff.tv_nsec = finish.tv_nsec - start.tv_nsec;
if (diff.tv_nsec < 0) {
    diff.tv_sec--;
    diff.tv_nsec += 1000000000;
}

应该finish发生在 之前start,那么可能需要其他代码来保持 2 个成员diff具有相同的符号。

于 2017-11-06T22:18:41.347 回答