在执行一些单元测试时,我只是遇到了DateTime.UtcNow一些意外的行为。看起来,当您快速连续调用DateTime.Now/UtcNow时,似乎可以在比预期更长的时间间隔内返回相同的值,而不是捕获更精确的毫秒增量。
我知道有一个秒表类更适合于进行精确的时间测量,但是我很好奇是否有人可以在DateTime中解释这种行为?是否有记录DateTime.Now的官方精度(例如,精度在50毫秒内?)?为什么将DateTime.Now的精度降低到大多数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(); }
为什么将DateTime.Now的精度降低到大多数CPU时钟无法处理的水平?
一个好的时钟既要 精确 和 准确 ; 那些是不同的。就像老玩笑所说的那样,停下来的时钟每天准确地是两次,而慢一分钟的时钟在任何时候都永远不会准确。但是慢一分钟的时钟总是精确到最接近的分钟,而停止的时钟根本没有任何有用的精度。
日期时间为什么要 精确 到,说微秒时,它不可能是 精确 到微秒?大多数人没有任何精确到微秒的官方时间信号源。因此给予小数点后六位数字 精度 ,其在过去五年中,有 垃圾 会 撒谎 。
请记住,DateTime的目的是 代表日期和时间 。高精度计时完全不是DateTime的目的;如您所述,这就是StopWatch的目的。DateTime的目的是为了表示日期和时间,例如向用户显示当前时间,计算到下一个星期二的天数等等。
简而言之,“现在几点?” 和“那花了多长时间?” 是完全不同的问题;不要使用旨在回答一个问题来回答另一个问题的工具。
谢谢你的问题;这将是一篇不错的博客文章!:-)