【问题标题】:Difference between ElapsedTicks, ElapsedMilliseconds, Elapsed.Milliseconds and Elapsed.TotalMilliseconds? (C#)ElapsedTicks、ElapsedMilliseconds、Elapsed.Milliseconds 和 Elapsed.TotalMilliseconds 之间的区别? (C#)
【发布时间】:2012-02-12 05:52:55
【问题描述】:

我完全混淆了这 4 个。ElapsedMilliseconds (long)、ElapsedTicks (long)、Elapsed.TotalMilliseconds (double) 和 Elapsed.Milliseconds (int) 有什么区别?

我有一个功能

    {
        Stopwatch sw = new Stopwatch();

        sw.Start();
        MyTimeConsumingAction();
        sw.Stop();

        sw.//what?
    }

如何从 Stopwatch 对象的 elapsed 属性中获取长时间运行的进程消耗的正确时间(以毫秒为单位)?

编辑:我尝试了 msdn 文档,但那里没有任何详细信息..

【问题讨论】:

标签: c# performance .net-4.0 system.diagnostics stopwatch


【解决方案1】:

Elapsed.TotalMilliseconds (double) 返回自开始以来经过的整数和小数毫秒的总数

例如停在 1.23456 秒的秒表将在此属性中返回 1234.56。请参阅 MSDN 上的 TimeSpan.TotalMilliseconds

Elapsed.Milliseconds (int) 返回当前秒的整毫秒数

例如1.234 秒的秒表将在此属性中返回 234。见TimeSpan.Milliseconds

ElapsedTicks (long) 返回自秒表开始以来的刻度。

在原始问题的上下文中,与 Stopwatch 类有关,ElapsedTicks 是经过的滴答数。滴答声以Stopwatch.Frequency 的速率发生,因此,要计算经过的秒数,请计算:numSeconds = stopwatch.ElapsedTicks / Stopwatch.Frequency

旧答案将刻度定义为 100 纳秒周期的数量,这在 DateTime 类的上下文中是正确的,但在 Stopwatch 类的上下文中是不正确的。请参阅 MSDN 上的 Stopwatch.ElapsedTicks

ElapsedMilliseconds 返回一个四舍五入到最接近的整毫秒,因此这可能缺乏Elapsed.TotalMilliseconds 属性可以提供的精度。

Elapsed.TotalMilliseconds 是一个 double,它可以将执行时间返回到部分毫秒,而 ElapsedMillisecondsInt64。例如在此属性中,0.0007 毫秒的秒表将返回 0,或者 1234.56 毫秒将返回 1234。因此,为了精确,请始终使用Elapsed.TotalMilliseconds

请参阅Stopwatch.ElapsedMilliseconds on MSDN 了解详情。

【讨论】:

  • 在问题中使用sw,请注意:sw.ElapsedTicks 给出了硬件相关单元Stopwatch.Frequency 中的滴答数,就像你说的那样。但是,sw.Elapsed.Ticks(注意额外的点!!)给出了常数 TimeSpan.TicksPerSecond 所隐含的以 100 纳秒为单位计算的滴答数,其值为常数 10,000,000
  • 非常感谢您强调这种微妙的差异。我在自己的基准测试中使用 ElapsedMilliseconds,想知道为什么我的结果不一致。
【解决方案2】:

反映 Stopwatch 类表明 ElapsedMilliseconds 是已转换(并四舍五入)为毫秒的 Elapsed ticks:

public TimeSpan Elapsed
{
  get
  {
    return new TimeSpan(this.GetElapsedDateTimeTicks());
  }
}

public long ElapsedMilliseconds
{
  get
  {
    return this.GetElapsedDateTimeTicks() / 10000L;
  }
}

【讨论】:

  • 这是对 ElapsedMilliseconds 的正确引用,正如 OP 所要求的那样。接受的答案没有使用秒表类“ElapsedMilliseconds”,这可能会令人困惑,因为链接的文本描述不正确 - 现在已修复
【解决方案3】:

来自msdn的简短解释:

ElapsedMilliseconds

此属性表示经过的时间,向下舍入到最接近的整数毫秒值。如需更高精度的测量,请使用 Elapsed 或 ElapsedTicks 属性。

ElapsedTicks

此属性表示底层计时器机制中经过的滴答数。刻度是秒表计时器可以测量的最小时间单位。使用频率字段将 ElapsedTicks 值转换为秒数。

Elapsed

使用 Elapsed 属性通过 TimeSpan 方法和属性检索经过的时间值。例如,您可以将返回的 TimeSpan 实例格式化为文本表示形式,或将其传递给另一个需要 TimeSpan 参数的类。

【讨论】:

    【解决方案4】:

    ElapsedTimeSpan。如果你想显示时间,那么 Elapsed.ToString() 应该这样做

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2010-10-23
      • 2013-05-02
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多