1. ホーム
  2. c++

[解決済み] std::system_clock と std::steady_clock の違い?

2022-11-10 03:45:24

質問

とはどのような違いがあるのでしょうか? std::system_clockstd::steady_clock ? (異なる結果/動作を説明する例題は素晴らしいでしょう)。

私の目標が関数の実行時間を正確に測定することである場合(ベンチマークのように)、次のうち何が最良の選択でしょうか? std::system_clock , std::steady_clockstd::high_resolution_clock ?

どのように解決するのですか?

N3376からです。

20.11.7.1 [time.clock.system]/1:

クラスのオブジェクト system_clock は、システム全体のリアルタイムクロックから壁時計の時間を表します。

20.11.7.2 [time.clock.steady]/1:

クラスのオブジェクト steady_clock はクロックを表し、そのクロックの time_point の値は物理的な時間が進んでも減ることはなく time_point の値は実時間に対して一定の速度で進む。つまり、時計が調整されることはありません。

20.11.7.3 [time.clock.hires]/1:

クラスのオブジェクト high_resolution_clock は、最も短い刻み周期を持つ時計を表します。 high_resolution_clock の同義語かもしれません。 system_clock または steady_clock .

例えば、システム全体の時計は夏時間のようなものに影響されるかもしれません。その場合、将来のある時点でリストされる実際の時間は、実際には過去の時間であることがあります。(例: 米国では、秋になると時間が 1 時間戻るため、同じ時間を 2 回経験することになります)。しかし steady_clock はそのようなものに影響されることは許されません。

この場合の "steady" についての別の考え方は、20.11.3 [time.clock.req]/2 の表で定義されている要件にあります。

表59において C1C2 はクロックの種類を表します。 t1t2 が返す値です。 C1::now() を返す呼び出しは t1 を返す呼び出しの前に発生します。 t2 を返す呼び出しの前に起こり、これらの呼び出しの両方が C1::time_point::max() . [ 注意: これは C1 の間で折り返されていないことを意味します。 t1t2 . -終了メモ ]。

式になります。 C1::is_steady

を返します。 const bool

演算セマンティクス。 true もし t1 <= t2 が常に真で、クロックの刻みの間の時間が一定である場合、 そうでなければ false .

規格の違いはこれだけです。

もしベンチマークを行いたいのであれば、おそらく最良の方法は std::high_resolution_clock というのは、あなたのプラットフォームは高解像度のタイマー (たとえば QueryPerformanceCounter など) を使用している可能性が高いからです。しかし、ベンチマークを行う場合、プラットフォームによって扱いが異なるため、ベンチマークにプラットフォーム固有のタイマーを使用することを本当に考慮すべきです。例えば、あるプラットフォームでは、プログラムが必要とする実際のクロックティック数(同じCPU上で動作する他のプロセスとは無関係)を決定するための何らかの手段を提供するかもしれません。さらに良い方法は、本物のプロファイラーを手に入れ、それを使用することです。