Trois alternatives
clock()
gettimeofday()
clock_gettime()
clock_gettime()
va jusqu'à la précision de la nanoseconde et prend en charge 4 horloges.
-
CLOCK_REALTIME
Horloge en temps réel à l'échelle du système. Le réglage de cette horloge nécessite les privilèges appropriés.
-
CLOCK_MONOTONIC
Horloge qui ne peut pas être réglée et représente un temps monotone depuis un point de départ non spécifié.
-
CLOCK_PROCESS_CPUTIME_ID
Minuterie par processus haute résolution du CPU.
-
CLOCK_THREAD_CPUTIME_ID
Horloge de temps CPU spécifique au thread.
Vous pouvez l'utiliser comme
#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
Remarque :La fonction clock() renvoie le temps CPU pour votre processus, pas l'heure de l'horloge murale. Je crois que c'est ce qui intéressait l'OP. Si l'heure de l'horloge murale est souhaitée, alors gettimeofday() est un bon choix, comme suggéré par une réponse précédente. clock_gettime() peut faire l'un ou l'autre si votre système le supporte; sur mon système Linux embarqué, clock_gettime() n'est pas pris en charge, mais clock() et gettimeofday() le sont.
Vous trouverez ci-dessous le code permettant d'obtenir l'heure de l'horloge murale à l'aide de 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;
}
Pour commencer, vous devez utiliser l'arithmétique à virgule flottante. Toute valeur entière divisée par une valeur entière plus grande sera toujours zéro.
Et bien sûr, vous devriez réellement faire quelque chose entre obtenir les heures de début et de fin.
Au fait, si vous avez accès à gettimeofday
il est normalement préféré à clock
car il a une résolution plus élevée. Ou peut-être clock_gettime
qui a une résolution encore plus élevée.