Intereting Posts
В MinGW нет strsafe.h? Что использовать вместо этого? Сегментация C ++ при использовании стирания в std :: list Несколько экземпляров Singleton Есть ли более короткий способ инициализации QByteArray? C ++ 2011: разворачивание цикла на основе диапазона? Как создать массив строк в VBA / Excel и отправить его в C ++ DLL, чтобы его можно было повторить в DLL copy elision: переместить конструктор, не вызываемый при использовании тернарного выражения в return statement? Неочевидная пожизненная проблема с std :: prom и std :: future Приложение Windows Forms остается в памяти диспетчера задач после нажатия кнопки «stop debugging» Процесс Excel не прекратится после автоматизации COM QT и встроенная поддержка OpenGL в MS Windows Как я могу вывести внешний тип внутреннего типа в C ++? Приоритет оператора .. () и ++ -fsanitize не использовать золотой линкер в GCC-6.1 Исполняемый файл становится некорректным при копировании

Частота HPET и частота процессора для измерения времени

Мне нужно измерить время выполнения функции в наносекундах. Теперь я хочу понять, может ли мой компьютер это сделать и какова точность измерений. Было предложено использовать QueryPerformanceFrequency () для получения частоты HPET, а 1 / hpetFrequency – атомное время, которое можно измерить. Это правильно? Я имею в виду, если частота моего процессора составляет 3,33 ГГц, даже 1 ГГц, что одна тактовая частота составляет одну наносекунду. Разве это не означает, что я могу измерить наносекундами?

Для измерения времени важно, чтобы частота CPU или HPET была важна и почему?

    Вы не можете измерить до 1 наносекунды, вы не можете измерить до 10 наносекунд. Это связано с тем, что каждое action of measurement требует какого-либо вызова. Одним из самых быстрых API является GetSystemTimeAsFileTime (). Для вызова требуется 10-15 нс. Но это разрешение / гранулярность довольно бедны (в режиме ms). QueryPerformanceCounter () обеспечивает частоту в диапазоне от МГц до ГГц, в зависимости от подстилающего оборудования. Этот вызов происходит не так быстро, но на 1 МГц вы получаете разрешение 1 микросекунду. На такой частоте, заданной QueryPerformanceFrequency (), последовательный вызов может возвращать равные значения, потому что вызов быстрее, чем скорость приращения. Другим источником является счетчик штампа времени процессора (rdtsc). Но есть и некоторые недостатки: современное оборудование реализует удельную частоту процессора. Поэтому эту частоту нельзя считать постоянной. Таким образом, измерения возможны только при постоянных фазах.

    Фактически ни один из частотных источников не обеспечивает постоянную частоту. Все эти частоты генерируются некоторым оборудованием, которое имеет offset and drift . Таким образом, ОС вернет значение QueryPerformanceFrequency или частоту процессора и заставит вас поверить, что оно является постоянным. Тем не менее, число, которое вы получите, – это только close estimates .

    Реальное точное время может быть выполнено только тогда, когда эти частоты откалиброваны по сравнению с системами RTC. См. Эту публикацию для получения более подробной информации о точном времени в windowsх.

    Изменить: Windows выбирает Time Stamp Counter процессора. В таких случаях результат QPF () равен скорости процессора, деленной на фиксированное число (1024 в вашем случае). Windows предпочитает строить хронометраж вокруг TSC с предпочтением, когда имеется постоянный / инвариантный TSC. 3,33 ГГц / 1024 = 3,25 МГц.