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