经常会在系统中使用gettimeofday获取当前系统时间,然后在另外一处再次调用该系统函数获取系统时间,来判断一段代码的执行时间。

但由于gettimeofday的精度问题,可能存在短暂的“时光倒流”(Time Backward),如下一段程序实验

int is_less(struct timeval a, struct timeval b)
{
    if(a.tv_sec < b.tv_sec) {
        return 1;
    }
    if(a.tv_sec == b.tv_sec && a.tv_usec < b.tv_usec) {
        return 1;
    }

    return 0;
}

int main(void)
{
    while(1) {
        struct timeval last;
        gettimeofday(&last, NULL);
        struct timeval now;
        gettimeofday(&now, NULL);
        if (is_less(now, last) == 1) {
            printf("now[%lu, %lu] < last[%lu, %lu]\n",
                now.tv_sec, now.tv_usec, last.tv_sec, last.tv_usec);
            break;
        }
    }
    return 0;
}

在运行了接近12个小时后,出现了一次Time backward

详细的信息可以参考下面这个blog说明,使用time(NULL)获取时间也一样会有这个问题,实现上time函数底层就调用的gettimeofday。

http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time