Почему в Windows нет boost :: date_time с разрешением в микросекундах?

На Win32 система boost::date_time::microsec_clock() реализуется с использованием ftime, который обеспечивает только разрешение в миллисекундах: Ссылка на документ

В Stackoverflow есть несколько вопросов / ответов, в которых говорится об этом и содержится ссылка на документацию, но не объясняется, почему это так:

По-видимому, существуют способы реализации разрешения микросекунд в Windows:

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

3

Решение

GetSystemTimePreciseAsFileTime стало доступно только в приложениях для Windows 8 Desktop. Это имитирует Linux GetTimeOfDay. Реализация использует QueryPerformanceCounter достичь микросекундного разрешения. Метки времени берутся во время увеличения системного времени. Последующие звонки GetSystemTimePreciseAsFileTime возьмет системное время и добавит прошедшее «время счетчика производительности» (прошедшие такты / частоту счетчика производительности) в качестве части с высоким разрешением.

Функциональность QueryPerformanceCounter опять-таки зависит от конкретных деталей платформы (HPET, таймер ACPI PM, инвариант TSC и т. д.). Увидеть MSDN: получение меток времени с высоким разрешением а также SO: Является ли QueryPerformanceFrequency точным при использовании HPET? для деталей.
Различные версии Windows имеют специальные схемы для обновления системного времени. Windows XP имеет фиксированное время файла, которое не зависит от разрешения системного таймера. Только в более поздних версиях Windows XP можно изменять гранулярность системного времени, изменяя разрешение системного таймера.

Это можно сделать с помощью API мультимедийного таймера. timeBeginPeriod и / или скрытый API NtSetTimerResolution (Увидеть этот так ответ для более подробной информации об использовании `
timeBeginPeriod и NtSetTimerResolution).

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


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

Принятие фактов, изложенных выше, сделает реализацию очень сложной, а результат — очень специфичным для платформы. Каждая (!) Версия Windows претерпела серьезные изменения времени. Даже последний маленький шаг от 8 до 8.1 значительно изменил процедуру отсчета времени. Тем не менее, есть еще возможности для дальнейшего улучшения времени на Windows.


Я должен упомянуть, что GetSystemTimePreciseAsFileTime Начиная с Windows 8.1, результаты не такие точные, как ожидалось или указано в MSDN: функция GetSystemTimePreciseAsFileTime. Он объединяет время системного файла с результатом QueryPerformanceCounter чтобы заполнить промежуток между последовательными приращениями времени файла, но это не учитывает корректировки системного времени. Активная системная настройка времени, например сделано SetSystemTimeAdjustment, изменяет детализацию системного времени и прогресс системного времени. Тем не менее, используется счетчик производительности частоты, чтобы построить результат GetSystemTimePreciseAsFileTime поддерживается постоянным В результате часть микросекунд отключается регулировочным усилением, установленным SetSystemTimeAdjustment,

2

Другие решения

QueryPerformanceCounter не могу помочь вам в этой проблеме. Он дает вам метку времени, но, поскольку вы не знаете, когда запускается счетчик, нет надежного способа вычислить из него абсолютную точку времени. boost :: date_time — это такой (понятный пользователю) момент времени.
Другое отличие состоит в том, что счетчик, такой как QueryPerformanceCounter, дает вам постоянно увеличивающийся таймер, в то время как системное время может зависеть от пользователя и поэтому может прыгать.
Таким образом, 2 вещи для разных вариантов использования. Один для представления в реальном времени, другой для получения точного времени в программном обеспечении и для сравнительного анализа.

GetSystemTimePreciseAsFileTime кажется, отвечает требованиям абсолютного времени с высоким разрешением. Я думаю, что он не был использован, потому что он требует Windows8.

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector