了解gettimeofday系统调用

时间:2014-02-24 13:17:11

标签: c++ c time clock system-calls

我需要使用gettimeofday来测量使用此函数的微秒分辨率的时间差。

我知道这不是最好的功能,但我想了解原因。 在这个question安德鲁·斯通说明会有一个问题两次,我不明白为什么如果我们只是从纪元计算微秒就会出现问题。

如果我误解了这个人,时间是秒的值+微秒,我怎么能解决这个问题呢?

1 个答案:

答案 0 :(得分:4)

gettimeofday有两个参数:

int gettimeofday(struct timeval *tv, struct timezone *tz);

根据手册页:

  

timezone结构的使用已经过时;通常应将tz参数指定为NULL。

如果你这样做,它将简单地返回自纪元以来的秒和微秒,即不涉及时区。在这方面,谁以不同的方式告诉你是错误的。

但是,你还是要小心一点。虽然你不会看到这种提前或延迟一小时,但我相信你会发现它会前进并延迟,因为墙上时间会被ntp之类的东西调整。因此,两次调用之间经过的微秒数可能不是两次结果之间的差异(例如,如果ntp正在推进或延迟时钟)。

更好的途径是将clock_gettime()CLOCK_REALTIMECLOCK_MONOTONIC一起使用,具体取决于您要测量的内容(经过时间或时钟变化)。

编辑:您希望例程减去两个timeval结构。这是一个:

int
timeval_subtract (struct timeval *result, struct timeval *x,
                  struct timeval *y)
{
  if (x->tv_usec < y->tv_usec)
    {
      int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
      y->tv_usec -= 1000000 * nsec;
      y->tv_sec += nsec;
    }

  if (x->tv_usec - y->tv_usec > 1000000)
    {
      int nsec = (x->tv_usec - y->tv_usec) / 1000000;
      y->tv_usec += 1000000 * nsec;
      y->tv_sec -= nsec;
    }

  result->tv_sec = x->tv_sec - y->tv_sec;
  result->tv_usec = x->tv_usec - y->tv_usec;

  return x->tv_sec < y->tv_sec;
}

与此处类似:http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html