78

I need an accurate timer, and DateTime.Now seems not accurate enough. From the descriptions I read, System.Diagnostics.Stopwatch seems to be exactly what I want.

But I have a phobia. I'm nervous about using anything from System.Diagnostics in actual production code. (I use it extensively for debugging with Asserts and PrintLns etc, but never yet for production stuff.) I'm not merely trying to use a timer to benchmark my functions - my app needs an actual timer. I've read on another forum that System.Diagnostics.StopWatch is only for benchmarking, and shouldn't be used in retail code, though there was no reason given. Is this correct, or am I (and whoever posted that advice) being too closed minded about System.Diagnostics? ie, is it ok to use System.Diagnostics.Stopwatch in production code? Thanks Adrian

4

7 回答 7

61

在引擎盖下,几乎所有 Stopwatch 所做的都是包装 QueryPerformanceCounter。据我了解,秒表可以提供对高分辨率计时器的访问 - 如果您在生产代码中需要此分辨率,我认为使用它没有任何问题。

于 2010-05-10T18:36:38.487 回答
26

是的,System.Diagnostics听起来它只是为了调试,但不要让这个名字欺骗你。System.Diagnostics命名空间一开始在生产代码中使用可能听起来有点吓人(对我来说确实如此),但该命名空间中有很多有用的东西。

有些东西,比如Process类,对于与系统交互很有用。您可以启动其他应用Process.Start程序、为用户启动网站、打开文件或文件夹等。

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

不用担心名字。

于 2010-05-10T19:02:47.937 回答
6

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

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

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

于 2010-05-10T18:41:57.030 回答
4

Afaik StopWatch 是QueryPerformanceCounter功能的外壳。此功能是许多性能计数器相关测量的基础。QPF 调用速度非常快,而且非常安全。如果您对 Diagnostics 命名空间感到偏执,请直接调用 QPF。

于 2010-05-10T18:36:22.843 回答
3

秒表基本上是原生和方法的简洁包装。如果你不习惯使用命名空间,你可以直接访问这些QueryPerformanceCounterQueryPerformanceFrequencySystem.Diagnostic

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

请注意,对于非常高精度的测量,需要考虑一些细微之处。如果您需要这么高的精度,这些可能会引起一些关注。

于 2010-05-10T18:37:08.777 回答
3

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

这是来自 MSDN 杂志的一篇关于该主题的好文章(比较 .NET Framework 类库中的计时器类)。

于 2010-05-10T18:37:34.867 回答
0

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

于 2010-05-10T18:43:27.187 回答