Tre alternative
clock()
gettimeofday()
clock_gettime()
clock_gettime()
arriva fino alla precisione del nanosecondo e supporta 4 orologi.
-
CLOCK_REALTIME
Orologio in tempo reale a livello di sistema. L'impostazione di questo orologio richiede privilegi appropriati.
-
CLOCK_MONOTONIC
Orologio che non può essere impostato e rappresenta il tempo monotono da un punto di partenza non specificato.
-
CLOCK_PROCESS_CPUTIME_ID
Timer per processo ad alta risoluzione dalla CPU.
-
CLOCK_THREAD_CPUTIME_ID
Orologio del tempo della CPU specifico del thread.
Puoi usarlo come
#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 funzione clock() restituisce l'ora della CPU per il tuo processo, non l'ora dell'orologio. Credo che questo sia ciò a cui l'OP era interessato. Se si desidera l'ora dell'orologio da parete, allora gettimeofday() è una buona scelta come suggerito da una risposta precedente. clock_gettime() può fare entrambe le cose se il tuo sistema lo supporta; sul mio sistema integrato Linux clock_gettime() non è supportato, ma clock() e gettimeofday() lo sono.
Di seguito è riportato il codice per ottenere l'ora dell'orologio da parete utilizzando 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;
}
Per cominciare devi usare l'aritmetica in virgola mobile. Qualsiasi valore intero diviso per un valore intero più grande sarà zero, sempre.
E ovviamente dovresti davvero fare qualcosa tra ottenere l'ora di inizio e di fine.
A proposito, se hai accesso a gettimeofday
è normalmente preferito a clock
in quanto ha una risoluzione maggiore. O forse clock_gettime
che ha una risoluzione ancora più elevata.