DateTime.Now.Millisecond的分辨率在不同的计算机上有所不同

时间:2019-01-15 08:30:05

标签: c#

我有一个用C#和VS 2005编写的程序。它具有记录数据和时间戳的功能。我需要毫秒级的时间分辨率,因为数据采样周期时间可能不超过50ms。 我使用DateTime.Now.Millisecond来检索系统时间,但是我发现在某些计算机上,两个时间戳之间的实际间隔不是50ms,而是62-63ms。

因此,我简化了代码并在多台计算机上尝试过,下面是代码:

static void Main(string[] args)
{
    while (true)
    {
        Thread.Sleep(50);
        Console.WriteLine("{0}", DateTime.Now.Millisecond);
    }
}

这是Win7 SP1上的结果:

928 991 53 116 178 240 306 368 431 493 555 618 ...

请注意,间隔大约为62-63ms。

我知道Windows NT系列操作系统的时间分辨率约为16毫秒,因此我对结果并不感到惊讶。

但是,问题是,当我在其他Win7(SP1)计算机上测试同一程序时,结果是准确的,并且间隔几乎始终为50ms,我不知道为什么行为会有如此大的差异。

所以,我的问题是:

  1. 如何解释这些结果?
  2. 如何获得准确的毫秒级时间戳?是否有可能(在Win7上)?

顺便说一句,

1)我在Win10上进行测试,间隔大约为50-51ms。

2)我尝试使用秒表,但没有效果。

3)Environment.TickCount也不准确。

4)我尝试使用VS 2015,结果相同。

======================================

这是我的新测试代码:

static void Main(string[] args)
{
    long ticks = DateTime.Now.Ticks;
    int tEV = Environment.TickCount;
    while (true)
    {
        Thread.Sleep(50);
        Console.WriteLine("{0}, {1}, {2}",
            DateTime.Now.Ticks - ticks,
            DateTime.Now.Millisecond,
            Environment.TickCount - tEV);
        ticks = DateTime.Now.Ticks;
        tEV = Environment.TickCount;
    }
}

这是输出结果,我们可以看到第二列(DateTime.Now.Millisecond),间隔正好是50毫秒,而最后一列(TickCount)却有所变化。

510000, 547, 47
500000, 597, 62
500000, 647, 47
500000, 697, 47
500000, 747, 46
500000, 797, 47
500000, 847, 63
500000, 897, 46
500000, 947, 47
500000, 997, 47
500000, 47, 47
500000, 97, 62
500000, 147, 47
500000, 197, 47
500000, 247, 47
500000, 297, 46
500000, 347, 63
500000, 397, 47
500000, 447, 46
500000, 497, 47
500000, 547, 47
500000, 597, 62
500000, 647, 47
500000, 697, 47
500000, 747, 47
500000, 797, 62
500000, 847, 47
500000, 897, 47
500000, 947, 47
500000, 997, 46
500000, 47, 63

1 个答案:

答案 0 :(得分:4)

DateTime.Now由系统时钟提供,不能提供精确性能测量所需的精度。要进行更精确的测量,请使用Stopwatch,它由系统精度计时器提供(如果有的话)。

另一个问题是,您假设Thread.Sleep将使当前线程休眠确切的时间。不是这种情况。系统不能保证您在睡眠结束后将立即返回控制。可能还有其他线程得到优先选择,因此您的线程恢复时间可能晚于睡眠时间。