Я просто столкнулся с неожиданным поведением DateTime.UtcNow при выполнении некоторых модульных тестов. Похоже, что когда вы вызываете DateTime.Now/UtcNow в быстрой последовательности, он, кажется, возвращает вам то же значение для более длительного, чем ожидалось, интервала времени, а не фиксирует более точные приращения миллисекунды.
Я знаю, что есть класс Stopwatch, который лучше подходит для точного измерения времени, но мне было любопытно, может ли кто-нибудь объяснить это поведение в DateTime? Документирована ли официальная точность DateTime.Now (например, с точностью до 50 мс?)? Почему DateTime.Now должен быть менее точным, чем может обрабатывать большинство тактовых частот ЦП? Может, он просто предназначен для ЦП с наименьшим общим знаменателем?
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();
}