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

10
例如
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();
3个回答

9
我相信 Stopwatch 是建立在 QueryPerformanceCounter 之上的,所以每次调用都会导致内核转换。如果 foo() 很短暂,QPC 的开销将使其微不足道。
如果您使用 Stopwatch 来测量短时间任务,应该运行多次 foo()(比如数千次),并在整个批处理中使用 Stopwatch。将总时间除以运行次数,以获取任务的平均时间。

@Michael 还有一件应该提到的事情是,如果 QPC 不可用,它将回落到 tickcount。 - Sam Saffron

4
这听起来像是一个递归答案,但要真正了解Stopwatch的惩罚,唯一的方法就是测量它。通常情况下,测量托管代码都需要使用Stopwatch实例。
然而,Stopwatch仅用于诊断目的,不应在零售应用程序中使用,除非您处于诊断模式。因此,对于非诊断代码,这确实不应该是一个问题。您能否提供有关您的场景的一些见解,以便我们可以给出更好的答案?
Stopwatch实例通常是建立在QueryPerformanceCounter调用之上的。这些调用并不免费,但也不是非常昂贵。任何值得使用Stopwatch测量的任务都将运行足够长的时间,以至于任务的成本将使QueryPerformanceCounter调用变得微不足道。否则,为什么要测量它呢?

2
根据我的经验,使用Stopwatch类来计时确实会有一些明显的开销。相比使用Environment.TickCount等方法来进行时间测量,这个开销更大,但还不算太大。然而,这可能并不是您面临的重要问题。如果被测量的时间段通常非常短(当使用Stopwatch时应该通常如此,因为其他方法同样适用于测量较长的时间段),则性能不应受到明显影响。此外,此页面的结尾提到了在程序中运行Stopwatch的成本。 (但我不确定是否应该遵循使用它进行常量程序监视的建议。)

链接已经失效或者出了什么问题!我只收到了一个XML文档,上面写着访问被拒绝! - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接