C# System.DateTime.Now产生了不好的结果

C# System.DateTime.Now产生了不好的结果,c#,.net,.net-2.0,C#,.net,.net 2.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

实用工具的主要逻辑如下所示:

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()
method spews控制台输出,我可以观察5-6秒钟)。但它报告说“跑步花了00:00:01”

我不期望时间有微秒的精度,但为什么它在这里是如此的不准确

更新:
根据建议,我还在同一时期内运行了一个秒表,并与减去两个日期时间进行了比较,同时还调试了代码。这两种方法只需要几分之一秒<调试器中的代码>秒表有1139毫秒。我的假设是,不知何故,写入控制台的时间并不包括在内,但我无法支持(或反驳它)。

对于这种测量,DateTime不是很准确。你应该使用秒表类


对于这种测量,日期时间不是很准确。你应该使用秒表类


要对你所看到的是真正发生的事情有信心,请为测试而写:

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

此外,最好将类用于您的目的

要对您所看到的实际情况充满信心,请为测试编写:

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);
此外,最好使用类实现您的目的

为什么不使用秒表呢

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

Console.WriteLine("Elapsed time: {0}", ss.Elapsed.TotalMilliseconds);
为什么不用秒表

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

Console.WriteLine("Elapsed time: {0}", ss.Elapsed.TotalMilliseconds);
打印“5”。你确定你的测试用例是这样的吗



打印“5”。你确定你的测试用例就是这样吗?

我怀疑问题出在
日期时间上。很可能,程序完成了并将输出发送到控制台缓冲区,而控制台缓冲区正以最快的速度实际显示输出。你看到的是输出滞后。

我怀疑问题出在
DateTime
上。很可能,程序完成了并将输出发送到控制台缓冲区,而控制台缓冲区正以最快的速度实际显示输出。您看到的是输出滞后。

您试过调试它吗?我想您应该使用并查看一下您是否了解
System.Diagnostics.Stopwatch
类?是持续时间跨度约为5-6秒的值,这是一个不正确显示的问题???我运行了您的代码,但没有发现任何问题,。试着调试代码您试过调试它吗?我想您应该使用并查看一下您是否了解
系统。诊断。秒表
类?是持续时间跨度约为5-6秒的值,这是一个显示不正确的问题???我运行了您的代码,但没有发现任何问题,。尝试调试代码不精确到最接近的秒?“我觉得很难相信。”约翰,我同意。也许你可以尝试关闭主方法中的控制台输出。不精确到最近的秒?“我觉得很难相信。”约翰,我同意。也许你可以试着在主方法中关闭控制台输出。在长时间运行时,它似乎不那么不准确。我甚至想知道控制台是否比程序的实际ed落后几秒钟。。。它向控制台写入很多行。我可能会比较一下秒表,看看是否能看到相同的结果。如果运行时间较长,则不太准确。我甚至想知道控制台是否比程序的实际ed落后几秒钟。。。它向控制台写入很多行。我可能会比较一下秒表,看看是否有相同的结果。你的测试用例和我的不一样。在控制台上写几千行文字,手动计时,与计时器告诉你的时间比较,让我知道你看到了什么?@John是的,控制台滞后。谢谢。那似乎是相当确定的。你的测试用例和我的不一样。在控制台上写几千行文字,手动计时,与计时器告诉你的时间比较,让我知道你看到了什么?@John是的,控制台滞后。谢谢。这似乎相当确凿。