Я пишу профилировщик, который запрашивает таймер всякий раз, когда функция входит или выходит. Так что возможно, что это queried тысячи раз в секунду.Как я могу установить быстрый и высокий разрешающий таймер в Windows?
Первоначально я использовал QueryPerformanceCounter, несмотря на то, что это высокое разрешение, оно оказалось довольно медленно. В соответствии с вопросом What happens when QueryPerformanceCounter is called? у меня также наблюдалось заметное замедление, когда я использую QPC в профилировщике, но, вероятно, не так уж плохо, что составляет 1-2 мс. Если я заменил его GetTickCount Я не заметил замедление, но эта функция неточна для профилирования.
Упомянутый вопрос упоминается о масках близости. Я попытался использовать SetProcessAffinityMask(GetCurrentProcess(), 1)
, чтобы связать его, но он не улучшает производительность вообще.
Я не знаю, имеет значение это или нет, но до сих пор я тестировал его на Windows, который работает в VirtualBox на хосте Linux. Это может быть проблема?
[Эта статья] (http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408.aspx) выглядит интересным –
О, и да, виртуализация может быть проблемой для кода, который использует низкую такие как ... таймеры, которые используют регистры процессора, например ;-) –
Инструкция RDTSC снова используется для современных процессоров. Также используется QueryThreadCycleTime(). Имейте в виду, что преобразование «циклов» во времени не является прямым. –