2017-04-17 30 views
1

私の目標は、タイムスタンプをナノ秒の範囲で保存することです。私は、通信が必要なマシンが2つあり、正確に何時にタスクが完了したとしましょう。タイムスタンプをナノ秒で保存するC++

ちょうど質問のために、彼らは同期クロックと言いましょう。
マシンAはローカル時間を保存します。マシンBはAに送信し、その時点で完了です。マシンAはその差を計算します。

私の問題は、時間差が実際にだけでなく、ダウン.25msに、60秒までできること、です。だから私はそのような方法で時間を保存する必要があり、両方を扱うことができ、時差を計算することができます。

ナノ秒単位でエポックは、このような大きな数であることから時以来、私は私の知っている任意の変数にそれを保存することができるとは思いません。

この状況にどのように対処しますか?私の現在のところは、どういうわけか考えていないが、おそらく(何とか)エポックからnsの時間を1分を表すビットまで縮尺することができるということだ。

希望すると助かります。

敬具

答えて

3

だけで64ビット整数を使用し、(int64_t)または符号なし(uint64_t)に署名し、あなたはすべて大丈夫です。

64ビットのスペースは本当に巨大です。時間差を保存するだけでなく、1970-01-01深夜から経過した時間として測定される絶対時間値を保存することさえできます。

今1970-01-01からの秒数は、おおよそ、例えば、:ナノ秒で

1492432621.123456789 

、これは:比較のため

1492432621123456789 

、署名された最大64ビットの整数値は:

9223372036854775807 

これは、おおよそ2262-04-12に相当します。確かにもう生きていないでしょう。

しかし、あなたのソフトウェアが2世紀以上にわたって実行されており、その間に改善されずに最終的にクラッシュする可能性があるのであれば、符号なし 64ビット整数それは何世紀にもわたって何世紀にもわたっています。あるいは、宇宙が死ぬまでほぼ確実に安全な128ビットの整数を使うべきです。もちろん、あなたがレガシー32ビットシステムをサポートする必要がある、しない限り、128ビット整数のすべての近代的な64ビットアーキテクチャ(__int128またはunsigned __int128)によってare supported、これはあなたが安全に、それらを使用できることに注意してください。または16ビットシステム。 8ビット、誰ですか?

+0

ナノ秒の精度を持つ符号なし64ビット整数の内側には、わずか584年しか収まりません。そう、ええ、私はOPがうまくいくと思います。 – rwols

+0

私はこのソフトウェアが245年のうちにY2K262問題で死ぬのを楽しみにしています(実際には文字列を短くしなくてもKを使用します)。 :-) – ShadowRanger

+0

私の推測では、私のソフトウェアは宇宙の終わりまで続くことはないだろう。買います!ありがとう! –

1

std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>をお勧めします。あなたは型エイリアスでこれをもっときれいにすることができます。例:これはあなたの現在受け入れ答え(int64_t)と同じ範囲を取得しますが、

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は、時刻または時間を意味する場合があります。sys_nanosecondsは、time_pointを意味することができ、期間のように使用するとコンパイル時エラーになります。

たとえば、sys_nanosecondsを2つ追加するとコンパイル時にエラーが発生します。しかし、2つを引いて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

関連する問題