7

Win32では、複数のプロセス/言語/システム/などで均一になる一意のCPUサイクルカウントまたは同様のものを取得する方法はありますか.

いくつかのログ ファイルを作成していますが、.NET ランタイムをホストしているため、複数のログ ファイルを作成する必要があります。そのため、2 つのファイルを生成し、それらを結合してから並べ替えて、クロスワールド コールを含む一貫したタイムラインを取得するだけでよいと考えていました。

ただし、GetTickCount はすべての呼び出しで増加するわけではないため、信頼できません。ソート時に呼び出しを正しい順序で取得できるように、より良い番号はありますか?


編集:トリックを行ったQueryPerformanceCounterへのトラックに私を置いた@Gregに感謝します。

4

5 に答える 5

12

ここに興味深い記事があります!RDTSC を使用しないで、代わりにQueryPerformanceCounterを使用するように指示します。

結論:

timeGetTime()多くの Windows ベースのオペレーティング システムでは、システム タイマーの粒度が 10 ~ 15 ミリ秒に達する可能性があるため、 通常の old to do タイミングの使用は信頼できませんtimeGetTime()。[Windows NT、2000、および XP などの NT ベースのオペレーティング システムでは、高い粒度が発生することに注意してください。Windows 95 および 98 は、約 1 ~ 5 ミリ秒という、はるかに優れた粒度を持つ傾向があります。]

timeBeginPeriod(1)ただし、プログラムの開始時 (および timeEndPeriod(1)終了時) にを呼び出す と、timeGetTime()通常は 1 ~ 2 ミリ秒の精度になり、非常に正確なタイミング情報が提供されます。

Sleep()同様に動作します。実際にスリープする時間の長さはSleep()の粒度と密接に関係しているため、 1 回 timeGetTime()呼び出した後 、実際には 1 ~ 2 ミリ秒、2 ~ 3 ミリ秒、というようにスリープします ( 10 ~ 15 ミリ秒)。timeBeginPeriod(1)Sleep(1)Sleep(2)

精度の高いタイミング (ミリ秒未満の精度) を得るには、キャリブレーションが難しいため、アセンブリ ニーモニック RDTSC の使用を避けた方がよいでしょう。代わりに、 10 マイクロ秒 (0.00001 秒) 未満の精度の と を QueryPerformanceFrequency使用し ます。QueryPerformanceCounter

単純なタイミングでは、timeGetTime と QueryPerformanceCounter の両方が適切に機能し、QueryPerformanceCounter の方が明らかに正確です。ただし、何らかの「時間指定の一時停止」(フレームレート制限に必要なものなど) を行う必要がある場合は、QueryPerformanceCounter を呼び出して特定の値に達するまで待機するループに陥らないように注意する必要があります。これにより、プロセッサが 100% 消費されます。代わりに、1 ミリ秒を超える時間を渡す必要があるときはいつでも Sleep(1) を呼び出し (最初に timeBeginPeriod(1) を忘れないでください!)、次に QueryPerformanceCounter 100% ビジー ループのみに入るハイブリッド スキームを検討してください。必要な遅延の最後の 1/1000 秒未満を終了します。これにより、CPU 使用率を最小限に抑えながら、非常に正確な遅延 (10 マイクロ秒までの精度) が得られます。

于 2008-09-26T11:52:36.787 に答える
2

System.Diagnostics.Stopwatch.GetTimestamp() は、時間の起点 (コンピューターの起動時かもしれませんが、よくわかりません) からの CPU サイクル数を返します。

CPU サイクルは各コンピューターに固有であるため、2 台のコンピューター間でログ ファイルをマージするために使用することはできません。

于 2008-09-26T11:54:16.347 に答える
2

RDTSC の出力は、現在のコアのクロック周波数に依存する場合があります。これは、最新の CPU では一定ではなく、マルチコア マシンでは一定ではありません。

システム時刻を使用し、複数のシステムからのフィードを扱う場合は NTP 時刻ソースを使用します。そうすれば、信頼できる一貫した時間の読み取り値を取得できます。オーバーヘッドが目的に対して大きすぎる場合は、HPETを使用して、最後に既知の信頼できる時間の読み取り値からの経過時間を計算する方が、HPET を単独で使用するよりも優れています。

于 2008-09-26T11:57:27.150 に答える
1

ログ ファイルをマージするときに、GetTickCount を使用して別のカウンターを追加します。異なるログ ファイル間で完全な順序が得られるわけではありませんが、少なくとも各ファイルのすべてのログが正しい順序で保持されます。

于 2008-09-26T11:53:27.957 に答える