gpt4 book ai didi

c# - System.Diagnostics.Stopwatch 不准确吗?

转载 作者:行者123 更新时间:2023-11-30 13:26:09 27 4
gpt4 key购买 nike

我经常使用 System.Diagnostics.Stopwatch 来测量代码的执行时间。该文档说它应该非常准确。我相信测量时间与真实时间的差异仅在于用于启动和停止秒表的时间。

我通过下面的代码估计了这个错误有多大:

var sw = new Stopwatch();
sw.Start();
sw.Stop();

它测得:00:00:00.0000090。哇。误差小于 10us。

现在,时隔多年,我又开始对秒表感到好奇了。真的那么准确吗?它测量挂钟时间吗?或者它究竟测量什么的定义在哪里?进程被IO操作阻塞怎么办?还是那么准确?

我又做了小benchmark:

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

当我正常启动应用程序时,输出是:

The application was running 00:00:01.5740900, but the stopwatch measured 00:00:01.5732109. The difference is almost 1ms.

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

The application was running 00:04:51.2076561, but the stopwatch measured 00:04:51.2012677.

相差超过6ms。

发生了什么事?秒表不准确吗?还是我只是误解了什么是衡量的和什么不是衡量的?

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

最佳答案

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

还要注意 StopWatch 是 QueryPerformanceCounter 上的一个外壳功能。

例如,您可以查看这篇文章:Performance Tests: Precise Run Time Measurements with System.Diagnostics.Stopwatch

关于c# - System.Diagnostics.Stopwatch 不准确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30555941/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com