System.Diagnostics.Stopwatch 的准确度如何?我正在尝试为不同的代码路径做一些指标,我需要它准确。我应该使用秒表还是有另一种更准确的解决方案。
有人告诉我,有时秒表会提供不正确的信息。
答案 0 :(得分:20)
我刚刚写了一篇文章,解释了如何进行测试设置以获得秒表的高精度(优于0.1ms)。我认为它应该解释一切。
http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx
答案 1 :(得分:5)
System.Diagnostics.Stopwatch类可以准确地测量经过的时间,但是ElapsedTicks方法的工作方式使得一些人得出的结论是,当他们的代码中只有一个逻辑错误时,它不准确。 / p>
一些开发人员认为秒表不准确的原因是秒表的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
答案 2 :(得分:3)
首先,当谈论时间或空间时,精确当然不是一个可能或有意义的概念,因为没有物理量级的经验测量可以假装是精确的。
其次,David Bolton的博客文章可能很有用。我在引用:
如果用高分辨率计数器计时,则精确到微秒。它实际上精确到纳秒(10-9秒,即十亿分之一秒)但是还有很多其他的东西正在发生,纳秒精度确实有点无意义。在对代码进行计时或基准测试时,您应该进行多次运行并占用平均时间 - 因为在Windows下运行的其他进程,到磁盘的交换量等等,两次运行之间的值可能会有所不同。
答案 3 :(得分:2)
答案 4 :(得分:2)
秒表类在不同的配置下返回不同的值,因为频率取决于安装的硬件和安装。操作系统。
使用秒表类我们只能粗略估计执行时间。并且对于每次执行,它返回不同的值,因此我们必须取不同执行的平均值。
更多信息:http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
答案 5 :(得分:2)
如果您想要更精确的计时。看一下QueryPerformanceCounter。 QueryPerformanceCounter的MSDN链接。给出了一个简洁的实现here。该示例为CE加载coredll.dll,对于Windows,您应该按照MSDN文档中的说明加载Kernel32.dll。
答案 6 :(得分:0)
MSDN有some example秒表。它们还显示它在纳秒内的准确度。希望这有帮助!
答案 7 :(得分:0)
除了上面提到HUAGHAGUAH的建议之外,我还要补充一点,你应该对微观基准一般持怀疑态度。虽然密切关注的性能测试具有合法的地位,但很容易调整一个不重要的细节。因此,编写并验证为便于阅读和清晰而设计的代码,然后对其进行分析以找出热点的位置(或者 是否值得担心),然后调整(仅)这些部分
我记得和一位程序员一起工作,他们对系统等待人工输入时执行的一些代码进行了微优化。节省时间的时间在按键之间完全消失了!