如果有的话,使用System.Diagnostics.Stopwatch的资源惩罚是什么?

例如

foo() //Some operation bound by an external resource. db,I/O, whatever. 

 var watch = new Stopwatch(); watch.Start(); foo() var time = watch.ElapsedMilliseconds watch.Stop(); 

我相信秒表是建立在QueryPerformanceCounter之上的,因此每次调用都会导致内核转换。 如果foo()非常简短,那么QPC开销会使它相形见绌。

如果您使用秒表来测量短任务,则应多次运行foo()(如数千次),并在整批中使用秒表。 将总时间除以运行次数以获得任务的平均时间。

这听起来像是一个递归的答案,但真正了解秒表惩罚的唯一方法就是测量它。 测量托管代码通常涉及秒表实例。

秒表仅用于诊断目的,不应在零售应用中使用。 除非你当然处于诊断模式。 因此,这对于非诊断代码来说确实不应该是一个问题。 您能否提供一些有关您的方案的见解,以便我们能够给出更好的答案?

秒表实例(通常)是在QueryPerformanceCounter调用之上构建的。 这些都不是免费的,但它们也不是非常昂贵。 任何值得用秒表测量的东西都是一个足够长的运行任务,任务的成本将使QueryPerformanceCounter调用无关紧要。 否则,你为什么要测量它?

根据我的经验,使用Stopwatch类时会有一些明显的开销。 当然比使用Environment.TickCount等测量时间要多得多,但仍然不是太大 。 但是,这对您来说可能是也可能不是一个大问题。 如果测量的时间段通常非常短(通常应该使用Stopwatch的情况,假设其他方法对于更长时间的计时也同样好),那么性能不应该受到影响,我想象。 此外, 本页末尾还有一些关于在程序中运行Stopwatch的成本。 (不确定我是否会接受使用它进行持续程序监控的建议。)