【问题标题】:C# Stopwatch shows incorrect timeC#秒表显示不正确的时间
【发布时间】:2010-08-20 21:17:43
【问题描述】:

我看到其他用户帖子显示秒表测量在“Thread.Sleep(5000)”中花费的时间约为 5000 毫秒。

但我的程序产生以下结果

for (int i = 0; i < 20; ++i)
{
    Stopwatch sw = Stopwatch.StartNew();
    DateTime start = DateTime.Now;
    Thread.Sleep(5000);
    sw.Stop();
    Console.Out.WriteLine(
        "StopWatch Diff:" + 
        sw.ElapsedMilliseconds.ToString()); 
    Console.Out.WriteLine(
        "DateTime Diff:" + 
        DateTime.Now.Subtract(start).TotalMilliseconds.ToString());
}

秒表差异:1684 日期时间差异:5262.592 秒表差异:1625 日期时间差异:4997.12 秒表差异:1604 日期时间差异:4997.12 秒表差异:1601 日期时间差异:4997.12 秒表差异:1690 日期时间差异:4997.12 秒表差异:1603

只有我在观察这种行为吗?为什么秒表在实际过去 5 秒后测量 1.6 秒。是线程实际运行的时间?

【问题讨论】:

  • 对我来说效果很好 - 秒表 Diff:5000,DateTime Diff:5000.5。这正是您运行的代码吗?
  • 另一个线程正在谈论测量中偶尔出现的严重错误。在我的情况下,测量的时间总是小 3 倍。

标签: c# multithreading timer stopwatch


【解决方案1】:

Stopwatch 类是 not reliable

这在没有恒定时钟速度的处理器上是不可靠的(大多数处理器可以降低时钟速度以节省能源)。这在here有详细解释。

【讨论】:

  • 可能就是这样。奇怪的是,当我将 Thread.Sleep(5000) 替换为 Thread.SpinWait(100000000) 时,使用 Stopwatch 和 DateTime.Now 测量的时间之间的差异变得可以忽略不计。
  • @user426777:当您使用 SpinWait 时,它会使处理器保持忙碌状态,因此它可能会一直全速运行(恒定速度)。当您使用 Thread.Sleep 时,处理器没有任何事情可做,因此它可能会自动更改为较低的时钟速度以节省电力。您可以尝试将处理器更改为以恒定速度运行,然后我认为它在这两种情况下都可以工作。
  • 你是对的。当我启动另一个执行某些工作并使处理器保持忙碌的线程时,秒表会显示正确的时间。谢谢!
  • 也许秒表曾经不可靠,但现在看来它完全可靠了。见msdn.microsoft.com/en-us/library/windows/desktop/…Is QPC accuracy affected by processor frequency changes caused by power management or Turbo Boost technology? No. If the processor has an invariant TSC, the QPC is not affected by these sort of changes. If the processor doesn't have an invariant TSC, QPC will revert to a platform hardware timer that won't be affected by processor frequency changes or Turbo Boost technology.
  • @youen 只要您的操作系统是 Windows Vista 或更新版本是规定。现在应该没问题,因为那些不合规的操作系统已经过时了,但重要的是要提一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多