いくつかのネットワークデバッグのための小さなエンジニアリングアプリケーションを作成しました。 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;
}
おそらく問題の解決策ではありませんが、暗黙的に行うのではなく、明示的に文字列に変換するためにTotalMilliseconds.ToString()を使用する必要があります。 – Polynomial
@Polynomialこれはまったく同じコードを生成するため、絶対に不要です。 –