我刚刚在进行一些单元测试时遇到了 DateTime.UtcNow 的一些意外行为。看起来,当您快速连续调用 DateTime.Now/UtcNow 时,它似乎会在比预期更长的时间间隔内返回相同的值,而不是捕获更精确的毫秒增量。
我知道有一个秒表类更适合进行精确的时间测量,但我很好奇是否有人可以解释 DateTime 中的这种行为? DateTime.Now 是否有官方精度记录(例如,精确到 50 毫秒以内?)?为什么 DateTime.Now 的精度低于大多数 CPU 时钟可以处理的精度?也许它只是为最低公分母 CPU 设计的?
public static void Main(string[] args)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i=0; i<1000; i++)
{
var now = DateTime.Now;
Console.WriteLine(string.Format(
"Ticks: {0}\tMilliseconds: {1}", now.Ticks, now.Millisecond));
}
stopwatch.Stop();
Console.WriteLine("Stopwatch.ElapsedMilliseconds: {0}",
stopwatch.ElapsedMilliseconds);
Console.ReadLine();
}
最佳答案
Why would DateTime.Now be made less precise than what most CPU clocks could handle?
一个好的时钟应该既精确又准确;那些是不同的。正如老笑话所说,停走的时钟一天准确两次,慢一分钟的时钟在任何时候都不会准确。但是慢一分钟的时钟总是精确到最近的分钟,而停止的时钟根本没有任何有用的精度。
为什么 DateTime 应该精确到微秒,而它不可能精确到微秒?大多数人没有任何精确到微秒的官方时间信号来源。因此,在精度的小数点后给出六位,其中最后五位是垃圾将是说谎。
请记住,DateTime 的目的是表示日期和时间。高精度计时根本不是 DateTime 的目的;正如您所注意到的,这就是 StopWatch 的目的。 DateTime 的用途是表示日期和时间,用于向用户显示当前时间、计算下周二之前的天数等。
简而言之,“几点了?”和“那花了多长时间?”是完全不同的问题;不要使用旨在回答一个问题的工具来回答另一个问题。
感谢您的提问;这将成为一篇很好的博客文章! :-)
关于C# DateTime.Now 精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143140/