秒表可以在生产代码中使用吗?
Posted
技术标签:
【中文标题】秒表可以在生产代码中使用吗?【英文标题】:Can Stopwatch be used in production code? 【发布时间】:2011-02-17 19:42:34 【问题描述】:我需要一个准确的计时器,而 DateTime.Now 似乎不够准确。从我阅读的描述来看,System.Diagnostics.Stopwatch 似乎正是我想要的。
但我有恐惧症。我对在实际生产代码中使用 System.Diagnostics 中的任何内容感到紧张。 (我将它广泛用于调试 Asserts 和 PrintLns 等,但还没有用于生产。)我不只是尝试使用计时器来对我的功能进行基准测试——我的应用程序需要一个实际的计时器。我在另一个论坛上读到 System.Diagnostics.StopWatch 仅用于基准测试,不应该在零售代码中使用,尽管没有给出任何理由。这是正确的,还是我(以及发布该建议的人)对 System.Diagnostics 过于封闭?即,可以在生产代码中使用 System.Diagnostics.Stopwatch 吗? 谢谢 阿德里安
【问题讨论】:
你需要什么类型的定时器?您是否希望在经过一段时间后调用某个方法,或者您是否需要知道到现在已经过去了多少时间?您需要什么精度? how to get a real time clock in C#? 的可能副本。我看不出这与其他问题有何不同。也许如果您将其更改为“在生产中使用 System.Diagnostics 类是否有任何问题,但现在它是重复的”。 @John - IMO,绝对不是重复的。另一个问题是如何做到这一点;这个问题询问是否可以这样做。另一个 OP 可能有一些奇怪的理由来避免 Stopwatch(例如,疯狂的公司 BS 规则,这些规则没有意义,但仍然必须遵守。不,我不是苦涩的!) 我对使用 System.Diagnostics 命名空间中的任何东西都有同样的感觉。在检查了诸如 MSDN 之类的可靠来源后,最好使用Stopwatch
。我什至实现了自己的,因为我需要事件:msdn.microsoft.com/en-us/library/aa457094.aspx
【参考方案1】:
在引擎盖下,几乎所有 Stopwatch 所做的都是包装 QueryPerformanceCounter。据我了解,秒表可提供对高分辨率计时器的访问 - 如果您在生产代码中需要此分辨率,我认为使用它没有任何问题。
【讨论】:
我们在生产代码中一直使用 QueryPerformanceCounter。在 prod 中使用这个基础设施是完全合理的。【参考方案2】:是的,System.Diagnostics
听起来确实像是仅用于调试,但不要让名称欺骗了您。 System.Diagnostics
命名空间一开始在生产代码中使用可能听起来有点吓人(对我来说确实如此),但该命名空间中有很多有用的东西。
有些东西,例如Process
类,对于与系统交互很有用。使用Process.Start
,您可以启动其他应用程序、为用户启动网站、打开文件或文件夹等。
其他东西,例如Trace
类,可以帮助您追踪生产代码中的错误。当然,您不会总是在生产代码中使用它们,但它们非常对于记录和跟踪远程机器上难以捉摸的错误非常有用。
不用担心名字。
【讨论】:
【参考方案3】:你说你在另一个论坛上读到不要在生产中使用来自System.Diagnostics
的类。但是您应该担心的唯一来源是创建代码的微软。他们说StopWatch
class:
提供一组方法和属性,您可以使用它们来准确测量经过的时间。
他们不会说,“生产中除外”。
【讨论】:
【参考方案4】:Afaik StopWatch 是QueryPerformanceCounter 功能的外壳。此功能是许多性能计数器相关测量的基础。 QPF 调用速度非常快,而且非常安全。如果您对 Diagnostics 命名空间感到疑虑,请直接调用 QPF。
【讨论】:
【参考方案5】:秒表是 basically a neat wrapper 围绕原生 QueryPerformanceCounter
和 QueryPerformanceFrequency
方法。如果您不习惯使用 System.Diagnostic
命名空间,您可以使用 access these directly。
使用性能计数器很常见,这并没有错。 AFAIK,没有更高的计时器精度可用。请注意,QPF 可能会导致多处理器问题机器,但之前链接的 MSDN 文章提供了一些额外的信息。建议确保 System.Diagnostics.Stopwatch
在后台执行此操作或手动调用 SetThreadAffinity
- 否则您的计时器可能及时跳回!
请注意,对于非常高精度的测量,需要考虑some subtleties。如果您需要这么高的精度,这些可能会引起一些关注。
【讨论】:
【参考方案6】:.NET 基类库中有几个不同的计时器类 - 哪一个最适合您的需求只能由您确定。
Here is a good article from MSDN magazine on the subject (Comparing the Timer Classes in the .NET Framework Class Library).
【讨论】:
【参考方案7】:根据您使用计时器的目的,您可能还有其他问题需要考虑。 Windows 不提供执行时间保证,因此您不应依赖它进行任何实时处理(您可以为 Windows 获得实时扩展,提供硬实时调度)。我还怀疑在捕获时间间隔之后以及在对它进行取决于其精度的操作之前,由于上下文切换可能会导致精度下降。原则上,这可能是一个任意长的时间段;在实践中,它应该是毫秒级的。这真的取决于这个时机对任务的关键程度。
【讨论】:
以上是关于秒表可以在生产代码中使用吗?的主要内容,如果未能解决你的问题,请参考以下文章