【问题标题】:What, if any, is the resource penalty for using System.Diagnostics.Stopwatch?如果有的话,使用 System.Diagnostics.Stopwatch 的资源损失是什么?
【发布时间】:2010-10-22 04:13:51
【问题描述】:

例如

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

【问题讨论】:

    标签: c# .net performance stopwatch


    【解决方案1】:

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

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

    【讨论】:

    • @Michael 另一个应该提到的是,如果 QPC 不可用,它将回退到 tickcount
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 链接坏了还是怎么回事!我只是得到一个 xml 文档说访问被拒绝!
      猜你喜欢
      • 2013-02-17
      • 2012-01-04
      • 1970-01-01
      • 2020-09-26
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2019-08-19
      相关资源
      最近更新 更多