clock()
mida el tiempo de CPU utilizado por su proceso, no el tiempo del reloj de pared. Cuando tiene varios subprocesos ejecutándose simultáneamente, obviamente puede grabar el tiempo de CPU mucho más rápido.
Si usted quiere saber el tiempo de ejecución del reloj de pared, es necesario utilizar una función apropiada. El único en ANSI C es time()
, que generalmente solo tiene una resolución de 1 segundo.
Sin embargo, como dijiste que estás usando POSIX, eso significa que puedes usar clock_gettime()
, definido en time.h
. El reloj CLOCK_MONOTONIC
en particular, es la mejor manera de utilizar para ello:
struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
/* ... */
clock_gettime(CLOCK_MONOTONIC, &finish);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec)/1000000000.0;
(Nótese que he hecho el cálculo de elapsed
cuidadosamente para asegurar que la precisión no se pierde cuando los intervalos de tiempo muy cortos).
Si su sistema operativo no proporciona CLOCK_MONOTONIC
(que se puede comprobar en tiempo de ejecución con sysconf(_SC_MONOTONIC_CLOCK)
), entonces se puede utilizar como punto de retorno CLOCK_REALTIME
- pero tenga en cuenta que este último tiene la desventaja de que generará resultados incorrectos si la hora del sistema se cambia mientras tu proceso se está ejecutando.
Ver [¿Es gettimeofday() garantía de tener una resolución de microsegundos?] (Http://stackoverflow.com/questions/88/is-gettimeofday-guaranteed-to-be-of-microsecondresolution) –
Ver esta respuesta para una solución portátil: http://stackoverflow.com/questions/361363/how-to-measure-time-in-milliseconds-using-ansi-c/37920181#37920181 –