2017-04-17 345 views
1

我的目標是將時間戳存儲在納秒範圍內。假設我有兩臺需要進行通信的機器,在任務完成的時間。以納秒爲單位存儲時間戳C++

讓我們對這個問題的目的只是,說自己一個同步的時鐘。
機器A存儲當地時間。機器B發送給A,在此時完成。機器A然後計算差異。

我的問題是,是,爲TimeDifference實際上可以達到60秒,但也下降到.25ms。所以我需要以這樣的方式存儲時間,以便我可以處理這兩種情況,並計算時間差異。

由於時間紀元以來納秒是這麼大的數字,我不認爲我可以存儲在我所知道的任何變量。

你將如何解決這種情況?我目前的情況是,我可能(以某種方式)可以將時間從ns開始縮短到代表1分鐘的時間,儘管我不知道該怎麼做。

希望你能幫上忙。

問候

回答

3

只需使用一個64位整數,有符號(int64_t)或無符號(uint64_t),你會是所有罰款。

64位的空間實在是巨大的。這不僅足以存儲時間差異,而且存儲絕對時間值,這通常是從1970-01-01午夜開始計算的。

例如,現在的自1970-01-01秒數大致是:

1492432621.123456789 

在納米秒,這就是:

1492432621123456789 

爲了比較,最大的簽署64位整數值是:

9223372036854775807 

這大致對應於2262-04-12,這個日期幾乎是你幾乎肯定不會再活着了。但是,如果您仍然擔心軟件運行超過兩個世紀的可能性,在此期間不會改進,並且最終會崩潰,那麼您應該使用未簽名的 64位整數,這會給它更多的世紀,或者你應該使用128位整數,這些整數幾乎肯定是安全的,直到宇宙死亡。需要注意的是128位的整數are supported所有現代64位架構(__int128unsigned __int128),所以你可以放心地使用它們,除非,當然,你需要支持舊的32位系統。或者16位系統。 8位,任何人?

+0

稍微超過584年適合內部精度爲毫微秒的無符號64位整數。所以是的,我認爲OP會很好。 – rwols

+0

我期待這款軟件在245年內死於Y2K262問題(是的,我們仍然會使用K,即使它實際上並沒有縮短字符串的長度)。 :-) – ShadowRanger

+0

我的猜測是我的軟件不會持續到宇宙的盡頭。我要買它!謝謝! –

1

我建議使用std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>。您可以使用類型別名更漂亮。例如:

template <class Duration> 
    using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>; 
using sys_nanoseconds = sys_time<std::chrono::nanoseconds>; 

sys_nanoseconds now = std::chrono::system_clock::now(); 

這可以讓你在同一範圍內目前公認的答案(int64_t),但增加了類型安全。 int64_t可能意味着一個時間點或持續時間。sys_nanoseconds只能表示一個time_point,如果像使用時間一樣使用,將導致編譯時錯誤。

例如,將兩個sys_nanoseconds加在一起會導致編譯時錯誤。但是你可以減去兩個sys_nanoseconds,結果類型爲std::chrono::nanoseconds

你的範圍(前溢/下溢)將是:

1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807 

要獲得更大範圍的以納秒精度是有問題的價值,但可以這樣做對支持128種類型的平臺:

using nano128 = std::chrono::duration<__int128_t, std::nano>; 
using sys_nano = sys_time<nano128>; 

現在你的範圍遠遠大於+/-宇宙的年齡。

請注意,在某些平臺上,std::chrono::system_clock::now()不會以納秒的精度報告。因此存儲納秒時間戳可能會過度。然而,採取上面的代碼並將其更改爲任何你想要的單位是微不足道的。

在macOS上,system_clock::now()報告爲microseconds,其將具有範圍爲nanoseconds的1000倍。在Windows上,以1/10的microseconds單位system_clock::now()報道:

using win_sys_duration = std::chrono::duration<std::int64_t, 
               std::ratio<1, 10'000'000>>; 
using win_sys_time_point = sys_time<win_sys_duration>; 

而且在GCC,system_clock::now()報告nanoseconds

相關問題