【发布时间】:2015-08-13 21:01:47
【问题描述】:
我经常使用 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
);
当我正常启动应用程序时,输出是:
应用程序在 00:00:01.5740900 运行,但秒表测量到 00:00:01.5732109。相差近 1 毫秒。
当我将应用程序的标准输出传送到等待一段时间后再读取其输入的进程时,我得到以下结果:
应用程序在 00:04:51.2076561 运行,但秒表测量到 00:04:51.2012677。
相差6ms以上。
发生了什么?秒表不准确吗?还是我只是误解了什么是衡量的,什么不是衡量的?
编辑:我知道 System.DateTime.Now 的分辨率较低,但预计差异会以毫秒为单位。
【问题讨论】:
标签: c# .net performance datetime time