Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Diagnostics.Stopwatch是否不准确?_C#_.net_Performance_Datetime_Time - Fatal编程技术网

C# System.Diagnostics.Stopwatch是否不准确?

C# System.Diagnostics.Stopwatch是否不准确?,c#,.net,performance,datetime,time,C#,.net,Performance,Datetime,Time,我经常使用System.Diagnostics.Stopwatch来测量代码执行所需的时间。 文件上说应该非常准确。 我相信测量的时间与事实的不同之处在于用来启动和停止秒表的时间 我通过以下代码估计了此错误的严重程度: var sw = new Stopwatch(); sw.Start(); sw.Stop(); 测量时间:00:00:00.0000090。哇!误差小于10us 几年后的今天,我又开始对秒表好奇了。真的这么精确吗?它能测量挂钟时间吗?或者,它究竟衡量什么的定义在哪里?如果进程

我经常使用System.Diagnostics.Stopwatch来测量代码执行所需的时间。 文件上说应该非常准确。 我相信测量的时间与事实的不同之处在于用来启动和停止秒表的时间

我通过以下代码估计了此错误的严重程度:

var sw = new Stopwatch();
sw.Start();
sw.Stop();
测量时间:00:00:00.0000090。哇!误差小于10us

几年后的今天,我又开始对秒表好奇了。真的这么精确吗?它能测量挂钟时间吗?或者,它究竟衡量什么的定义在哪里?如果进程被IO操作阻塞怎么办?还是那么精确吗

我又做了一次小基准测试:

var sw = new Stopwatch();
var startTime = System.DateTime.Now;
sw.Start();
for (int i = 0; i < 1000; i++) {
    Console.WriteLine(i);
    Console.Error.WriteLine(i);
}
var endTime = System.DateTime.Now;
sw.Stop();
Console.Error.WriteLine(
    @"The application was running {0}, but the stopwatch measured {1}.",
    endTime - startTime,
    sw.Elapsed
);
var sw=新秒表();
var startTime=System.DateTime.Now;
sw.Start();
对于(int i=0;i<1000;i++){
控制台写入线(i);
控制台错误写入线(i);
}
var endTime=System.DateTime.Now;
sw.Stop();
Console.Error.WriteLine(
@“应用程序正在运行{0},但秒表的测量值为{1}。”,
结束时间-开始时间,
西南经过
);
当我正常启动应用程序时,输出为:

应用程序正在运行00:00:01.5740900,但秒表的测量值为00:00:01.5732109。差几乎是1毫秒

当我将应用程序的标准输出传输到在读取其输入之前等待一段时间的进程时,我得到以下结果:

应用程序正在运行00:04:51.2076561,但秒表的测量值为00:04:51.2012677

差异超过6ms

发生了什么事?秒表不准吗?或者我只是误解了什么是度量的,什么不是度量的


编辑:我知道System.DateTime.Now分辨率较低,但我希望差异以毫秒为单位。

我认为您不需要依赖单一测量。您需要运行检查几次(可能是20到50次),然后取平均值

还需要注意的是,秒表是一种功能上的外壳


例如,您可以查看这篇文章:

秒表很好,是
结束时间-开始时间
错了

DateTime。现在
的分辨率比秒表低

发件人:

Now属性经常用于度量性能。但是,由于其分辨率较低,因此不适合用作基准测试工具。更好的选择是使用Stopwatch类


由于操作系统和进程不是实时的,这种精确的测量甚至可以被认真对待吗?我的意思是,当执行经常被打断时,测量执行时间有什么意义呢?@SriramSakthivel我已经修改了我的answer@Dusan-绝对是在现代硬件和操作系统上!请阅读优秀MSDN文章中的更多内容: