【问题标题】:TimeSpan.TotalMilliseconds is 0 when the TimeSpan is shorter than ~ 0.5ms [duplicate]TimeSpan.TotalMilliseconds 当 TimeSpan 短于 ~ 0.5ms 时为 0 [重复]
【发布时间】:2017-01-03 21:22:16
【问题描述】:

我正在为一个应用程序实施一些诊断,在该应用程序中用户可以看到图形更新的速度,并且我遇到了一些看似奇怪的行为。我的图形更新函数是使用 Timer 调用的,它看起来像这样:

private void RefreshScreen(object sender, EventArgs e)
{
    DateTime begin = DateTime.Now;

    // Do some updating...

    DateTime end = DateTime.Now;
    graphicsUpdateRate = (end - begin).TotalMilliseconds;
}

当我稍后在另一个函数中将 graphicsUpdateRate 显示到单独的窗口时,它几乎总是 0。有时它实际上是 ~0.5,但我从未见过它低于 ~0.48。如果低于此值,是否有某种原因会将其钳制为 0?使用 TimeSpan.TotalMilliseconds 时我有什么遗漏吗?我对此感到很困惑,因为它看起来很随机。

【问题讨论】:

  • DateTime.Now 不是那么准确,如果您想测量开始和结束之间的时间,请改用Stopwatch
  • 显示时是否有可能是舍入或截断?
  • 你不能只访问(end - begin).Ticks,每个都是 100 纳秒,也就是 1e-4 毫秒。更新:这行不通,忽略
  • @abc123 他没有DateTime(end - begin) 返回TimeSpan 和TimeSpan 的TotalMilliseconds 属性返回一个双。 @Richard,如果您使用刻度,您仍然会得到 0。对DateTime.Now 的两次调用都返回相同的DateTime 值,因为.Now 不会经常更新。

标签: c# wpf


【解决方案1】:

您应该为此使用StopWatch

类似:

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// Do something.
stopwatch.Stop();
graphicsUpdateRate  = stopwatch.ElapsedMilliseconds;

您可以在此处阅读有关使用 StopWatch 的原因:

Is DateTime.Now the best way to measure a function's performance?

【讨论】:

  • 我对 Stopwatch 没有任何反对意见,除了我在实现此功能时从未听说过它。我认为它比 DateTime/TimeSpan 更准确?
  • @RichardJones “现在几点”和“需要多长时间”是两个截然不同的问题。不要使用为一个人设计的工具来做另一个人(AKA,测量两个事件之间的时间要准确得多)
  • 虽然正确,但这个答案实际上并没有解决所提出的问题(为什么会夹住)。
  • 使用秒表时,结果始终为 0。
  • @RichardJones 使用Frequency 属性来确定在当前计时器频率下系统上 150 个滴答的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2016-06-23
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多