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

C# System.Diagnostics.Stopwatch的准确度如何?,c#,.net,performance,stopwatch,C#,.net,Performance,Stopwatch,系统、诊断、秒表的准确度如何?我正在尝试为不同的代码路径做一些度量,我需要它是精确的。我应该使用秒表还是有其他更精确的解决方案 有人告诉我,有时秒表会给出不正确的信息。MSDN有秒表的编号。他们还展示了它在纳秒内的精确度。希望这有帮助 首先,精确在谈论时间或空间时当然不是一个可能的或有意义的概念,因为任何物理量的临时测量都不能假装精确 第二,他的博客文章可能很有用。我引用: 如果使用高分辨率计数器计时,则精确到微秒。它实际上精确到纳秒(10-9秒,即十亿分之一秒),但还有太多其他的东西在进行,纳

系统、诊断、秒表的准确度如何?我正在尝试为不同的代码路径做一些度量,我需要它是精确的。我应该使用秒表还是有其他更精确的解决方案


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

MSDN有秒表的编号。他们还展示了它在纳秒内的精确度。希望这有帮助

首先,精确在谈论时间或空间时当然不是一个可能的或有意义的概念,因为任何物理量的临时测量都不能假装精确

第二,他的博客文章可能很有用。我引用:

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


除了支持上面HUAGHAGUAH的建议外,我还要补充一点,总体而言,你应该对微观基准非常怀疑。虽然密切关注的性能测试有一个合理的位置,但很容易调整不重要的细节。因此,编写并验证为可读性和清晰性而设计的代码,然后对其进行分析,找出热点在哪里(或者是否有值得担心的地方),然后(仅)调整这些部分


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

为什么你不分析你的代码,而专注于微基准测试

有一些很好的开源探查器,如:


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


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

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


更多信息:

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

System.Diagnostics.Stopwatch类确实可以准确测量经过的时间,但ElapsedTicks方法的工作方式让一些人得出结论,它不准确,当他们的代码中确实存在逻辑错误时

一些开发人员认为秒表不准确的原因是秒表上的刻度与日期时间内的刻度不相等。 当应用程序代码使用ElapsedTicks创建新的日期时间时,会出现问题

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); 
下面有一篇文章更详细地解释了这个问题:

我运行了他们的示例代码。它说精确到0纳秒以内,其中一次测试的结果是-657ms。不是很有帮助!精确和准确不是一回事。您的计算机没有纳秒精度。它甚至没有毫秒精度,是的。不总是这样,但最近的计算机使用RDTSC CPU指令。它可以精确到CPU的频率(如3GHz)。然而,我遇到了一些较新的硬件问题,其中秒表的频率约为2MHz(因此我猜Windows使用的是主板上的其他时钟),但由于某些原因,频率不是很稳定,导致误差达到毫秒。。。这就是我浏览stackoverflow的原因。请注意,Google Code上的NProf网站说,NProf不再处于开发阶段,而是建议使用。有用的信息,但这是另一个问题的答案。这并没有回答问题,正如前面所述。对评论的回答是“。不回答问题”:相反。如果你读到它,这就回答了问题:“我应该使用秒表还是有其他更准确的解决方案?”。它只是没有回答问题的标题。除此之外,这里的一些人(像我一样)认为改进建议是重要且受欢迎的答案,对我来说,这还包括对替代解决方案的参考。我有一些问题需要理解,为什么这里似乎有不少人需要批评(?)Phillm:同意,但不幸的是,这是谷歌的顶级结果,因为“秒表分辨率”的毫秒精度足够吗?就你的目的而言,应该足够了。定义“精确”。我知道它可以给你毫秒,但我被告知,在很多情况下,它是不精确的。永远不要依赖于任何东西的单一测量来获得精确性。将每个代码路径运行几分钟,计算迭代次数以获得平均值。我写了一篇关于这方面的文章。它显示了如何从秒表类中获得良好的测量结果:顺便说一句,因为这是一个非常古老的问题,在运行在较新硬件上的较新的网络中,秒表的精度要高得多,因为(正如李·格里肖姆在评论克内尔曼的答案时所说),现在它是QueryPerformanceCounter的包装器