Получение неожиданного ответа от этой функции clock () в C - PullRequest
3 голосов
/ 28 марта 2012
int main (int argc, const char * argv[]) {
    clock_t time1, time2;
    time1 = clock();
    //time1 = gettimeofday();


    add();
    time2 = clock();
    //time2= gettimeofday();
    float time = ((float)time2 - (float)time1) / 1000000.0F;
    printf("%fs\n", time);
    return 0;
}

В итоге я получаю что-то вроде 0.288640991s из этого (не уверен, если это много цифр справа, из текущего кода выше. Но я ожидаю секунд от строки:

float time = ((float)time2 - (float)time1) / 1000000.0F;

Когда я делю на 10000.0F, я получаю 28 секунд в реальном времени, что и есть на самом деле. Так почему же строка выше не делает этого?

РЕДАКТИРОВАТЬ: Я использую Mac, который, как я слышал, проблематичен.

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Сначала вы должны использовать CLOCKS_PER_SEC, а не магическое число.

В любом случае, если вы находитесь в системе POSIX, CLOCKS_PER_SEC определяется как миллион (то же значение, которое вы используете) в POSIX, так что это, вероятно, не ваша проблема.

Вы должны знать, что clock измеряет только время, когда процессор запускает вашу программу пользовательского пространства, а не время, проведенное в ядре или в другом процессе. Это важно, потому что если вы вызываете системный вызов или функцию, которая вызывает системный вызов, или если ваш процесс прерывается ядром, результат clock может показаться вам неправильным.

См. Например это:

 time_t time1, time2;

 time1 = clock();
 sleep(5);
 time2 = clock();

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

Если вы хотите измерить прошедшее время во время выполнения функции или блока кода, вам лучше использовать функцию gettimeofday.

0 голосов
/ 28 марта 2012

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

Чтобы превратить это в секунды, нужно поделить на CLOCKS_PER_SEC, а не 1000000.0F.


Бесстыдная самореклама:

В качестве альтернативы вы можете использовать мои stopwatch.h и stopwatch.c для измерения прошедшего времени.

...