C++ 理解gettimeofday系统调用

C++ 理解gettimeofday系统调用,c++,c,time,clock,system-calls,C++,C,Time,Clock,System Calls,我需要使用gettimeofday来测量使用此函数的微秒分辨率的时间差 我知道这不是最好的功能,但我想知道为什么。 在这篇文章中,AndrewStone说一年会有两次问题,我不明白如果我们只是从epoch开始计算微秒,为什么会有问题 如果我误解了人的意思,时间是秒+微秒的值,我如何解决这个问题呢?gettimeofday有两个参数: int gettimeofday(struct timeval *tv, struct timezone *tz); 根据手册页: 时区结构的使用已经过时;tz参

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

我知道这不是最好的功能,但我想知道为什么。 在这篇文章中,AndrewStone说一年会有两次问题,我不明白如果我们只是从epoch开始计算微秒,为什么会有问题


如果我误解了人的意思,时间是秒+微秒的值,我如何解决这个问题呢?

gettimeofday
有两个参数:

int gettimeofday(struct timeval *tv, struct timezone *tz);
根据手册页:

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

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

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

更好的方法是使用
clock\u gettime()
clock\u REALTIME
clock\u monotic
,具体取决于您试图测量的内容(经过的时间或时钟的变化)

编辑:您需要一个例程来减去两个
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;
}
int
timeval_减法(struct timeval*result,struct timeval*x,
结构时间值*y)
{
如果(x->tv\U usectv\U usec)
{
int nsec=(y->tv\U usec-x->tv\U usec)/1000000+1;
y->tv_usec-=1000000*nsec;
y->tv_sec+=nsec;
}
如果(x->tv\U usec-y->tv\U usec>1000000)
{
int nsec=(x->tv\u usec-y->tv\u usec)/1000000;
y->tv_usec+=1000000*nsec;
y->tv_sec-=nsec;
}
结果->电视秒=x->电视秒-y->电视秒;
结果->tv\U usec=x->tv\U usec-y->tv\U usec;
返回x->tv_秒tv_秒;
}

这与此处的类似:

很抱歉有点慢,但是您是说timeval的每个成员都具有相同的值,但分辨率不同,还是说我应该将秒转换为微秒并添加它们?如果偶数从31.12.14 23:59:59开始,到2015年结束,那就没有潜在的问题了?不,我没有说这两件事
timeval
保存秒和微秒(显然,这两个调用都是相同的),您需要编写一个小例程来从另一个中减去一个(我会在文章的第二部分为您提供一个)。我已经告诉了您潜在的问题是什么(墙时间可能会因ntp等而扭曲),以及解决这些问题的正确方法(
clock\u gettime
)。但是,如果您将
tz
参数传递给
gettimeofday
作为
NULL
,则夏令时的更改不是问题。非常感谢。最后一件事,年末没有错误计算时间的危险?年末的
gettimeofday
结果没有什么特别的变化,除了传统上在引入/删除闰秒时,正如我上面所说,这属于“调整”的危险范围。安德鲁斯通只是不知道他在说什么。但是,如果您希望避免手动时钟调整或表现不佳的ntpd(好的ntpd将始终持续进行调整,以便它们不会干扰任何东西)所导致的错误,则使用单调时钟测量间隔是一种很好的做法。