Я просто столкнулся с неожиданным поведением 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();
}
Ответы:
Хорошие часы должны быть точными и точными ; это разные. Как гласит старая шутка, остановленные часы показывают точную точность дважды в день, а часы, замедляющие движение на минуту, никогда не будут точными в любое время. Но часы, отстающие на минуту, всегда имеют точность до ближайшей минуты, тогда как остановленные часы не имеют никакой полезной точности.
Почему DateTime должен быть точным , скажем, до микросекунды, если он не может быть точным до микросекунды? Большинство людей не имеют источников официальных сигналов времени с точностью до микросекунды. Поэтому давая шесть цифр после десятичного знака точности , последние пять из которых мусор будет лежа .
Помните, что цель DateTime - представлять дату и время . Высокоточная синхронизация вовсе не является целью DateTime; как вы заметили, это цель секундомера. Цель DateTime - представить дату и время для таких целей, как отображение текущего времени для пользователя, вычисление количества дней до следующего вторника и т. Д.
Короче говоря, "сколько времени?" и "сколько времени это заняло?" это совершенно разные вопросы; не используйте инструмент, предназначенный для ответа на один вопрос, чтобы ответить на другой.
Спасибо за вопрос; из этого получится хорошая статья в блоге! :-)
источник
Точность DateTime зависит от системы, в которой он работает. Точность связана со скоростью переключения контекста, которая обычно составляет около 15 или 16 мс. (В моей системе это на самом деле около 14 мс по данным моего тестирования, но я видел некоторые ноутбуки, где точность приближается к 35-40 мс.)
Питер Бромберг написал статью о высокоточной синхронизации кода на C #, в которой обсуждает это.
источник
Мне нужно точное Datetime.Now :), поэтому я приготовил это:
источник
Из MSDN вы увидите , что
DateTime.Now
есть приблизительное разрешение 10 миллисекунд на всех операционных системах NT.Фактическая точность зависит от оборудования. Лучшую точность можно получить, используя
QueryPerformanceCounter
.источник
Что бы это ни стоило, если не считать фактической проверки источника .NET, Эрик Липперт прокомментировал этот вопрос SO, заявив, что DateTime имеет точность только примерно до 30 мс. Причина неточности в наносекундах, по его словам, заключается в том, что это «не обязательно».
источник
Из документации MSDN :
Еще они утверждают, что примерное разрешение на Windows NT 3.5 и новее составляет 10 мс :)
источник
В результате повторные вызовы свойства Now за короткий промежуток времени, например, в цикле, могут возвращать то же значение.
Ссылка MSDN
источник