2011-08-08 15 views
9

スタティックStopwatchコンストラクタ内で、高解像度のパフォーマンスカウンタが存在するかどうかを基本的にチェックする次のコードを見ることができます。 MSDNで.NETストップウォッチに関する高解像度パフォーマンスカウンタとその存在についての説明?

static Stopwatch() 
{ 
    if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency)) 
    { 
     IsHighResolution = false; 
     Frequency = 0x989680L; 
     tickFrequency = 1.0; 
    } 
    else 
    { 
     IsHighResolution = true; 
     tickFrequency = 10000000.0; 
     tickFrequency /= (double) Frequency; 
    } 
} 

は約QueryPerformanceFrequencyを言う:

は1つが

が存在する場合は、正確にそれをしないときは、しかし、かなり不明だ、高解像度のパフォーマンスカウンタの周波数を取得します。存在する?私はそれが現在のマシン上に存在すると思われますが、正確にはそうではありませんか?

存在しない場合、StopwatchDateTime.UtcNowプロパティの周りの単なるラッパーになるので面白いです。

+2

まだ存在していない私はマシンを渡って来なかった。私が直面している実際的な主な問題は、ハードウェアのバグによって引き起こされる動作のバグです。たとえば、スレッドが別のコアでスケジュールされると、時間は前進/後退することができます。 – CodesInChaos

+3

Windows Mobileでは、これを実装するためにプラットフォームビルダまではオプションです。 –

+0

このクラスの "IsHighResolution"および "Frequency"プロパティはこの質問に答える必要があります。注:仮想マシン[VMWare ESXでは0の頻度を見つけましたが、バージョンは覚えていません]は表示されなくなりました。[マシンはw2k3からw2k8に移行されているため、VMWareまたはWindowsでもかまいません:-) ] br ++ mabra – mabra

答えて

1

システム時間の実際の分解能はミリ秒のオーダである(1/10ミリ秒であると主張されているにもかかわらず、決してその解像度を確実に提供するワークステーションは見たことがない)。

しかし、ナノ秒までの解像度を提供する追加のハードウェア(タイムコードリーダーなど)を使用することができます。これらは通常、IPC(産業用PC)に準拠した工業用制御システムでDAQハードウェアを同期させるために使用されます。 PCI Express Slot Cards. Time code processor for PCI express low-profile x1 local busに100   ns解像度の例があります。

一般的なワークステーションでは、ほとんどの場合、高解像度のカウンタが使用されますが、実際には、ハードウェアを追加することなく、解像度がマイクロ秒またはナノ秒になることはありません。

+0

私はすべての新しいマシンで高精度のタイマーを見つけており、その解決はnsアリーナにあります。 VMWareコミュニティには興味深いホワイトペーパーがあります(おそらくVMWare自身が書いたものです)。どのタイマーがエミュレートされているのか、どのように説明されていますか。 br ++ mabra – mabra

4

タイマーとストップウォッチとの間に違いがあり、2つの誤った前提を混同します。残念なことに、タイマーという用語は、複数のことをすべてあまりにも頻繁に意味するために使用されます。

Windows 2000以降を実行しているマシンでは、高頻度タイマーが発生している可能性があります。私は決してそのようなことがないWindows 2000を実行するコンピュータで実行したことはありません。

これは高周波タイマです。タイマーもあります:Windowsコンポーネントまたは.NETコンポーネント。これらのタイマーは、時間を維持するために、または時間を測定するために使用されるのではなく、定期的な間隔でアクションを実行するために使用されます。 Windowsタイマーオブジェクトは1ミリ秒の分解能があり、コンピュータがCPUを大量に使用する操作に関与していない場合は非常に信頼性があります。 .NETタイマオブジェクトは、約15 msの分解能に制限されています。 P/Invokeを使ってWindowsオブジェクトと直接対話できますが、それは必要ではありません。

.NET Stopwatchクラスは、高頻度タイマーに基づいています。一般に、Startは、パフォーマンスカウンタを照会し、その値を格納します。 Stopを実行すると、パフォーマンスカウンターが再度照会されます。経過時間は、これら2つの値の簡単な減算です。 は、ストップウォッチからのマイクロ秒分解能より優れています。

実際、Stopwatchをビジー待機ループで作成すると、ミリ秒以下の解像度が得られます。私はあなたがそれを使ってサブマイクロ秒の解像度を得ることができるかどうかは疑問です。

理解することは重要なことは、タイマーがは、経過時間を計測はるかに正確である1ミリ秒、ストップウォッチ、超えた信頼性がない、ということです。おそらく、ストップウォッチからのマイクロ秒レベルの経過時間測定を信頼することができます。それを越えて、私はそれに数えません。

関連する問題