System.Diagnostics.Stopwatch 有多准确?我正在尝试为不同的代码路径做一些指标,并且我需要它是准确的。我应该使用秒表还是有其他更准确的解决方案。
有人告诉我有时秒表会给出不正确的信息。
我刚刚写了一篇文章,解释了如何进行测试设置才能使秒表获得高精度(优于 0.1 毫秒)。我认为它应该可以解释一切。
http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx
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
精确当然不是一个可能或有意义的概念,因为物理量的经验测量不能假装是精确的。
其次,David Bolton的博客文章可能有用。我引用的是:
如果这是用高分辨率计数器计时的,那么它将精确到微秒。它实际上精确到纳秒(10-9 秒,即十亿分之一秒),但还有太多其他事情发生,纳秒精度确实有点毫无意义。在对代码进行计时或基准测试时,您应该进行多次运行并获取平均时间 - 因为 Windows 下运行的其他进程、正在发生多少交换到磁盘等,两次运行之间的值可能会有所不同。
有值得担心),然后(仅)调整这些部分。
我记得与一位程序员一起工作,他对系统等待人类输入时执行的一些代码进行了微优化。节省的时间完全消失在按键之间的延迟中!
QueryPerformanceCounter 的 MSDN 链接。 here给出了一个简洁的实现。该示例加载适用于 CE 的 coredll.dll,对于 Windows,您应该加载 Kernel32.dll,如 MSDN 文档中所述。
Console.WriteLine(timer.Elapsed.seconds.toString)
...您会定期得到非常奇怪的结果,例如“6”,而实际上需要更长的时间。这是因为乍一看,正确的调用是相当不明显的:
Console.WriteLine(timer.Elapsed.TotalSeconds.toString)
...回想起来这当然是有道理的。