[C++] Windows上のマイクロ秒解像度のタイムスタンプ


Answers

QueryPerformanceCounter / QueryPerformanceFrequency、プロセッサの速度の解像度

マルチスレッドには注意してください。 プロセッサ上の各コアは独自のカウンタを持つことができます。

さらに詳しい情報は、 Windows XPでの正確なタイムスタンプの取得です。

あなたがこの方法に頼る必要がなくなったら:

シリアルポート(赤外線送信機用)に手動でデータを書き込もうとしたときに、プロセスとスレッドの優先度を最大(リアルタイム)に設定すると信頼性が大幅に向上しました。私も覚えていると約40kHzの解像度を持っているので、ミリ秒の分解能で十分な精度を保つ必要があります。

Question

Windowsでマイクロ秒解像度のタイムスタンプを取得するにはどうすればよいですか?

私はQueryPerformanceCounterQueryPerformanceFrequencyよりも優れたものを探しています(これらは起動後の経過時間を与えるだけで、別のスレッドで呼び出された場合、つまりQueryPerformanceCounterが別のCPUで異なる結果を返す可能性があります)。パワーセービングのために周波数を調整するプロセッサーは、常にQueryPerformanceFrequency結果に反映されるとは限りません)。

Windows用の継続的に更新する高解像度のタイムプロバイダを実装していますが、それは実用的ではないようです。 マイクロセカンドの問題はすばらしいですが、もうダウンロードできません。

別のリソースは、 Windows XP正確なタイムスタンプを取得することですが、複数のステップが必要で、ヘルパープログラムといくつかのinitも実行します。複数のCPUで動作するかどうかはわかりません。

私はまた、Wikipediaの記事Time Stamp Counterを見てみましたが、興味深いですが、それは有用ではありません。

答えがBSDまたはLinuxでこれを行うだけであれば、それは大変簡単ですが、これを確認して、なぜこれがWindowsでは非常に難しいのか、そしてLinuxとBSDで簡単なのかを説明したいと思います。 それは同じハードウェアです...




QueryPerformanceCounterはこれに対する正しい解決策です。 あなたとあなたが答えた人とは対照的に、この呼び出しはマルチプロセッサシステムでも問題のシステムが壊れていない限り正解を返し、CPU周波数の変更も処理します。 最新のシステムでは、 RDTSCから派生していますが、マルチCPUと周波数変更の詳細をすべて処理しています。 (ただし、RDTSCよりもかなり遅いです)。

QueryPerformanceCounterを参照してください

マルチプロセッサコンピュータでは、どのプロセッサが呼び出されても問題ありません。 ただし、基本入出力システム(BIOS)またはハードウェア抽象化レイヤ(HAL)のバグにより、異なるプロセッサで異なる結果を得ることができます。




これまでの回答にはたくさんの良い情報があります。

あなたが探しているものが1970年1月1日からWindows XPまたはそれ以降の解像度でミリ秒またはそれ以上の解像度で経過時間を取得する簡単な方法であれば、AppleのOSSリリースのCurrentTime.cppには非常に簡単なクロスプラットフォームの例がありますMacOS 10.7.5用のJavaScriptCore (10.8以降のリリースでは見つからないようです)。 私が参照しているコードは、 CurrentTime()関数です。

QueryPerformanceCounter()を使用して、ミリ秒よりも高い解像度で経過時間差を計算し、システムクロックと定期的に同期させてタイムスタンプとクロックドリフトのアカウントを計算する標準的な手法を使用します。 高解像度のタイムスタンプを取得するには、 QueryPeformanceFrequency()呼び出しがQueryPeformanceFrequency()ようにWindows XP以降を実行している必要があります。

「Windowsの継続的更新、高解像度タイムプロバイダの実装」「Windowsタイムスタンププロジェクト」のように)状況を少しずつスローするコンテキストスイッチは考慮されていませんが、継続的に再同期します。 私はロケットを打ち上げることはしませんが、約50行のコードでは実装が簡単で、多くの目的に十分適しています。

また、Windows 8 / Windows Server 2012を実行することが保証されていることがわかっている場合は、 GetSystemTimePreciseAsFileTime()使用する必要がありGetSystemTimePreciseAsFileTime()これは、可能な限り高い精度(1マイクロ秒以上)でシステムの日付と時刻を返します。




私は、 PerformanceCounterFrequencyが実際の周波数から逸脱しているため、 PerformanceCounterと共にPerformanceCounterFrequencyを使用することが困難であることを発見しました。

これはオフセットによって逸脱し、熱ドリフトも示します。 新しいハードウェアはドリフトが少ないようですが、ドリフトとオフセットはかなり大きいです。 1ppmが1μs/ sなので、数ppmのドリフトはすでにマイクロ秒の精度を大幅に損なうでしょう! PerformanceCounterPerformanceCounterFrequencyを使用する場合は、ハードウェア固有の較正を慎重に行うことを強くお勧めします。 これは、特定の機能を頻繁に呼び出さない場合に「狂った結果」が観察される理由でもあります。

私はこの問題についてさらに詳細な調査を行った。 Microsecond Resolution Time Services for Windowsに説明があります