我想检查clock_gettime
的可靠性,使用已弃用的gettimeofday
作为参考,但有时会得到奇怪的结果:
#include <stdio.h>
#include <sys/time.h>
#include <iostream>
void clock_gettime_test()
{
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
long a = tp.tv_nsec;
usleep(250000);
clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
long b = tp.tv_nsec;
printf("clock_gettime (%ld - %ld): %lf msec\n", b, a, (b - a)/1000000.0);
}
void gettimeofday_test()
{
struct timeval tv;
gettimeofday(&tv, NULL);
long a = tv.tv_usec;
usleep(250000);
gettimeofday(&tv, NULL);
long b = tv.tv_usec;
printf("gettimeofday (%ld - %ld): %lf msec\n", b, a, (b - a)/1000.0);
}
int main()
{
clock_gettime_test();
gettimeofday_test();
return 0;
}
构建和运行,我有时会得到正确的结果:
$ g++ -Wall play.cpp -lrt && ./a.out
clock_gettime (392441961 - 142299879): 250.142082 msec
gettimeofday (592906 - 342644): 250.262000 msec
但有时候,我没那么幸运:
clock_gettime (155321165 - 905000848): -749.679683 msec
gettimeofday (352232 - 101938): 250.294000 msec
甚至:
clock_gettime (947857371 - 697373625): 250.483746 msec
gettimeofday (225208 - 974908): -749.700000 msec
我在i686和amd64上都试过这个,并得到类似的结果。我也试过了nanosleep
,结果也很悲惨。
答案 0 :(得分:6)
您只是在比较tv_nsec
struct timespec
成员,而您还应该比较tv_sec
成员:
double msec = ((tpb.tv_sec - tpa.tv_sec) * 1000.0)
+ ((tpb.tv_nsec - tpa.tv_nsec) / 1000000.0);
同样,您应该比较tv_sec
的{{1}}和tv_usec
成员来获取已用时间:
struct timeval
答案 1 :(得分:0)
来自Unix,C, and C++ function reference:
时间有两个 组件,都是整数。一个(称为tv_sec)就是那个值 将按时间返回,即自1970年1月1日以来的秒数。 另一个(称为tv_usec)是进入该数量的微秒数 第二
因此,tv_usec将每秒重置一次。这就是你得到这个结果的原因。考虑秒数,你可能会有1000毫秒 - 749.679683毫秒~250毫秒。