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();
4

3 回答 3

9

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

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

于 2009-04-27T21:34:42.780 回答
4

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

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

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

于 2009-04-27T21:35:46.570 回答
2

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

于 2009-04-27T21:42:32.607 回答