La función C `reloj ()` sólo devuelve un cero
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
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
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