Мне нужно измерить время выполнения функции в наносекундах. Теперь я хочу понять, может ли мой компьютер сделать это и какова точность измерений. Было предложено использовать QueryPerformanceFrequency () для получения частоты HPET, а 1 / hpetFrequency — это атомное время, которое можно измерить. Это правильно? Я имею в виду, что если частота моего процессора составляет 3,33 ГГц, даже 1 ГГц, то одна тактовая частота составляет одну наносекунду. Разве это не значит, что я могу измерять наносекундами?
Для измерения времени необходима частота процессора или HPET, и почему?
Вы не можете измерить до 1 наносекунды, вы также не можете измерить до 10 наносекунд. Это потому, что каждый action of measurement
требует какой-то звонок Один из самых быстрых API
GetSystemTimeAsFileTime (). Звонок требует 10-15 нс. Но его разрешение / детализация довольно плохие (в режиме ms). QueryPerformanceCounter () доставляет частоты в диапазоне от МГц до ГГц, в зависимости от используемого оборудования. Этот вызов не такой быстрый, но на частоте 1 МГц вы получаете разрешение 1 мкс. На такой частоте, заданной QueryPerformanceFrequency (), последовательный вызов может возвращать равные значения, потому что вызов быстрее, чем скорость приращения.
Другим источником является счетчик меток времени процессора (rdtsc). Но есть и некоторые недостатки: на современном оборудовании реализована повышенная частота процессора. Поэтому эту частоту нельзя считать постоянной. Таким образом, измерения возможны только во время постоянных фаз.
Фактически, ни один из источников частоты не обеспечивает постоянную частоту. Все эти частоты генерируются некоторым оборудованием, которое имеет offset and drift
, Таким образом, ОС вернет значение QueryPerformanceFrequency или частоты процессора и заставит вас поверить, что это константа. Тем не менее, номер вы получите только close estimates
,
Реальная точная синхронизация может быть выполнена только тогда, когда эти частоты откалиброваны по системам RTC. Увидеть этот публикация для более подробной информации о точном времени на окнах.
Редактировать: Windows выбирает Time Stamp Counter
процессора. В таких случаях результат QPF () равен скорости процессора, деленной на фиксированное число (1024 в вашем случае). Windows предпочитает строить хронометраж вокруг TSC с предпочтением, когда доступен постоянный / инвариантный TSC. 3,33 ГГц / 1024 = 3,25 МГц.
Других решений пока нет …