2012-02-26 51 views
3

这里就是我需要做的:C++中的便携式精确双精度时间戳?

double now=getdoubletimestampsomehow(); 

凡getdoubletimestampsomehow()应该是直接的,易于使用的函数返回代表指定日期的经过的秒数的双重价值。我需要它非常精确,但我并不需要它比几毫秒更精确。可移植性非常重要,如果无法将它直接移植到任何地方,可以请告诉我一个unix和windows的方法吗?

+0

你在看什么,为什么这些可能性不足?你看过[Boost](http://www.boost.org/doc/libs/1_49_0/doc/html/date_time.html)和[Qt](http://developer.qt)中的日期/时间设施。 nokia.com/doc/qt-4.8/qdatetime.html)?你真的需要时间戳是“双”吗? – 2012-02-26 22:55:23

+2

[C++跨平台高分辨率计时器]的可能重复(http://stackoverflow.com/questions/1487695/c-cross-platform-high-resolution-timer) – 2012-02-26 22:55:23

回答

2

在C++中的便携式良好的精度双时间戳吗?

没有使用第三方库的高精度时间戳(毫秒)没有可移植的方法。使用time/localtime/gmtime,您将获得最高精度为1秒。

如果你的罚款与第三方库,使用升压或Qt的4

既是UNIX和Windows操作方式来做到这一点?

GetSystemTime在Windows上和在Linux上的gettimeofday

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

在Windows平台上,有可用于确定自多少时间已经过去了,在过去(QueryPerformanceCounter)一些点高度精确的功能,但它们没有连接到时间戳。

+0

不幸的是(或者幸运:))这个答案已经过时(通过C++ 11)。 – 2016-10-10 18:16:59

-1

双打并不精确 - 因此你在double now=getdoubletimestampsomehow();的想法会在第一个障碍中倒下。

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

+0

'双'具有有限和变化的精度。这与“不精确”不一样。 – 2012-02-26 23:04:47

2

C++ 11引入了<chrono>头文件,其中包含了很多便携式时钟。其中最高分辨率的时钟是std::chrono::high_resolution_clock

它提供当前时间为std::chrono::time_point对象,其中包含time_since_epoch成员。这可能包含你想要的。

Reference

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

的C++ 11计时头文件提供了三个标准时钟,可以被用于定时一个的代码:

  • SYSTEM_CLOCK - 这是由系统所使用的实时时钟;
  • high_resolution_clock - 这是当前系统上可能的最短滴答周期时钟;
  • steady_clock - 这是一个保证永不调整的单调时钟。

如果要衡量执行某一段代码所花费的时间,你应该一般采用steady_clock,这是从来没有被系统调整单调时钟。由计时标头提供的另外两个时钟可以偶尔调整,所以两个连续时刻t1之间的差异并不总是正的。