Объяснение о счетчике производительности высокого разрешения и его существовании, связанном с .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-секунды) без дополнительного оборудования.