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

C++ 从午夜开始以最低延迟获得纳秒,c++,linux,performance,time,C++,Linux,Performance,Time,我想得到从午夜开始的纳秒数,以最低的延迟 我的平台是带有Clang的Linux/Centos 7。我不关心可移植性 我发现了这个, 但它们是除以秒/毫秒等得到结果的 我还发现这个可以在纳秒内修改: struct timeval tv; int msec = -1; if (gettimeofday(&tv, NULL) == 0) { msec = ((tv.tv_sec % 86400) * 1000 + tv.tv_usec / 1000); } 但他们再次使用除法是否有

我想得到从午夜开始的纳秒数,以最低的延迟

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

我发现了这个, 但它们是除以秒/毫秒等得到结果的

我还发现这个可以在纳秒内修改:

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

但他们再次使用除法是否有更快的方法避免模数和除法?

我认为最快的方法是:

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

?没有任何硬件提供纳秒计数器;因此,提供其他功能(如“CPU周期”)的硬件必须由软件在某处使用和扩展

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

但是,;在这些尺度上,你需要非常具体地说明你真正想要什么。例如在闰秒期间预计会发生什么?2台计算机可能不同意,因为一台配置为涂抹闰秒,而另一台没有


再比如,;如果要计算延迟(例如“
latency=receiver处的current\u time\u-time\u packet\u表示它已发送
”),则两台计算机可能不同步(例如,发送方的时钟比接收方的时钟晚几秒,因此延迟最终为负);为了解决这个问题,您可能需要一个培训阶段(有点像NTP协议),在这个阶段,您尝试估计两台计算机的时间源之间的初始差异,然后进行监视/跟踪(尝试补偿任何长期漂移)。

我记得上一次这样做时,有一个内核配置选项,可以从CPU的时基寄存器完全在用户空间中为
gettimeofday()
提供服务。如果您担心除法,也许您可以存储原始值,然后稍后再处理它?现在整数除法不是很快吗?你为什么这么担心?@marko我会使用rdtsc(),但我现在将now()与一个数据包时间戳进行比较,该时间戳从午夜开始为纳秒。@user997112:处理这些消息所花费的时间很可能会使整数除法相形见绌。你为什么特别需要纳秒呢?@user997112:另外,从午夜开始的时间重要吗?因为每当用户重置系统时钟时,“午夜”就会改变。或者改变时区。仅供参考:
gettimeofday
肯定需要超过60个周期。这两台机器都是NTP或PTP同步的。我在数据包中有从午夜开始的纳秒数,我需要接收器上的纳秒数。“延迟=接收器上的当前时间-数据包上的时间表示它已发送”这正是我想要的like@user997112:在这种情况下,存在一个不可避免的难题-任何类型同步(如PTP)的准确性取决于网络延迟;而且,您无法以比网络延迟所允许的更高的精度来测量网络延迟。@user997112:根据您的目标(例如,为了基准测试的目的,特别是对于“请求和响应”协议而言),“往返时间/2”(仅涉及一台计算机的时间源)可能是一个不错的选择(可能包括服务器通知客户端在接收请求和发送回复之间的“处理时间”,以便客户端可以计算“网络延迟”=(往返时间-处理时间)/2),其中仅使用服务器的时间源计算处理时间).你假设的是数据包输入->数据包输出,事实并非如此。我只是问,从午夜开始,我是如何从接收器上获得纳秒数的。