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
されます)ただし、そのようなことに影響を受けることは許可されていません。
この場合の「安定した」についての別の考え方は、20.11.3 [time.clock.req] / 2の表で定義されている要件にあります。
表59でC1
、C2
はクロックタイプを示しています。t1
およびt2
はC1::now()
、コールが戻るt1
前にコールが戻る場所から返される値で、t2
これらの両方のコールがの前に行われC1::time_point::max()
ます。[注:これはC1
、t1
との間でラップしなかったことを意味しt2
ます。—エンドノート]
式:C1::is_steady
戻り値:const bool
操作上のセマンティクス:true
if t1 <= t2
が常にtrueであり、クロックの刻みの間の時間が一定である場合、それ以外の場合false
。
それが標準の違いです。
ベンチマークを行う場合std::high_resolution_clock
は、プラットフォームがQueryPerformanceCounter
このクロックに高解像度タイマー(Windowsなど)を使用している可能性が高いため、最善の策はになるでしょう。ただし、ベンチマークを行う場合は、プラットフォームごとに異なる方法で処理するため、ベンチマークにプラットフォーム固有のタイマーを使用することを検討する必要があります。たとえば、一部のプラットフォームでは、(同じCPUで実行されている他のプロセスとは無関係に)プログラムに必要な実際のクロック数を決定する手段が提供される場合があります。さらに良いことに、実際のプロファイラーを手に入れ、それを使用してください。