我只是跑与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();
}
为什么会DateTime.Now进行比大多数CPU时钟可以处理不太精确?
一个良好的时钟应该是既精确又准确 ; 这些是不同的。 至于那个老笑话,停止时钟是完全准确的,一天两次,时钟慢一分钟都是从未在任何时候准确。 但时钟慢一分钟,始终是精确到最近分钟,而停止时钟没有有用的精度可言。
日期时间为什么要精确到,说微秒时,它不可能是精确到微秒? 大多数人没有为精确到微秒的官方时间信号的任何来源。 因此给六位小数点的精度之后,其过去五年的都是垃圾肯定是在撒谎 。
请记住,日期时间的目的是代表一个日期和时间 。 高精度定时不在日期时间的所有的目的; 当你注意,这是秒表的目的。 日期时间的目的是为了代表目的,如显示当前时间给用户,计算天数,直到下周二,等等日期和时间。
总之,“现在是什么时候?” 和“多长时间没那个时间?” 是完全不同的问题; 不要用设计来回答一个问题来回答对方的工具。
谢谢你的问题; 这将使一个好的博客文章! :-)
日期时间的精度是有点具体到它正在运行的系统。 精度涉及上下文切换,这往往是约15或16毫秒的速度。 (在我的系统,它实际上是从我的测试中大约14毫秒,但我已经看到一些笔记本电脑在那里它更接近35-40毫秒的精度。)
彼得·布朗伯格写上高精度的计时码的一篇文章在C#中,其中讨论了这一点。
我想精确Datetime.Now :),所以我做这件事:
public class PreciseDatetime
{
// using DateTime.Now resulted in many many log events with the same timestamp.
// use static variables in case there are many instances of this class in use in the same program
// (that way they will all be in sync)
private static readonly Stopwatch myStopwatch = new Stopwatch();
private static System.DateTime myStopwatchStartTime;
static PreciseDatetime()
{
Reset();
try
{
// In case the system clock gets updated
SystemEvents.TimeChanged += SystemEvents_TimeChanged;
}
catch (Exception)
{
}
}
static void SystemEvents_TimeChanged(object sender, EventArgs e)
{
Reset();
}
// SystemEvents.TimeChanged can be slow to fire (3 secs), so allow forcing of reset
static public void Reset()
{
myStopwatchStartTime = System.DateTime.Now;
myStopwatch.Restart();
}
public System.DateTime Now { get { return myStopwatchStartTime.Add(myStopwatch.Elapsed); } }
}
从MSDN你会发现DateTime.Now
具有10毫秒的所有NT操作系统的近似分辨率。
实际精度依赖于硬件。 可以使用获得更好的精度QueryPerformanceCounter
。
对于它的价值,实际上短检查.NET源,埃里克利珀设置在评论这太问题说,日期时间只精确到大约30毫秒。 对于不是纳秒准确的,用他的话说的理由,是它“并不需要的人。”
从MSDN文档 :
此属性的分辨率取决于系统定时器。
他们还声称,在Windows NT 3.5和更高版本的近似分辨率为10毫秒:)
此属性的分辨率取决于系统计时器,它取决于底层操作系统。 它往往是在0.5和15毫秒之间。
其结果是,在重复一个短的时间间隔来电来查阅属性,如在一个循环中,可以返回相同的值。
MSDN链接