自午夜以来以最低的延迟获取纳秒

我想获取自午夜以来当前的纳秒数,并且延迟最少。

我的平台是带有Clang的Linux / Centos 7。我不在意可移植性。

我找到了这个<chrono> struct, 但它们除以秒/毫秒等即可得到结果。

我还发现可以修改几秒钟:

struct timeval tv;
int msec = -1;
if (gettimeofday(&tv,NULL) == 0)
{
    msec = ((tv.tv_sec % 86400) * 1000 + tv.tv_usec / 1000);
}

https://stackoverflow.com/a/10499119/997112

但是他们再次使用除法。 有什么更快的方法,可以避免模数和除数?

我认为最快的方法是:

  • 现在获取时间
  • 将小时,分钟秒数乘以必要的纳秒数,然后将当前的毫微秒数加到总数中

kyony 回答:自午夜以来以最低的延迟获取纳秒

没有任何硬件可以提供纳秒级计数器。因此必须使用提供其他功能(例如“ CPU周期”)的硬件,并由某个地方的软件进行缩放。

Linux上的clock_gettime()函数将为您扩展到纳秒级。更重要的是(取决于安全性与性能的折衷),这可以纯粹在用户空间中完成,从而避免调用内核API的开销(这可能比同等划分的开销至少贵10倍)。

但是;在这些规模上,您需要非常具体地了解您的实际需求。例如;在leap秒中会发生什么? 2台计算机可能仅因一台被配置为拖延leap秒而另一台未配置leap秒而不同意。

再举一个例子;如果您要计算延迟(例如“ latency = current_time_at_receiver - time_packet_says_it_was_sent”),则可能有2台计算机不同步(例如,发送方的时钟比接收方的时钟晚几秒钟,因此延迟最终为负数);为了解决这个问题,您可能需要一个训练阶段(有点像NTP协议),在该阶段您尝试估算两台计算机的时间来源之间的初始时差,然后进行监视/跟踪(以尝试补偿任何长时间术语漂移)。

本文链接:https://www.f2er.com/3084580.html

大家都在问