28

System.Diagnostics.Stopwatch的准确性如何?我正在尝试为不同的代码路径做一些指标,我需要它是准确的。我应该使用秒表还是有其他更准确的解决方案。

有人告诉我,有时秒表会提供不正确的信息。

4

8 回答 8

21

我刚刚写了一篇文章,解释了必须如何进行测试设置才能从秒表中获得高精度(优于 0.1 毫秒)。我认为它应该解释一切。

http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx

于 2010-03-04T12:30:35.560 回答
7

System.Diagnostics.Stopwatch 类确实准确地测量了经过的时间,但是 ElapsedTicks 方法的工作方式使一些人得出结论,即它不准确,而实际上他们的代码中确实存在逻辑错误。

一些开发人员认为秒表不准确的原因是秒表中的 ElapsedTicks 不等于 DateTime 中的刻度。当应用程序代码使用 ElapsedTicks 创建新的 DateTime 时,就会出现问题。

var watch = new Stopwatch();
watch.Start();
... (perform a set of operations)
watch.Stop();
var wrongDate = new DateTime(watch.ElapsedTicks); // This is the WRONG value.

如有必要,可以通过以下方式将秒表持续时间转换为 DateTime:

// This converts stopwatch ticks into DateTime ticks.
// First convert to TimeSpan, then convert to DateTime
var rightDate = new DateTime(watch.Elapsed.Ticks); 

这里有一篇文章更详细地解释了这个问题:http: //geekswithblogs.net/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch-ticks-are-not-timespan-ticks。 aspx

于 2015-11-17T21:55:08.670 回答
2

首先,在谈论时间或空间时,精确当然不是一个可能或有意义的概念,因为任何物理量级的经验测量都不能假装是精确的。

其次,David Bolton的博客文章可能有用。我引用:

如果这是用高分辨率计数器计时的,那么它将精确到微秒。它实际上是精确到纳秒(10-9 秒,即十亿分之一秒),但是还有很多其他的东西,纳秒精度真的有点毫无意义。在对代码进行计时或基准测试时,您应该进行多次运行并取平均时间——因为在 Windows 下运行的其他进程、正在发生多少交换到磁盘等,两次运行之间的值可能会有所不同。

于 2008-12-26T18:03:16.247 回答
2

秒表类在不同的配置下返回不同的值,因为频率取决于安装的硬件和操作系统。

使用秒表类,我们只能粗略估计执行时间。对于每次执行,它返回不同的值,因此我们必须对不同的执行取平均值。

更多信息:http: //msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

于 2010-03-18T10:19:49.147 回答
1

除了支持上述 HUAGHAGUAH 的建议外,我还要补充一点,您应该对一般的微基准非常怀疑。虽然密切关注的性能测试有一个合法的位置,但很容易调整一个不重要的细节。因此,编写并验证为可读性和清晰性而设计的代码,然后对其进行分析以找出热点在哪里(或者是否有任何值得担心的地方),然后(仅)调整这些部分。

我记得与一位程序员一起工作,他对系统等待人工输入时执行的一些代码进行了微优化。节省的时间在击键之间的延迟中完全消失了!

于 2008-12-26T18:20:58.940 回答
1

如果你想要更精确的时间。看看 QueryPerformanceCounter。QueryPerformanceCounter的 MSDN 链接。这里给出了一个简洁的实现。该示例为 CE 加载 coredll.dll,对于 Windows,您应该加载 Kernel32.dll,如 MSDN 文档中所述。

于 2011-11-28T14:26:35.650 回答
0

MSDN 有一些秒表的例子。他们还用它来显示它在纳秒内的准确度。希望这可以帮助!

于 2008-12-26T17:30:38.620 回答
0

为什么你不分析你的代码而不是专注于微基准?

有一些很好的开源分析器,例如:

于 2008-12-26T18:27:18.257 回答