在C++中可移植精度良好的双时间戳

Portable good precision double timestamp in C++?

本文关键字:时间戳 精度 C++ 可移植      更新时间:2023-10-16

以下是我需要做的:

double now=getdoubletimestampsomehow();

其中,getdoubletimestampsomehow()应该是一个简单易用的函数,返回一个双值,表示从给定日期起经过的秒数。我需要它非常精确,但我真的不需要它比几毫秒更精确。可移植性非常重要,如果不能直接将其移植到任何地方,你能告诉我unix和windows的方法吗?

您看过Boost,尤其是它的Date_Time库吗?以下是自epoch以来的秒数示例。

你很难找到更便携、分辨率更高的东西。

C++中可移植的高精度双时间戳?

如果不使用第三方库,就无法获得高精度时间戳(毫秒)。使用time/localtime/gmtime,您将获得1秒的最大精度。

如果你对第三方库很满意,可以使用Boost或Qt4。

既用unix又用windows?

Windows上的CCD_ 4和linux上的CCD_。

请注意,如果您计划使用时间戳来确定某些事件的顺序,那么这可能是个坏主意。系统时钟的精度可能非常有限(在windows平台上为10毫秒),在这种情况下,执行的几个操作可能会产生相同的时间戳。因此,要确定事件的顺序,您需要"逻辑时间戳"("矢量时钟"就是其中一个例子)。

在windows平台上,有一些高度精确的函数可以用来确定自过去的某个点(QueryPerformanceCounter)以来已经过去了多少时间,但它们与时间戳无关。

C++11引入了包含相当多的可移植时钟的<chrono>标头。其中分辨率最高的时钟是std::chrono::high_resolution_clock

它将当前时间提供为具有time_since_epoch成员的std::chrono::time_point对象。这可能包含您想要的内容。

参考:

在C++11标准发布之前,没有一种标准的方法可以准确地测量一段代码的执行时间。程序员被迫使用外部库,如Boost,或每个操作系统提供的例程。

C++11 chrono头文件提供了三个标准时钟,可用于对代码进行计时:

  • system_clock-这是系统使用的实时时钟
  • high_resolution_clock-这是当前系统上可能具有最短滴答周期的时钟
  • steady_clock-这是一个单调的时钟,保证永远不会被调整

如果你想测量某段代码执行所花费的时间,你通常应该使用steady_clock,这是一个单调的时钟,系统永远不会调整它。由计时头提供的另外两个时钟可以偶尔调整,因此两个连续时刻之间的差t0<t1并不总是正的。

双打并不精确,因此你认为double now=getdoubletimestampsomehow();在第一个跨栏时摔倒了。

其他人提到了其他可能性。我会探索这些。