C# DateTime. Теперь точность

Я просто столкнулся с некоторым неожиданным поведением с DateTime. UtcNow при выполнении некоторых модульных тестов. Кажется это при вызове DateTime. Now/UtcNow в быстрой последовательности, это, кажется, дает Вам, поддерживают то же значение в течение более длительного, чем ожидалось интервала времени, вместо того, чтобы получить более точные инкременты миллисекунды.

Я знаю, что существует класс Секундомера, который лучше подошел бы для того, чтобы сделать точные измерения времени, но мне было любопытно, если кто-то мог бы объяснить это поведение в DateTime? Есть ли официальная точность, зарегистрированная для DateTime. Теперь (например, точный к в 50 мс?)? Почему был бы DateTime. Теперь будьте сделаны менее точными, чем, что могло обработать большинство тактовых частот ЦП? Возможно, это просто разработано для наименьшего общего знаменателя ЦП?

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();
}
91
задан Peter Mortensen 3 June 2015 в 15:13
поделиться

5 ответов

Почему DateTime.Now be made less precise than what most CPU clock could handle?

Хорошие часы должны быть как точными , так и точными ; они отличаются друг от друга. Как говорится в старой шутке, остановленные часы точны два раза в день, часы с минутной задержкой никогда не бывают точными в любое время. Но часы с минутной задержкой всегда точны до ближайшей минуты, в то время как остановленные часы вообще не имеют полезной точности.

Почему DateTime должна быть точной , скажем, в микросекунду, когда она не может быть точной в микросекунду? Большинство людей не имеют никакого источника официальных сигналов времени, которые точны до микросекунды. Поэтому давать шесть цифр после десятичного разряда точности , последние пять из которых - мусор было бы ложью .

Помните, что цель DateTime состоит в том, чтобы представлять собой дату и время . Высокая точность хронометража вовсе не является целью DateTime; как вы заметили, это цель секундомера. Целью DateTime является представление даты и времени для таких целей, как отображение текущего времени пользователю, вычисление количества дней до следующего вторника, и так далее.

Короче говоря, "сколько времени?" и "сколько времени это заняло?" - это совершенно разные вопросы; не используйте инструмент, предназначенный для ответа на один вопрос, чтобы ответить на другой.

Спасибо за вопрос; из этого получится хорошая статья в блоге! :-)

174
ответ дан 24 November 2019 в 06:43
поделиться

Из документации MSDN :

Разрешение этого свойства зависит от системного таймера.

Они также утверждают, что приблизительное разрешение Windows NT 3.5 и более поздних версий составляет 10 мс:)

-121--771969-

Для чего это стоит, не проверяя на самом деле источник .NET, Эрик Липперт предоставил комментарий на этот вопрос SO , сказав, что DateTime точен только приблизительно до 30 ms. Рассуждение за то, что он не является наносекундным точным, по его словам, заключается в том, что "

-121--771968-

Точность DateTime в некоторой степени зависит от системы, в которой она выполняется. Точность связана со скоростью контекстного переключателя, которая имеет тенденцию быть около 15 или 16 мс. (В моей системе это на самом деле около 14 мс от моего тестирования, но я видел некоторые ноутбуки, где он ближе к 35-40 мс точности.)

Питер Бромберг написал статью о высокой точности синхронизации кода в C #, которая обсуждает это.

18
ответ дан 24 November 2019 в 06:43
поделиться

В качестве примера можно привести то, что Эрик Липперт не проверил источник .NET, а прокомментировал этот SO вопрос , сказав, что DateTime точна всего лишь приблизительно до 30 мс. По его словам, причина неточности наносекунды заключается в том, что она "не должна быть".

5
ответ дан 24 November 2019 в 06:43
поделиться

Из документации MSDN:

Разрешение этого свойства зависит от таймера системы.

Они также утверждают, что приблизительное разрешение на Windows NT 3.5 и более поздних версиях составляет 10 мс :)

.
3
ответ дан 24 November 2019 в 06:43
поделиться

PowerPoint имеет доступ к VBA верно? ( Это делает, я проверил ), так что вы должны быть в состоянии автоматизировать поколений таким образом. Я сделал это довольно широко, но в документе Excel. Я никогда не пробовал это с точкой питания.

Проблема теперь становится одновременным инвестициями? Узнайте, как это сделать с VBA или сделать это вручную ... Если это может быть общее, я предложил вам узнать, как это сделать через VBA. Вообще говоря, я обнаружил, что автоматизация Excel с VBA было не слишком сложно, как только вы поняли основы. Сохраненное время, безусловно, было стоить того, в долгосрочной перспективе.

Наконец, я хотел бы порекомендовать книгу, чтобы заставить вас начать, но увы, я никогда не считал, что я никогда не пробую исследовать это.

-121--3702209-

из MSDN Вы обнаружите, что DateTime.Now имеет приблизительно разрешение 10 миллисекунд на всех операционных системах NT. Отказ

Фактическая точность зависит от аппаратного обеспечения. Лучшая точность может быть получена с использованием QueryPerformancounter .

5
ответ дан 24 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: