C++ 理解gettimeofday系统调用
我需要使用gettimeofday来测量使用此函数的微秒分辨率的时间差 我知道这不是最好的功能,但我想知道为什么。 在这篇文章中,AndrewStone说一年会有两次问题,我不明白如果我们只是从epoch开始计算微秒,为什么会有问题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
有两个参数:
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将始终持续进行调整,以便它们不会干扰任何东西)所导致的错误,则使用单调时钟测量间隔是一种很好的做法。