6

ネットワークデバッグ用の小さなエンジニアリングアプリを作成しました。IP アドレスのリストを取得し、ユーザーが設定したタイムアウトと速度で ping を実行します。平均往復時間を記録し、送信の 1 つが失敗するたびに、失敗の期間と発生時のタイムスタンプを記録します...

それがアイデアです。私は.Net4を搭載したWin7マシンで開発し、XPラップトップのセットに配置する必要がありました。

問題は、テスト中のボックスのデュレーション値がナイスミリ秒のデュレーションを示していることです。XP ボックスでは、0 または 15.625 (マジックナンバー?) が表示されているのを見て...文字列に面白い四角形のボックス記号がありますか?

    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");

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

質問には回答がありましたが、詳細についてはここに編集を含めます。

編集:

Win7 と WinXP の違いではなく、32bit と 64bit に違いがあったようです。

Henkが指摘するように、32 ビット Windows システムでは、システム クロックの粒度は 15 ~ 16 ミリ秒です。

64 ビット システムでは、システム コールは、より細かい粒度を持つ別のメソッド セットに対するものです。したがって、x64 の開発マシンでは、システム クロックからミリ秒の精度が得られました。

現在、ストップウォッチはプロセッサ計測器を介してハードウェア インターフェイスを使用して、はるかに細かい粒度を記録します (おそらくすべてのプロセッサ ティックではありませんが、この考え方に沿って卑猥なほど正確なものを想像します)。OS の基盤となるハードウェアにこのレベルの計測機能がない場合でも、システム時刻が使用されます。だから気をつけて!しかし、ほとんどの最新のデスクトップ/ラップトップにはこの計測器があると思います...組み込みデバイスまたはその性質のものはそうではないかもしれませんが、ストップウォッチクラスは私が見る限りコンパクトフレームワークにはありません(ここでは 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;
    }
4

1 に答える 1

5

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

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

System.Diagnostics.Stopwatchより正確なタイミングに使用 します。

于 2011-10-20T08:47:51.630 に答える