可以在生产代码中使用秒表吗?

时间:2010-05-10 18:30:19

标签: c# timer system.diagnostics stopwatch

我需要一个准确的计时器,而DateTime.Now似乎不够准确。从我读到的描述中,System.Diagnostics.Stopwatch似乎正是我想要的。

但我有恐惧症。我对在实际生产代码中使用System.Diagnostics中的任何内容感到紧张。 (我广泛使用Asserts和PrintLns等进行调试,但从未用于生产。)我不仅仅是尝试使用计时器来测试我的功能 - 我的应用程序需要一个实际的计时器。我在另一个论坛上看到System.Diagnostics.StopWatch仅用于基准测试,不应该在零售代码中使用,尽管没有给出理由。这是正确的,还是我(以及任何发布该建议的人)对System.Diagnostics过于封闭?即,在生产代码中使用System.Diagnostics.Stopwatch是否可以? 谢谢 阿德里安

7 个答案:

答案 0 :(得分:57)

在引擎盖下,几乎所有秒表都会包裹QueryPerformanceCounter。据我所知,秒表是为了​​提供对高分辨率计时器的访问 - 如果你在生产代码中需要这个分辨率,我认为使用它没有任何问题。

答案 1 :(得分:23)

是的,System.Diagnostics听起来好像仅用于调试,但不要让名字欺骗你。 System.Diagnostics命名空间可能看起来有些可怕,因为它首先在生产代码中使用(它确实适用于我),但在该命名空间中有很多有用的东西。

某些内容(例如Process类)对于与系统进行交互很有用。使用Process.Start,您可以启动其他应用程序,为用户启动网站,打开文件或文件夹等。

其他内容(例如Trace类)可以帮助您跟踪生产代码中的错误。当然,您不会总是在生产代码中使用它们,但它们非常对于记录和跟踪远程机器上难以捉摸的错误非常有用。

不要担心这个名字。

答案 2 :(得分:5)

你说你已经在另一个论坛上读到不在生产中使用System.Diagnostics中的类。但是你应该担心的唯一来源是创建代码的微软。他们说StopWatch class

  

提供一组方法和属性,可用于准确测量经过的时间。

他们没有说,“除了生产”。

答案 3 :(得分:4)

Afaik StopWatch是一个超过QueryPerformanceCounter功能的shell。这个功能是很多性能计数器相关测量的基础。 QPF呼叫非常快,非常安全。如果您对诊断命名空间感到妄想,请直接pInvoke QPF。

答案 4 :(得分:3)

秒表是basically a neat wrapper围绕原生QueryPerformanceCounterQueryPerformanceFrequency方法。如果您对使用System.Diagnostic命名空间感到不舒服,可以access these directly

使用性能计数器很常见,没有任何问题。 AFAIK,没有更高的计时器精度。请注意,QPF可能导致多处理器计算机出现问题,但之前链接的MSDN文章提供了一些有关此问题的其他信息。建议System.Diagnostics.Stopwatch在后​​台执行此操作或手动调用SetThreadAffinity - 否则您的计时器可能及时跳回

请注意,对于非常高精度的测量,需要考虑some subtleties。如果你需要这么高的精度,这些可能会引起一些关注。

答案 5 :(得分:3)

.NET基类库中有几个不同的计时器类 - 哪一个最适合您的需求只能由您决定。

Here is a good article from MSDN magazine on the subject (Comparing the Timer Classes in the .NET Framework Class Library).

答案 6 :(得分:0)

根据您使用计时器的内容,您可能还需要考虑其他问题。 Windows不提供执行时间的保证,因此您不应该依赖它来进行任何实时处理(对于提供硬实时调度的Windows,您可以获得实时扩展)。我还怀疑在捕获时间间隔之后以及在使用依赖于其精度的事情之前,您可能会因上下文切换而丢失精度。原则上,这可能是一段任意长的时间;在实践中它应该是毫秒级。这实际上取决于关键任务的关键时刻。