2009-04-24 12 views
9

プロファイリングツールに高性能イベントタイマー(HPET)を使用して、非常に高精度の測定を迅速に行うことを望みます。 timeGetTimeは1msで十分な解像度を提供せず、QueryPerformanceCounterは私が望むよりもはるかに低速です。問題を研究しているときに私はHPETに出くわしましたが、実際にそれをどうやって得るのかのサンプルは見当たりません。HPETはWindowsで直接アクセスできますか?

私はそれを直接使用できますか(アセンブリは問題ありません)、またはWin32 APIに既に組み込まれているマルチメディア/高性能タイミングツールに依存する必要がありますか?

+1

私はそれを使いたいと思います。私のプロファイラで同じ問題が発生します。 – leppie

+0

これは関連しているようです:http://msdn.microsoft.com/en-us/magazine/cc163996.aspx –

+0

さらに更新されます:RDTSCと 'QueryPerformanceCounter'は、システムのベース周波数が一定でない場合(システム内のオーバークロック)。 Windowsでは、タイミングがずれている場合にはQPC周波数を調整できません。そのような場合、HPETとACPIは信頼性の高いタイマーの唯一の選択肢です。 **したがって、この質問は未解決のまま開いています。** – Mysticial

答えて

-1

私はthis infoを見つけましたが、これは最も費用対効果の高い方法です。私は組み立てを掘るために勇気を得るときにそれを試してみます。 :)

UPDATE

私は私のプロファイラでこれをテストしました。少し速いですが、私はまだ他のオーバーヘッドのトンを持っているようです:(私はそれが十分な利益のように見えなかったので、タイミングを気にしませんでした)

+3

いいえ! RDTSCを使用しないでください。マルチコアマシンでは奇妙なことが起こります。それ自身のカウンターを持つ各コアは、負の時間を取る関数のような効果を与えることができます。タイムスタンプカウンタは常に同期しているわけではありません。 そこには、それを行った。 –

+0

スレッドを追跡しているとしますか?どのように違いに影響を与えることができますか? – leppie

+1

スレッドを追跡すると、*問題があるかどうか*問題があるかどうか、または問題を解決する方法がないかもしれないことが伝えられます。 RDTSCを安全に使用するには、スレッドを特定のコアに固定する必要があります。ユーザー空間からのコア間でRDTSCの差異を安全に計算する方法はありません。 –

1

私はHPETの使用にも興味があります私がそれを理解する方法は、QueryPerformanceCounterとQueryPerformanceFrequencyは実際にはHPETのカウンタとクロックにアクセスしており、これはWindows XPで動作します(http://www.geisswerks.com/ryan/FAQS/timing.htmlなどを参照)。

タイミングコードまでは、 QueryPerformanceCounterを使用すると、実際にはHPETのベースを形成するカウンタにアクセスすることができます。これはプロセッサではなくチップセットにすべて存在します。

+2

私が理解しているように、XPはHPETをサポートしていないので、QueryPerformanceCounterは実際にRDTSCを使用しています。 –

+0

は完全な説明のために(「使用との互換性」にXP SP3に注意してください)https://en.wikipedia.org/wiki/High_Precision_Event_Timer#cite_note-7を参照してください。手短に言えば、XPはソフトウェアとさまざまなハードウェアで「ベストエフォート」HPET _エミュレーション_を使用します。 –

関連する問題