Объяснение о счетчике производительности с высоким разрешением и его существовании, связанном с .NET Stopwatch? - PullRequest
10 голосов
/ 08 августа 2011

Внутри статического конструктора Stopwatch мы видим следующий код, который в основном проверяет, существует ли счетчик производительности с высоким разрешением.

static Stopwatch()
{
    if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency))
    {
        IsHighResolution = false;
        Frequency = 0x989680L;
        tickFrequency = 1.0;
    }
    else
    {
        IsHighResolution = true;
        tickFrequency = 10000000.0;
        tickFrequency /= (double) Frequency;
    }
}

В MSDN говорится о QueryPerformanceFrequency:

Извлекает частоту счетчика производительности высокого разрешения, если таковой существует

Однако довольно неясно, когда именно он существует?Я подозреваю, что это обычно существует на современных машинах, но когда точно это не так?

Это интересно, потому что, когда его не существует, Stopwatch становится простой оболочкой вокруг свойства DateTime.UtcNow.

Ответы [ 2 ]

5 голосов
/ 23 марта 2013

Существует разница между таймером и секундомером, и путаница между ними приводит к ошибочным предположениям.К сожалению, термин «таймер» используется слишком часто для обозначения нескольких вещей.

Любой компьютер, работающий под управлением Windows 2000 или более поздней версии, вероятно, имеет высокочастотный таймер.Я никогда не сталкивался с компьютером, работающим под управлением Windows 2000, который не имеет такой вещи.

Теперь это высокочастотный таймер.Есть также таймеры: компоненты Windows или .NET.Эти таймеры используются не для хранения времени или для измерения времени, а для выполнения действий с периодическими интервалами.Объекты таймера Windows имеют разрешение 1 мс и очень надежны, когда компьютер не загружен процессором.Таймерные объекты .NET ограничены разрешением приблизительно 15 мс.Вы можете обойти это, используя P / Invoke для непосредственного взаимодействия с объектами Windows, но это не часто необходимо.

Класс .NET Stopwatch основан на высокочастотном таймере.В общем случае Start запрашивает счетчик производительности и сохраняет значение.Когда вы Stop, он снова запрашивает счетчик производительности.Прошедшее время является простым вычитанием этих двух значений.Вы можете получить лучшее, чем микросекундное разрешение от секундомера.

И на самом деле, вы можете использовать Stopwatch с циклом ожидания занятости, который дает вам разрешение менее миллисекунды.Я сомневаюсь, что с ним можно получить субмикросекундное разрешение.

Важно понимать, что, хотя таймеры не надежны за пределами 1 миллисекунды, секундомер, который измеряет прошедшее времяГораздо точнее.Вы можете, вероятно, доверять измерениям прошедшего времени микросекундного уровня из секундомера.Кроме того, я бы на это не рассчитывал.

1 голос
/ 08 августа 2011

Фактическое разрешение системного времени составляет порядка миллисекунд (хотя заявлено, что оно составляет 1/10 миллисекунды, я никогда не видел рабочую станцию, которая обеспечивает такое разрешение надежно).

Однако вы можете использовать дополнительное оборудование (например, устройства считывания тайм-кода), которое обеспечивает разрешение вплоть до наносекунд.Они обычно используются в промышленных системах управления в соответствии с IPC (промышленные ПК) для синхронизации оборудования DAQ.Вы можете увидеть пример с разрешением 100 нс на слотах PCI Express.Процессор временного кода для низкопрофильной локальной шины PCI Express x1 .

Обычные рабочие станции почти всегда будут использовать счетчики с высоким разрешением, но на самом деле разрешение не будет таким, как вы ожидаете (микро или нано секунды) без дополнительного оборудования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...