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

我需要一个精确的计时器和日期时间。现在看来还不够准确。根据我读到的描述,系统。诊断。秒表似乎正是我想要的。

但我有恐惧症。我对使用 System 的任何东西都感到紧张。实际生产代码中的诊断。(我广泛使用它进行 Asserts 和 PrintLns 等的调试,但从未用于生产环境。)我不仅仅是试图使用计时器来基准我的功能-我的应用程序需要一个实际的计时器。我在另一个论坛上看到。诊断。StopWatch 只是用于基准测试,不应该在零售代码中使用,尽管没有给出任何理由。这是否正确,或者我(以及发布这个建议的人)对 System 的看法过于封闭。诊断?即,是否可以使用系统。诊断。生产代码中的秒表? 谢谢 艾德里安

18741 次浏览

Afaik StopWatch 是一个基于 QueryPerformanceCounter 查询性能计数器功能的 shell。这个函数是许多性能计数器相关度量的基础。QPF 调用非常快,而且非常安全。如果您对 Diagnostics 命名空间感到疑神疑鬼,请直接 pInvoke QPF。

在引擎盖下,几乎所有的秒表做的是包装 QueryPerformanceCounter 查询性能计数器。据我所知,“秒表”是为了提供对高分辨率定时器的访问——如果您在生产代码中需要这种分辨率,我认为使用它没有任何问题。

秒表是围绕本地 QueryPerformanceCounterQueryPerformanceFrequency方法的 基本上就是一个整洁的包装纸。如果您对使用 System.Diagnostic名称空间感到不舒服,可以使用 直接访问这些

使用性能计数器是非常常见的,这并没有什么错。AFAIK,没有更高的计时器精度可用。注意 QPF 可能会导致 多处理机问题机器,但是之前链接的 MSDN 文章提供了一些关于这方面的额外信息。最好确保 System.Diagnostics.Stopwatch在后台完成这项工作,或者手动调用 SetThreadAffinity,否则您的计时器可能会 回到过去

注意,对于非常高精度的测量,需要考虑 一些微妙之处。如果你需要这么精确,这些可能会有些问题。

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

下面是来自 MSDN 杂志关于这个主题的一篇好文章(比较。NET 架构类库)。

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

提供一组方法和属性,您可以使用这些方法和属性来精确度量运行时间。

他们不会说“除了在生产中”。

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

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

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

其他方面,比如 Trace类,可以帮助您跟踪生产代码中的 bug。当然,您并不总是在生产代码中使用它们,但是它们对于在远程计算机上记录和跟踪难以捉摸的 bug 非常有用。

别担心名字。