2009-04-24 3 views
9

Я бы хотел использовать High Performance Event Timer (HPET) для инструмента профилирования, чтобы быстро измерить точность измерения. timeGetTime не обеспечивает достаточного разрешения на 1 мс, а QueryPerformanceCounter намного медленнее на чтение, чем хотелось бы. Я столкнулся с HPET, исследуя проблему, но я не вижу никаких примеров того, как на самом деле это получить.Доступна ли HPET в Windows?

Могу ли я использовать его напрямую (сборка в порядке), или мне приходится полагаться на средства мультимедиа/высокой производительности, уже встроенные в Win32 API?

+1

Я бы тоже хотел его использовать, так как я предполагаю, что я страдают той же проблемой в моем профилировщике. – leppie

+0

Это похоже на: http://msdn.microsoft.com/en-us/magazine/cc163996.aspx –

+0

В качестве дополнительного обновления: RDTSC и QueryPerformanceCounter небезопасны в использовании, когда система имеет непостоянную базовую частоту (разгон в системе). Windows не может настроить частоту QPC в тех случаях, которые приводят к искажениям времени. В таких случаях HPET и ACPI остаются единственными альтернативами надежного таймера. ** Поэтому этот вопрос остается открытым и остается без ответа. ** – Mysticial

ответ

-1

Я нашел this info, копаясь вокруг, и кажется, что это может быть наиболее экономически эффективным способом. Я попробую это, когда я получу кишки, чтобы вникать в сборку. :)

UPDATE

Я проверил это с моим профилировщика. хотя немного быстрее, кажется, у меня все еще есть тонны других накладных расходов :((я не беспокоился о сроках, так как я, похоже, не получал достаточной выгоды)

+3

Нет! Не используйте RDTSC, он будет делать странные вещи на многоядерных машинах. Каждое ядро, имеющее собственный счетчик, может давать эффекты, такие как функции с отрицательным временем и т. Д. Счетчики Timestamp не всегда синхронизируются! Был там, сделано это. –

+0

И скажите, что вы отслеживаете поток? Как это может повлиять на разницу? – leppie

+1

Отслеживание потока просто скажет вам, что * может быть проблемой, а не если есть * проблема или как ее исправить. Чтобы безопасно использовать RDTSC, вы должны * привязать поток к определенному ядру. Невозможно безопасно вычислить разницу RDTSC между ядрами из пользовательского пространства. –

1

Я также заинтересован в использовании HPET, но как таймер.Как я понимаю, QueryPerformanceCounter и QueryPerformanceFrequency фактически обращаются к счетчику и часам для HPET, и это работает в Windows XP (см., например, http://www.geisswerks.com/ryan/FAQS/timing.html).

Так что, используя QueryPerformanceCounter, вы фактически получаете доступ к счетчику, который формирует базу HPET, и все это присутствует в чипсете (а не на процессоре).

+2

Как я понимаю, XP НЕ поддерживает HPET, поэтому QueryPerformanceCounter фактически использует RDTSC. –

+0

См. Https://en.wikipedia.org/wiki/High_Precision_Event_Timer#cite_note-7 (обратите внимание на XP SP3 в «Использование и совместимость») для полного объяснения. Вкратце, XP использует «лучшее усилие» HPET _emulation_ с программным обеспечением и различным оборудованием. –

Смежные вопросы