Как рассчитать и распечатать время clock_t примерно

Я рассчитываю, сколько времени потребуется для выполнения трех различных типов поиска: последовательного, рекурсивного двоичного и итеративного двоичного. У меня они на месте, и он выполняет итерацию и завершает поиск. Моя проблема в том, что когда я измеряю их все, я каждый раз получаю 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.

Я делаю что-то не так здесь? Или это в моем объекте поиска?


person SirRupertIII    schedule 17.02.2013    source источник
comment
С тех пор, как я нашел auto_cpu_timer от boost, я никогда не оглядывался назад. Он позаботится обо всех этих вещах для вас. Создайте экземпляр таймера, пусть он выйдет за рамки, вуаля.   -  person us2012    schedule 17.02.2013
comment
Запустите поиск в цикле (например, миллион раз). Затем время, которое вы записали, разделите на количество итераций, чтобы получить время одного вызова для поиска.   -  person jxh    schedule 17.02.2013
comment
Вы правильно поняли, добавив грубо, но я полагаю, что грубо должно быть что-то вроде 0,2 с, что clock(), кажется, здесь работает нормально.   -  person phoeagon    schedule 17.02.2013
comment
Да, я предполагаю, что это займет всего 0,2, но я получаю ноль, даже если я настрою его на поиск через 1 000 000 итераций. Тогда этот код выглядит нормально? Это где-то еще, где моя проблема?   -  person SirRupertIII    schedule 17.02.2013
comment
@KKendall: Как выглядит ваш код с миллионом итераций? Что вы видите, когда выводите recDiff и CLOCKS_PER_SEC по отдельности?   -  person jxh    schedule 17.02.2013
comment
@KKendall: сравните свой код с: ideone.com/CXajTQ   -  person jxh    schedule 17.02.2013
comment
@user315052 внес правку   -  person SirRupertIII    schedule 17.02.2013
comment
@KKendall: вы можете либо использовать часы с более высоким разрешением, либо изменить свой код, чтобы дать своим часам то, что они могут измерять. Других альтернатив нет.   -  person jxh    schedule 17.02.2013


Ответы (2)


clock() не является точным таймером, и он просто плохо работает для коротких интервалов.

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

Если между двумя последовательными вызовами часов ваша программа занимает меньше времени, чем одна единица функции часов, вы можете получить 0. POSIX clock определяет единицу с CLOCKS_PER_SEC как 1000000 (единица тогда равна 1 микросекунде).

(http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html)

Чтобы измерить тактовые циклы в x86/x64, вы можете использовать ассемблер для получения счетчика часов регистра счетчика меток времени ЦП rdtsc. (что может быть достигнуто встроенной сборкой?) Обратите внимание, что он возвращает отметку времени, а не количество прошедших секунд. Поэтому вам также необходимо получить частоту процессора.

Однако лучший способ получить точное время в секундах зависит от вашей платформы.


Подводя итог, можно сказать, что практически невозможно вычислить и распечатать clock_t времени в секундах точно. Возможно, вы захотите просмотреть это в Stackoverflow, чтобы найти лучший подход (если точность является главным приоритетом). .

person phoeagon    schedule 17.02.2013

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/

person Abhi    schedule 17.02.2013