Измерение времени работы алгоритмов по тактам

0

Я использую следующий фрагмент кода для измерения времени работы алгоритмов с точки зрения тиков часов:

clock_t t;
t = clock();
//run algorithm
t = clock() - t;
printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);

Однако это возвращает 0, когда размер ввода мал. Как это вообще возможно?

  • 0
    пожалуйста, отметьте свой язык программирования
  • 0
    Потому что в общем случае POSIX определяет CLOCKS_PER_SEC как 1 миллион, что означает, что вещи, которые принимают <1us, не будут регистрироваться. Во-вторых, значение, возвращаемое функцией clock() , не обязательно увеличивается на 1 каждый раз; Степень детализации может составлять около 10 тиков за обновление и обновляться каждые 10 мкс на +10.
Показать ещё 1 комментарий
Теги:
performance
algorithm

2 ответа

3
Лучший ответ

Часы имеют некоторую детализацию, зависящую от нескольких факторов, таких как ваша ОС.

Поэтому может случиться так, что ваш алгоритм работает так быстро, что часы не имеют времени на обновление. Следовательно, измеренная длительность 0.

Вы можете попытаться выполнить свой алгоритм n раз и разделить измеренное время на n чтобы лучше понять время, затраченное на небольшие входы.

1

Разрешение стандартной функции C clock() может сильно различаться между системами и, вероятно, слишком мало для измерения вашего алгоритма. У вас есть 2 варианта:

  1. Использовать определенные функции операционной системы
  2. Повторите свой алгоритм несколько раз, пока он не займет достаточно много времени, чтобы его можно было измерять с помощью часов()

Для 1) вы можете использовать QueryPerformanceCounter() и QueryPerformanceFrequency(), если ваша программа работает под окнами или использует clock_gettime(), если она работает в Linux.

Более подробную информацию см. на этих страницах: QueryPerformanceCounter() clock_gettime()

Для 2) вы должны выполнить свой алгоритм определенное количество раз последовательно, так что время, сообщаемое clock(), находится на несколько величин выше минимальной детализации часов(). Предположим, что clock() работает только с шагом в 12 микросекунд, тогда время, затрачиваемое на общий тестовый прогон, должно составлять не менее 1,2 миллисекунды, поэтому ваше измерение времени имеет отклонение не более 1%. В противном случае, если вы измеряете время в 12 микронов, вы никогда не знаете, работает ли оно на 12,0 микрона или, может быть, на 23,9 микрона, но следующего более крупного такта() тика не произошло. Чем чаще ваш алгоритм выполняется последовательно во время измерения времени, тем точнее будет ваше измерение времени. Также не забудьте скопировать-вставить вызов в ваш алгоритм для последовательных исполнений; если вы просто используете счетчик циклов для цикла, это может серьезно повлиять на ваше измерение!

  • 0
    Для Mac OS X это mach_absolute_time() вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню