从午夜开始以最低的延迟获得纳秒

Get nanoseconds since midnight with the lowest latency

本文关键字:延迟 午夜 开始      更新时间:2023-10-16

我想获得自午夜以来的当前纳秒数,延迟最低。

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

我找到了这个CCD_ 1结构,但是它们除以秒/毫秒等得到结果。

我还发现了这个可以在纳秒内修改的东西:

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

但他们又在使用除法有什么更快的方法可以避免模数和除法吗

我认为最快的方法是:

  • 现在抓紧时间
  • 将小时、分钟、秒乘以必要的纳秒,然后将当前的纳米数添加到总数中

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

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

然而;在这些尺度上,你需要非常明确你真正想要的是什么。例如闰秒的预期是什么?两台计算机可能会因为一台配置为涂抹闰秒而另一台没有而产生分歧。

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