System.Diagnostics.Stopwatch有多准确?

System.Diagnostics.Stopwatch有多准确? 我正在尝试为不同的代码path做一些指标,我需要它是确切的。 我应该使用秒表还是有另一种更准确的解决scheme。

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

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

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

  • NProf
  • Prof-It for C#
  • NProfiler
  • ProfileSharp

我刚刚写了一篇文章,解释了如何进行testing设置以获得高精度(优于0.1ms)的秒表。 我认为这应该解释一切。

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

千万不要依赖任何一个单一的测量精度。

运行每个代码path几分钟,并计算迭代次数以获得平均值。

System.Diagnostics.Stopwatch类可以准确地测量已经过去的时间,但ElapsedTicks方法的工作方式已经导致了一些人得出这样的结论,即当他们的代码中只有一个逻辑错误时,它是不准确的。

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

如有必要,可以按照以下方式将秒表持续时间转换为date时间:

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

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

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

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

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

使用秒表类,我们只能粗略估计执行时间。 对于每个执行它返回不同的值,所以我们不得不平均不同的执行。

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

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

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

除了借鉴HUAGHAGUAH的build议之外,我还要补充一点,你应该非常怀疑微基准。 虽然近距离的性能testing有一个合法的地方,但调整一个不重要的细节是很容易的。 因此,为了可读性和清晰性,编写和validation代码,然后对其进行分析以找出热点的位置(或者是否值得担心),然后调整(仅)这些部分。

我记得与一位程序员一起工作,他微调了一些在系统等待人工input时执行的代码。 节省的时间绝对消失在按键之间的差距!