Pregunta

La función C clock() sólo me devuelve un cero. He intentado utilizar diferentes tipos, sin ninguna mejora ... ¿Es una buena manera de medir el tiempo con una buena precisión?

#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

Plataforma: Intel de 32 bits, RedHat Linux, gcc 3.4.6

¿Fue útil?

Solución

clock() informa de tiempo de CPU utilizado. sleep() no utiliza ningún tiempo de CPU. Por lo que su resultado es probablemente exactamente correcto, no es lo que desea.

Otros consejos

man clock. No es devolver lo que usted piensa que es. También man gettimeofday -. Que es más probable que lo que quiere

clock_t es un tipo entero. No se puede imprimir con% f. Ver respuesta de Fred por qué la diferencia es 0.

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

debería ser:

 printf("start = %d\nend   = %d\n", start, end);

sleep() Calling no se va a utilizar cualquier tiempo de CPU. Debería ver un poco diferencia, sin embargo. He corregido el error tipo printf falta de coincidencia en esta línea:

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

Y dio resultados razonables en mi máquina:

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

Se podría tratar gettimeofday() para obtener el tiempo real pasó el funcionamiento de su programa.

Es probable que tenga

double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; } y el uso de algo así como

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;

en lugar de    clock()

como reloj solo y sólo cuenta el tiempo dedicado a la CPU sólo sobre la base de los contadores de rendimiento. pero se puede obtener resultado utilizando la función anterior. sólo para verificar su aplicación se ejecute con el comando time

como time ./a.out

salida del comando de tiempo:

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

y la salida de la función personalizada Wall Time = 5.98505 CPU Time = 0.8

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top