我有一个用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)我在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
答案 0 :(得分:4)
DateTime.Now
由系统时钟提供,不能提供精确性能测量所需的精度。要进行更精确的测量,请使用Stopwatch
,它由系统精度计时器提供(如果有的话)。
另一个问题是,您假设Thread.Sleep
将使当前线程休眠确切的时间。不是这种情况。系统不能保证您在睡眠结束后将立即返回控制。可能还有其他线程得到优先选择,因此您的线程恢复时间可能晚于睡眠时间。