c++ - funciones - La función C `clock()` solo devuelve un cero
time c++ (6)
La función C clock()
solo me devuelve un cero. Intenté usar diferentes tipos, sin mejoras ... ¿Es esta una buena manera de medir el tiempo con 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 32 bit, RedHat Linux, gcc 3.4.6
Llamar a sleep()
no va a consumir ningún tiempo de CPU. Aunque deberías ver una pequeña diferencia. Corrigí el error de falta de coincidencia de tipo de printf 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
Puede probar gettimeofday()
para obtener el tiempo real empleado en ejecutar su programa.
Probablemente necesitas
double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; }
double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; }
y uso algo 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()
solo como reloj y solo cuenta el tiempo empleado en la CPU solo en función de los contadores de rendimiento. pero puede obtener un resultado utilizando la función anterior. Solo para verificar su aplicación ejecútelo con el comando time.
como el time ./a.out
salida del comando de tiempo:
real 0m5.987s user 0m0.674s sys 0m0.134s
y salida de la función personalizada Wall Time = 5.98505 CPU Time = 0.8
clock_t es un tipo entero No puedes imprimirlo con% f. Vea la respuesta de Fred para saber por qué la diferencia es 0.
clock()
informa el tiempo de CPU utilizado. sleep()
no usa ningún tiempo de CPU. Por lo tanto, tu resultado probablemente sea exactamente correcto, pero no es lo que quieres.
man clock
No está devolviendo lo que piensas que es. También man gettimeofday
- es más probable lo que quieres.
printf("start = %.20f/nend = %.20f/n", start, end);
debiera ser:
printf("start = %d/nend = %d/n", start, end);