2012-02-26 54 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之間的差異並不總是正的。