La forma correcta de usar clock() para medir el tiempo sería:
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
Esto se debe a que no se garantiza que clock_t sea un int, o cualquier otro tipo.
Bueno, quieres la hora something_else()
¿toma? Prueba esto:
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
struct timeval start, end;
long mtime, secs, usecs;
gettimeofday(&start, NULL);
something_else();
gettimeofday(&end, NULL);
secs = end.tv_sec - start.tv_sec;
usecs = end.tv_usec - start.tv_usec;
mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
printf("Elapsed time: %ld millisecs\n", mtime);
return 0;
}
Supongo que la razón es que tu something_else()
consume tan poco tiempo que excede la precisión de clock()
. Intenté llamar a clock()
dos veces en consecuencia y ambos start
y end
es cero, pero el resultado es razonable cuando hago algunas cosas que consumen mucho tiempo.
Aquí está mi fragmento de código de prueba:
int main(void) {
clock_t start, end;
start = clock();
int c;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < (1<<30); j++) {
c++;
}
}
end = clock();
printf("start = %d, end = %d\n", start, end);
return 0;
}
Y el resultado en mi computadora es:
start = 0, end = 27700000
Además, dos consejos:
- Al realizar pruebas, no utilice ninguna optimización del compilador . Puedes pensar que tu
something_else()
lleva mucho tiempo, pero el compilador puede ignorar esas operaciones (especialmente los bucles) ya que las considera sin sentido. - Usar
sizeof(clock_t)
en su plataforma para ver el tamaño declock_t
.
clock
La función no mide los ciclos de reloj de la CPU.
C dice clock
"devuelve la mejor aproximación de la implementación al tiempo de procesador utilizado por el programa desde el comienzo de una era definida por la implementación relacionada únicamente con la invocación del programa".
Si entre dos clock
sucesivos llama a tu programa toma menos tiempo que una unidad del clock
función, podría obtener 0
.
POSIX clock
define la unidad con CLOCKS_PER_SEC
como 1000000 (la unidad es entonces 1 microsegundo).
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
Para medir los ciclos de reloj en x86/x64, puede usar el ensamblado en línea para recuperar el conteo de reloj del registro del contador de marca de tiempo de la CPU rdtsc
.