System.Diagnostics.Stopwatch 的准确度如何?

问题描述 投票:0回答:9

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

有人告诉我有时秒表会给出不正确的信息。

c# .net performance stopwatch
9个回答
22
投票

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

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


7
投票

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

一些开发人员认为秒表不准确的原因是秒表中的 ElapsedTicks 不等于 DateTime 中的 Ticks。 当应用程序代码使用 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.

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

// 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

请注意,原始链接不再提供该内容。以下是来自 Wayback Machine 的存档内容的参考: https://web.archive.org/web/20190104073827/http://geekswithblogs.net:80/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch-ticks-are-not -timespan-ticks.aspx



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

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

更多信息:

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx


2
投票
首先,在谈论时间或空间时,

精确当然不是一个可能或有意义的概念,因为物理量的经验测量不能假装是精确的。

其次,

David Bolton的博客文章可能有用。我引用的是:

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


0
投票
为什么你不分析你的代码而不是关注微基准?

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

  • N教授
  • Prof-It for C#
  • NProfiler
  • 轮廓锐利

0
投票
除了赞同上面 HUAGHAGUAH 的建议之外,我还想补充一点,您总体上应该对微基准非常怀疑。虽然密切关注的性能测试有其合理的地位,但很容易调整不重要的细节。因此,编写并验证旨在提高可读性和清晰度的代码,然后对其进行分析以找出热点在哪里(或者是否有

值得担心),然后(仅)调整这些部分。

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



0
投票
我意识到这是一个非常古老的线程,但它仍然是第一个热门话题,我想添加一些最初引导我来到这里的内容。如果你:

Console.WriteLine(timer.Elapsed.seconds.toString)
...您会定期得到非常奇怪的结果,例如“6”,而实际上需要更长的时间。这是因为乍一看,正确的调用是相当不明显的:

Console.WriteLine(timer.Elapsed.TotalSeconds.toString)
...回想起来这当然是有道理的。

© www.soinside.com 2019 - 2024. All rights reserved.