我在进行一些单元测试时遇到了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();
}
Run Code Online (Sandbox Code Playgroud) 我GetSystemTimeAdjustment在Windows 7上使用该功能运行了一些测试,得到了一些我无法解释的有趣结果.正如我所理解的那样,如果系统时间定期同步,则该方法应该返回,如果是,则在哪个时间间隔以及更新它的增量(请参阅MSDN上的GetSystemTimeAdjustment函数).
从此我可以看出,如果我查询系统时间,例如GetSystemTimeAsFileTime重复使用,我应该不做任何更改(系统时钟尚未更新),或者是检索到的增量的倍数的更改GetSystemTimeAdjustment.问题一:这个假设是否正确?
现在考虑以下测试代码:
#include <windows.h>
#include <iostream>
#include <iomanip>
int main()
{
FILETIME fileStart;
GetSystemTimeAsFileTime(&fileStart);
ULARGE_INTEGER start;
start.HighPart = fileStart.dwHighDateTime;
start.LowPart = fileStart.dwLowDateTime;
for (int i=20; i>0; --i)
{
FILETIME timeStamp1;
ULARGE_INTEGER ts1;
GetSystemTimeAsFileTime(&timeStamp1);
ts1.HighPart = timeStamp1.dwHighDateTime;
ts1.LowPart = timeStamp1.dwLowDateTime;
std::cout << "Timestamp: " << std::setprecision(20) << (double)(ts1.QuadPart - start.QuadPart) / 10000000 << std::endl;
}
DWORD dwTimeAdjustment = 0, dwTimeIncrement = 0, dwClockTick;
BOOL fAdjustmentDisabled = TRUE;
GetSystemTimeAdjustment(&dwTimeAdjustment, &dwTimeIncrement, …Run Code Online (Sandbox Code Playgroud)