Я использую следующий фрагмент кода для измерения времени работы алгоритмов с точки зрения тиков часов:
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.
Вы можете попытаться выполнить свой алгоритм n
раз и разделить измеренное время на n
чтобы лучше понять время, затраченное на небольшие входы.
Разрешение стандартной функции C clock() может сильно различаться между системами и, вероятно, слишком мало для измерения вашего алгоритма. У вас есть 2 варианта:
Для 1) вы можете использовать QueryPerformanceCounter() и QueryPerformanceFrequency(), если ваша программа работает под окнами или использует clock_gettime(), если она работает в Linux.
Более подробную информацию см. на этих страницах: QueryPerformanceCounter() clock_gettime()
Для 2) вы должны выполнить свой алгоритм определенное количество раз последовательно, так что время, сообщаемое clock(), находится на несколько величин выше минимальной детализации часов(). Предположим, что clock() работает только с шагом в 12 микросекунд, тогда время, затрачиваемое на общий тестовый прогон, должно составлять не менее 1,2 миллисекунды, поэтому ваше измерение времени имеет отклонение не более 1%. В противном случае, если вы измеряете время в 12 микронов, вы никогда не знаете, работает ли оно на 12,0 микрона или, может быть, на 23,9 микрона, но следующего более крупного такта() тика не произошло. Чем чаще ваш алгоритм выполняется последовательно во время измерения времени, тем точнее будет ваше измерение времени. Также не забудьте скопировать-вставить вызов в ваш алгоритм для последовательных исполнений; если вы просто используете счетчик циклов для цикла, это может серьезно повлиять на ваше измерение!
mach_absolute_time()
вы хотите.
CLOCKS_PER_SEC
как 1 миллион, что означает, что вещи, которые принимают <1us, не будут регистрироваться. Во-вторых, значение, возвращаемое функциейclock()
, не обязательно увеличивается на 1 каждый раз; Степень детализации может составлять около 10 тиков за обновление и обновляться каждые 10 мкс на +10.