Функция C `clock ()` просто возвращает ноль - PullRequest
17 голосов
/ 25 января 2010

Функция C clock() просто возвращает мне ноль. Я пытался использовать разные типы, без каких-либо улучшений ... Это хороший способ измерить время с хорошей точностью?

#include <time.h>
#include <stdio.h>

int main()
{
    clock_t start, end;
    double cpu_time_used;

    char s[32];

    start = clock();

    printf("\nSleeping 3 seconds...\n\n");
    sleep(3);

    end = clock();

    cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);

    printf("start = %.20f\nend   = %.20f\n", start, end);
    printf("delta = %.20f\n", ((double) (end - start)));
    printf("cpu_time_used  = %.15f\n", cpu_time_used);
    printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);

    return 0;
}
Sleeping 3 seconds...

start = 0.00000000000000000000
end   = 0.00000000000000000000
delta = 0.00000000000000000000
cpu_time_used  = 0.000000000000000
CLOCKS_PER_SEC = 1000000

Платформа: Intel 32 bit, RedHat Linux, gcc 3.4.6

Ответы [ 6 ]

26 голосов
/ 25 января 2010

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

6 голосов
/ 25 января 2010

man clock. Это не возвращает то, что вы думаете. Также man gettimeofday - это скорее всего то, что вы хотите.

4 голосов
/ 25 января 2010

Вызов sleep() не будет использовать процессорное время. Однако вы должны увидеть небольшую разницу. Я исправил ошибку несоответствия типов в этой строке:

printf("start = %.20f\nend   = %.20f\n", start, end);

И это дало разумные результаты на моей машине:

start = 1419
end   = 1485
delta = 66
cpu_time_used  = 0.000066000000000
CLOCKS_PER_SEC = 1000000

Вы можете попробовать gettimeofday(), чтобы узнать реальное время, потраченное на запуск вашей программы.

4 голосов
/ 25 января 2010
 printf("start = %.20f\nend   = %.20f\n", start, end);

должно быть:

 printf("start = %d\nend   = %d\n", start, end);
4 голосов
/ 25 января 2010

clock_t - целочисленный тип. Вы не можете распечатать его с% f. См. ответ Фреда , почему разница равна 0.

2 голосов
/ 26 ноября 2014

Вам, вероятно, нужно

double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; } и использование что-то вроде

double wall0 = get_wall_time(); double cpu0 = get_cpu_time(); for(long int i = 0; i<=10000000;i++){ func1(); } double wall1 = get_wall_time(); double cpu1 = get_cpu_time(); cout << "Wall Time = " << wall1 - wall0 << endl; cout << "CPU Time = " << cpu1 - cpu0 << endl;

вместо clock()

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

как time ./a.out

вывод команды времени:

real 0m5.987s user 0m0.674s sys 0m0.134s

и вывод пользовательских функций Wall Time = 5.98505 CPU Time = 0.8

...