Я рассчитываю, сколько времени потребуется для выполнения трех различных типов поиска: последовательного, рекурсивного двоичного и итеративного двоичного. У меня есть те, на месте, и это итерация и завершить поиск. Моя проблема в том, что, когда я проверяю их время, я каждый раз получаю 0 для всех из них, даже если я создаю массив из 100 000 и у меня он ищет что-то не в этом массиве. Если я устанавливаю точку останова в поиске, это, очевидно, удлиняет время и дает мне разумное время, с которым я могу работать. Но в противном случае это всегда 0. Вот мой код, он похож на все три таймера поиска.
clock_t recStart = clock();
mySearch.recursiveSearch(SEARCH_INT);
clock_t recEnd = clock();
clock_t recDiff = recEnd - recStart;
double recClockTime = (double)recDiff/(double)CLOCKS_PER_SEC;
cout << recClockTime << endl;
cout << CLOCKS_PER_SEC << endl;
cout << recClockTime << endl;
За последние два я получаю 1000
а также 0
,
Я что-то здесь не так делаю? Или это в моем поиске объекта?
clock()
это не точный таймер, и он просто не работает хорошо для определения временных интервалов.
С говорит часы возвращает наилучшее приближение реализации к времени процессора, используемому программой с начала определенной эпохой реализации, связанной только с вызовом программы.
Если между двумя последовательными вызовами часов ваша программа занимает меньше времени, чем одно целое функции часов, вы можете получить 0. POSIX clock
определяет единство с CLOCKS_PER_SEC
как 1000000
(тогда единица равна 1 микросекунде).
(http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html)
Для измерения тактовых циклов в x86 / x64 вы можете использовать сборку, чтобы получить счетчик тактов регистра счетчика меток времени CPU. rdtsc
, (что может быть достигнуто путем встроенной сборки?) Обратите внимание, что он возвращает отметку времени, а не количество прошедших секунд. Таким образом, вам также необходимо получить частоту процессора.
Однако лучший способ получить точное время в секундах зависит от вашей платформы.
Подводя итог, практически невозможно добиться расчета и печати clock_t
время в секундах точно. Возможно, вы захотите увидеть этот на Stackoverflow, чтобы найти лучший подход (если точность является главным приоритетом).
clock()
просто не хватает разрешения — вот одна хорошая дискуссия / блог на эту тему
http://www.guyrutenberg.com/2007/09/10/resolution-problems-in-clock/
Я думаю, что два варианта либо использовать clock_gettime
или даже лучше вы рассматривали возможность использования OProfile или же CodeAnalyst?
Я лично предпочитаю использовать инструменты — OProfile — это хорошо. Я не использовал CodeAnalyst раньше — а затем есть Valgrind и gprof.
Если вы настаиваете на использовании clock_gettime
— пожалуйста, проверьте это
http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/