C#秒表显示错误的时间

Ale*_*uro 14 c# multithreading timer stopwatch

我看过其他用户帖子显示秒表测量在"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());
}
Run Code Online (Sandbox Code Playgroud)
StopWatch Diff:1684
DateTime Diff:5262.592
StopWatch Diff:1625
DateTime Diff:4997.12
StopWatch Diff:1604
DateTime Diff:4997.12
StopWatch Diff:1601
DateTime Diff:4997.12
StopWatch Diff:1690
DateTime Diff:4997.12
StopWatch Diff:1603

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

Mar*_*ers 19

秒表类是不可靠的.

这对于没有恒定时钟速度的处理器来说是不可靠的(大多数处理器可以降低时钟速度以节省能量).这在详细解释这里.

  • 也许秒表曾经不可靠,但现在看来它是完全可靠的。请参阅 https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx#general_faq_about_qpc_and_tsc `QPC 精度是否受到电源管理或 Turbo Boost 引起的处理器频率变化的影响技术?不会。如果处理器具有不变的 TSC,则 QPC 不会受到此类更改的影响。如果处理器没有不变的 TSC,QPC 将恢复为不受处理器频率变化或 Turbo Boost 技术影响的平台硬件计时器。 (2认同)