2013-10-14 2 views
3

Я использую довольно простой код для измерения времени выполнения. Он работает хорошо, пока я не уверен, может быть не более 20 минут. Но после (> 20 минут). он возвращает отрицательные результаты. Я искал на форумах и пытался все, как изменение типа данных, используя длинный unsigned (который возвращает 0), но снова не сработал. Ниже приведен фрагмент моего кодаclock() возвращает отрицательное значение в C

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

Любая помощь приветствуется, спасибо заранее.

+0

Примечание: 'clock()' возвращает тип 'clock_t'. – chux

+0

Не используйте 'clock()'. Это багги практически на всех реалиях реального мира, и ничего полезного не принесет, даже если бы это не было ошибкой. –

ответ

6

POSIX требует, чтобы CLOCKS_PER_SEC составлял 1,000,000. Это означает, что ваш счет находится в микросекундах - и 2 микросекунды - около 35 минут. Ваш таймер просто переполнен, поэтому вы не можете получить значимые результаты, когда это произойдет.

Почему вы видите проблему на 20 минут, я не уверен - может быть, ваш CLOCKS_PER_SEC не совместим с POSIX. Независимо от того, ваша проблема - переполнение таймера. Вам придется решать эту проблему по-другому - возможно, посмотрите на getrusage(2).

+0

Обратите внимание, что это ошибка в реализации. C требует 'clock' сбой (возврат' (clock_t) -1'), если результат не представлен; упаковка не разрешена. См. Интерпретацию для [Остин Group issue 686] (http://austingroupbugs.net/view.php?id=686). –

2

clock_t длинный, который представляет собой 32-разрядное знаковое значение - он может удерживать 2^31 перед переполнением. В 32-битной системе значение CLOCKS_PER_SEC равно 1000000 [как указано POSIX] clock() вернет то же значение почти через каждые 72 минуты.

Согласно MSDN также он может возвращать -1.

истекшее время от стены часов с начала процесса (прошедшее времени в секундах раз CLOCKS_PER_SEC). Если сумма прошедшего времени недоступна, функция возвращает -1, отлитая как clock_t.

На стороне записки: -

clock() мер процессорного время, используемый программой, и не измеряет в реальное время и clock() возвращаемого значения задаются в микросекундах.

+0

Изучал определение 'clock_t'. Не нашел ничего, чтобы сказать, что это 'long', только его« диапазон и точность ... определяются реализацией ». (C11dr 7.21.1) Есть ли у вас полезная ссылка, чтобы показать, что она длинная или 32-разрядная? – chux

+0

@chux: - Я не буду держать пари, что он длинный, но я обнаружил, что долго обычно используется.Что касается одного запроса, вы можете проверить это: - ** В системе GNU clock_t эквивалентен long int, а CLOCKS_PER_SEC - целочисленное значение. ** http://www.cs.utah.edu/dept/old/texinfo/ glibc-manual-0.02/library_19.html Поправьте меня, если я ошибаюсь? :( –

+0

@chux: - Это неправильно? Или я что-то пропустил. Прокомментируйте, если я пропустил что-нибудь. Спасибо! :) –

0

Вы можете использовать clock_gettime() с опцией CLOCK_PROCESS_CPUTIME_ID, если вы находитесь в системе POSIX. clock_gettime() использует struct timespec для возврата информации о времени, поэтому не страдает от той же проблемы, что и при использовании одного целого.

Смежные вопросы