0

ユーティリティツールの主なロジックは、次のような関数にあります。

private void Run()
{
    DateTime startTime = DateTime.Now;
    Prepare();
    Search();
    Process();
    DateTime endTime = DateTime.Now;
    TimeSpan duration = endTime.Subtract(startTime);
    Console.WriteLine("Run took {0:00}:{1:00}:{2:00}",
        (int)duration.TotalHours, duration.Minutes, duration.Seconds);
}

これを実行すると、自分の目で少なくとも5秒かかることがわかります(Process()メソッドは、5〜6秒間発生することを観察できるコンソール出力を吐き出します)。しかし、「実行には00:00:01がかかりました」と報告されます。

マイクロ秒の精度になる時間は期待していませんが、なぜここで完全に不正確なのですか?

更新: アドバイスに従って、私もStopWatch同じ期間に実行し、2を引くことと比較しDateTime、コードをデバッグしました。2つの方法はほんの一瞬で一致します...StopWatchデバッガーでは1139ミリ秒でした。私の仮説は、どういうわけかコンソールへの書き込み時間は含まれていませんが、それをバックアップする(または反証する)方法がないということです。

4

5 に答える 5

2

あなたが見ているものが実際に起こっていることであると確信するために、テストのために書いてください:

DateTime startTime = DateTime.Now;
Thread.Sleep(5000);
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime.Subtract(startTime);
Console.WriteLine("Run took {0:00}:{1:00}:{2:00}",
        (int)duration.TotalHours, duration.Minutes, duration.Seconds);

また、目的に合わせてストップウォッチクラスを使用することをお勧めします

于 2013-03-13T11:49:30.267 に答える
2

問題がにあるとは思えませんDateTime。おそらく、プログラムは終了し、出力をコンソールバッファに送信しました。コンソールバッファは、実際に出力を表示するのに時間がかかっています。あなたが見ているのは出力ラグです。

于 2013-03-13T12:29:10.980 に答える
1

ストップウォッチを使ってみませんか?

Stopwatch ss = new Stopwatch();
ss.Start();
// Some quantity of work..... 
ss.Stop();

Console.WriteLine("Elapsed time: {0}", ss.Elapsed.TotalMilliseconds);
于 2013-03-13T11:51:15.053 に答える
0

DateTimeは、この種の測定ではあまり正確ではありません。ストップウォッチクラスを使用する必要があります。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

于 2013-03-13T11:46:30.970 に答える
0
DateTime startTime = DateTime.Now;
Thread.Sleep(5000);
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime.Subtract(startTime);
Console.WriteLine(duration.Seconds);

「5」を出力します。あなたのテストケースはそれが何であるかを確信していますか?

于 2013-03-13T12:06:41.140 に答える