clock() возвращает отрицательное значение в C
Я использую довольно простой код для измерения времени выполнения. Это работает хорошо, пока я не уверен, что может быть не более 20 минут. Но после (>20 минут.) Он возвращает отрицательные результаты. Я искал по всем форумам и пробовал все, например, изменение типа данных, используя long unsigned (который возвращает 0), но снова не удалось. Ниже приведен фрагмент моего кода
main()
{
time_t start,stop;
double time_arm;
start = clock();
/* ....... */
stop = clock();
time_arm=(double)(stop-start)/(double)CLOCKS_PER_SEC;
printf("Time Taken by ARM only is %lf \n",time_arm);
}
Выходной сигнал, взятый только ARM, равен -2055.367296
Любая помощь приветствуется, спасибо заранее.
3 ответа
POSIX требует CLOCKS_PER_SEC
быть 1 000 000. Это означает, что ваш счет в микросекундах - и 2 31 микросекунды - это около 35 минут. Ваш таймер просто переполнен, поэтому вы не можете получить значимые результаты, когда это произойдет.
Почему вы видите проблему через 20 минут, я не уверен - может быть, ваш CLOCKS_PER_SEC
не POSIX-совместимый. В любом случае, ваша проблема - переполнение таймера. Вам нужно будет решить эту проблему по-другому - возможно, посмотрите на getrusage(2)
,
clock_t
это long, которое является 32-битным значением со знаком - оно может содержать 2^31, прежде чем переполнится. В 32-битной системе CLOCKS_PER_SEC
значение равно 1000000
[как упомянуто POSIX] clock() будет возвращать одно и то же значение почти каждые 72 минуты.
Согласно MSDN также может возвращать -1.
Истекшее время настенных часов с начала процесса (прошедшее время в секундах, умноженное на CLOCKS_PER_SEC). Если истекшее время недоступно, функция возвращает -1, приведенное как clock_t.
На примечании стороны:-
clock()
измеряет процессорное время, используемое программой, и оно НЕ измеряет реальное время и clock()
возвращаемое значение указывается в микросекундах.
Вы можете попробовать использовать clock_gettime()
с CLOCK_PROCESS_CPUTIME_ID
вариант, если вы находитесь в системе POSIX. clock_gettime()
использования struct timespec
чтобы вернуть информацию о времени, чтобы не страдать от той же проблемы, что и использование одного целого числа.