Tres alternativas
clock()
gettimeofday()
clock_gettime()
clock_gettime()
va hasta una precisión de nanosegundos y admite 4 relojes.
-
RELOJ_HORA REAL
Reloj en tiempo real para todo el sistema. Configurar este reloj requiere los privilegios apropiados.
-
RELOJ_MONOTÓNICO
Reloj que no se puede configurar y representa un tiempo monótono desde algún punto de inicio no especificado.
-
CLOCK_PROCESS_CPUTIME_ID
Temporizador por proceso de alta resolución desde la CPU.
-
CLOCK_THREAD_CPUTIME_ID
Reloj de tiempo de CPU específico del subproceso.
Puedes usarlo como
#include <time.h>
struct timespec start, stop;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
/// do something
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);
double result = (stop.tv_sec - start.tv_sec) * 1e6 + (stop.tv_nsec - start.tv_nsec) / 1e3; // in microseconds
Nota:La función de reloj () devuelve el tiempo de CPU para su proceso, no el tiempo de reloj de pared. Creo que esto es lo que le interesaba al OP. Si se desea la hora del reloj de pared, gettimeofday() es una buena opción como se sugiere en una respuesta anterior. clock_gettime() puede hacer cualquiera de los dos si su sistema lo admite; en mi sistema integrado de linux clock_gettime() no es compatible, pero clock() y gettimeofday() sí lo son.
A continuación se muestra el código para obtener la hora del reloj de pared usando gettimeofday()
#include <stdio.h> // for printf()
#include <sys/time.h> // for clock_gettime()
#include <unistd.h> // for usleep()
int main() {
struct timeval start, end;
long secs_used,micros_used;
gettimeofday(&start, NULL);
usleep(1250000); // Do the stuff you want to time here
gettimeofday(&end, NULL);
printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);
printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);
secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first
micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);
printf("micros_used: %d\n",micros_used);
return 0;
}
Para empezar, necesita usar aritmética de punto flotante. Cualquier valor entero dividido por un valor entero mayor será cero, siempre.
Y, por supuesto, deberías hacer algo entre obtener las horas de inicio y fin.
Por cierto, si tienes acceso a gettimeofday
normalmente se prefiere a clock
ya que tiene mayor resolución. O tal vez clock_gettime
que tiene una resolución aún mayor.