2011-10-20 11 views
6

いくつかのネットワークデバッグのための小さなエンジニアリングアプリケーションを作成しました。 IPアドレスのリストを取得し、ユーザー設定のタイムアウトとレートでそれらにpingします。それは平均往復時間をログに記録し、1つの送信に失敗するたびに、それは失敗の持続時間とそれが起こったときのタイムスタンプを記録します...32bitと64bit Windowsの間の日時粒度

それは考えです。私は.Net4でWin7マシンでそれを開発し、そのセットをXPラップトップのセットに入れなければならなかった。

問題は、テスト中に私のボックスの持続時間の値が、0または15.625(マジックナンバー?)を表示したときにXPボックスに表示され、nice ms持続時間を示しています。文字列?

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _upTime = DateTime.Now; 
     var span = _upTime.Subtract(_downTime); 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 

これはログを処理するビットです。 _ipStatusはpingの失敗の理由(通常はタイムアウト)です。

_downEventLog.AppendLine(" Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n"); 

これは印刷を行うビットです...誰もこの明白な違いについて光を当てることはできますか?

質問は回答されましたが、私はここにいくつかの情報を追加します。

EDIT:

違いはwin7のとWinXPの違いが、32ビットおよび64ビットまでではなかったようです。

Henkが指摘している32ビットWindowsシステムでは、システムクロックの粒度は15-16msであり、これはタイムスパンで16ms未満のすべての値に対して15.625という値を与えました。

64ビットシステムでは、システムコールははるかにきめ細かい粒度の異なる別のセットのメソッドです。だからx64の私の開発マシンでは、私はシステムクロックからmsの精度を持っていました!

ここで、ストップウォッチはプロセッサインストゥルメンテーションを介してハードウェアインターフェイスを使用して細かい粒度を記録します(おそらくすべてのプロセッサティックではありませんが、私はこの考えに沿ってぼんやりと正確なものを想像します)。 OSの基礎となるハードウェアにこのレベルの計測機能がない場合は、システム時間が使用されます。だから注意してください!しかし、私はほとんどの近代的なデスクトップ/ラップトップは、この機器を持っていると思います...埋め込まれたデバイスやその性質のものではないかもしれませんが、ストップウォッチクラスは私が見ることができる限りCompact Frameworkにはありません(ここではQueryPerformanceCounter ))。

これはすべて役立ちます。それは私を助けてくれました。どこか_spanStopWatch初期化子周り

if (!_spanStopWatch.IsHighResolution) 
    { 
     throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine."); 
    } 

ナット及びボルト:

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _spanStopWatch.Stop(); 
     var span = _spanStopWatch.Elapsed; 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 
+0

おそらく問題の解決策ではありませんが、暗黙的に行うのではなく、明示的に文字列に変換するためにTotalMilliseconds.ToString()を使用する必要があります。 – Polynomial

+2

@Polynomialこれはまったく同じコードを生成するため、絶対に不要です。 –

答えて

5

0または15.625(?マジックナンバー)

はい、DateTime.Nowを使用することですCPUタイムスライスの長さにのみ正確で、ハードに応じて15〜20ミリ秒ウェアとOSのバージョン。

System.Diagnostics.Stopwatchを使用すると、より正確なタイミングが得られます。

+2

+1;あなたが 'Stopwatch'で問題を経験するなら、この質問をチェックしてください:http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible –

+0

私はもう少し読んだことがあります...私はそれがこの細かいことだと思う。私の開発マシンは64ビットです...より細かい粒度を持つ別の呼び出しを使用します。 – tigerswithguitars

+0

@Henkストップウォッチの使い方のスニペットを教えてください。私はMSDNを熟読しますが、経験豊富なユーザーの入力があるのはいつもいいことです!多くのありがとうございます。 – tigerswithguitars

関連する問題