Как вычислить время операции в микро второй точности

Я хочу вычислить производительность функции в микро второй точности на платформе Windows.

Теперь сам Windows имеет миллисекунду granuality, поэтому как я могу достигнуть этого.

Я попробовал после образца, но не получения корректных результатов.

LARGE_INTEGER ticksPerSecond = {0};
LARGE_INTEGER tick_1 = {0};
LARGE_INTEGER tick_2 = {0};
double uSec = 1000000;

// Get the frequency
QueryPerformanceFrequency(&ticksPerSecond);

//Calculate per uSec freq
double uFreq = ticksPerSecond.QuadPart/uSec;

// Get counter b4 start of op
QueryPerformanceCounter(&tick_1);

// The ope itself
Sleep(10);

// Get counter after opfinished
QueryPerformanceCounter(&tick_2);

// And now the op time in uSec
double diff = (tick_2.QuadPart/uFreq) - (tick_1.QuadPart/uFreq);
6
задан jfs 13 May 2010 в 17:38
поделиться

8 ответов

Нет, вы, вероятно, получаете точный результат, QueryPerformanceCounter () хорошо работает для коротких интервалов времени. Что неверно, так это то, что вы ожидаете точности Sleep (). У него разрешение 1 миллисекунда, точность намного хуже. Не лучше, чем примерно 15,625 миллисекунды на большинстве компьютеров с Windows.

Чтобы получить значение, близкое к 1 миллисекунде, сначала нужно вызвать timeBeginPeriod (1) . Это, вероятно, улучшит соответствие, игнорируя дрожание, которое вы получите от Windows, будучи многозадачной операционной системой.

3
ответ дан 8 December 2019 в 03:26
поделиться

Или вы можете использовать gettimeofday (), который дает вам структуру timeval, которая является отметкой времени (с точностью до мкс)

-1
ответ дан 8 December 2019 в 03:26
поделиться

Если вы делаете это для автономного профилирования, очень простой способ - запустить функцию 1000 раз, измерить до ближайшей миллисекунды и разделить на 1000.

0
ответ дан 8 December 2019 в 03:26
поделиться

Выполните операцию в цикле около миллиона раз и разделите результат на это число. Таким образом вы получите среднее время выполнения для такого количества выполнений. Время одного (или даже сотни) выполнения очень быстрой операции очень ненадежно из-за многозадачности и прочего.

20
ответ дан 8 December 2019 в 03:26
поделиться

Чтобы получить более точное разрешение, чем 1 мс, вам нужно будет обратиться к документации вашей ОС. Могут быть API-интерфейсы для получения разрешения таймера в микросекундах. Если да, запустите приложение много раз и возьмите средние значения.

0
ответ дан 8 December 2019 в 03:26
поделиться
  • скомпилируйте его
  • посмотрите на вывод ассемблера
  • посчитайте количество каждой инструкции в вашей функции
  • примените циклы на инструкцию в вашем целевом процессоре
  • в итоге получите количество циклов
  • умножьте на тактовую частоту, на которой вы работаете
  • примените произвольные коэффициенты масштабирования для учета промахов кэша и неверных предсказаний ветвлений lol

(блин, меня за этот ответ заминусуют)

.
7
ответ дан 8 December 2019 в 03:26
поделиться

Мне нравится ответ Матти Вирккунена. Проверьте время, вызовите функцию большое количество раз, проверьте время, когда вы закончите, и разделите на количество раз, которое вы вызывали функцию. Он упомянул, что вы можете отключиться из-за прерывания работы ОС. Вы можете изменить количество звонков и увидеть разницу. Можете ли вы повысить приоритет процесса? Сможете ли вы сделать так, чтобы все вызовы находились в одном временном интервале ОС?

Поскольку вы не знаете, когда операционная система может заменить вас, вы можете поместить все это в большой цикл, чтобы выполнить все измерения большое количество раз, и сохранить наименьшее число, поскольку это тот, который был наименьшее количество прерываний ОС. Это все еще может быть больше, чем фактическое время для выполнения функции, потому что оно все еще может содержать некоторые прерывания ОС.

0
ответ дан 8 December 2019 в 03:26
поделиться

Санджит,

Похоже ( для меня), как будто вы делаете это совершенно правильно. QueryPerformanceCounter - отличный способ измерения коротких периодов времени с высокой степенью точности. Если вы не видите ожидаемого результата, скорее всего, это связано с тем, что вы не спите столько времени, сколько вы ожидали! Однако, скорее всего, он измеряется правильно.

Я хочу вернуться к вашему первоначальному вопросу о том, как измерить время в окнах с точностью до микросекунд. Как вы уже знаете, высокопроизводительный счетчик (например, QueryPerformanceCounter) «тикает» с частотой, сообщаемой QueryPerformanceFrequency. Это означает, что вы можете измерять время с точностью, равной:

1 / частота секунд

На моей машине QueryPerformanceFrequency сообщает 2337910 (отсчетов / сек). Это означает, что QPC моего компьютера может выполнять измерения с точностью 4,277e-7 секунд или 0,427732 микросекунды. Это означает, что наименьший бит времени, который я могу измерить, составляет 0,427732 микросекунды. Это, конечно, дает вам точность, о которой вы изначально просили :) Частота вашей машины должна быть аналогичной, но вы всегда можете посчитать и проверить ее.

0
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: