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

Внутри статического конструктора 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.

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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