Я играю с QueryPerformanceFrequency
,
Раньше возвращался 3.6 Mhz
Но этого было недостаточно для того, что я пытался сделать.
Я включил HPET
используя эту команду bcdedit /set useplatformclock true
, Теперь возвращается 14.3 Mhz
, Это здорово, это более точно … за исключением того, что это не так. Я быстро понял, что я не получил зернистость, которую я ожидал.
Если я попытаюсь опросить QueryPerformanceCounter
пока это не тикает, самое маленькое приращение, которое я могу получить, является 11
, что значит 1.27Mhz
, Если я попытаюсь посчитать количество различных значений, которые я могу получить QueryPerformanceCounter
в одну секунду я получаю 1.26Mhz
,
Так что мне было интересно, есть ли способ действительно использовать 14.3 Mhz
в полной мере?
Я использую Windows 7, 64-битную систему, Visual Studio 2008.
Использование оборудования HPET в качестве источника для QueryPerformanceCounter (QPC), как известно, связано с большими накладными расходами.
QPC является дорогостоящим вызовом при настройке с HPET.
Он обеспечивает 14,3 МГц, что предполагает высокую точность, но, как вы обнаружили, его нельзя назвать достаточно быстрым, чтобы на самом деле разрешить эту частоту.
Поэтому Microsoft превратилась в счетчик меток времени ЦП (TSC) в качестве источника для QPC, когда оборудование способно это сделать. Запросы TSC имеют намного меньшие накладные расходы. Соответствующая частота, используемая для QPC, обычно представляет собой частоту ЦП, деленную на 1024; также обычно несколько МГц.
Вызов QPC в режиме TSC настолько быстр, что многие последовательные вызовы могут показывать один и тот же результат (обычно около 20-30 вызовов или 15-20 нс / вызов).
Таким образом, вы можете получить типичные разрешения прибл. 0,3 us (на процессоре 3,4 ГГц).
Вы наблюдали 3,6 МГц, прежде чем переключиться на HPET. Вероятно, это подпись системного таймера ACPI PM (3579545 Гц), который указывает, что вы не работали с QPC на основе TSC до перехода на HPET.
Так или иначе, использование таймера HPET или ACPI PM приводит к приемлемому разрешению в диапазоне нескольких МГц. Оба не могут предоставить полное разрешение, заданное частотой счетчика производительности (PCF), потому что вызов QPC слишком дорогой. Только QPC, основанный на TSC, достаточно быстр и способен фактически отбирать QPC.
Microsoft недавно выпустила более подробную информацию по этому вопросу:
Увидеть Получение меток времени с высоким разрешением (MSDN 2014) для деталей.
Это всеобъемлющая статья с множеством примеров и подробным описанием. Необходимо прочитать для пользователей QPC.
…способ действительно использовать 14,3 МГц в полной мере?
К сожалению нет.
Вы можете запустить Coreinfo.exe
Утилита от Windows Sysinternals. Sysinternals перешел в Microsoft technet. Вот ссылка: Системные информационные утилиты Sysinternals. Это даст вам ответ на вопрос: Как я могу проверить, имеет ли моя система неинвариантный TSC?
Резюме: Наилучшее разрешение / точность / гранулярность достигается QPC на основе TSC.
КСТАТИ: Правильный выбор оборудования в качестве ресурса для QPC также влияет на стоимость вызовов нового Функция GetSystemTimePreciseAsFileTime (Рабочий стол Windows 8 и выше), потому что он внутренне использует QPC.
Других решений пока нет …