Usa la funzione gettimeofday in C
-
Utilizzare la funzione
gettimeofday
per calcolare il tempo trascorso in un blocco di codice in C -
Usa la funzione
clock_gettime
per calcolare il tempo trascorso in un blocco di codice in C
Questo articolo spiegherà diversi metodi per calcolare il tempo trascorso in un blocco di codice utilizzando la funzione gettimeofday
in C.
Utilizzare la funzione gettimeofday
per calcolare il tempo trascorso in un blocco di codice in C
La funzione gettimeofday
è una funzione conforme a POSIX che recupera l’ora corrente con una precisione di microsecondi. La funzione accetta due argomenti; uno è del tipo struct timeval
e l’altro è struct timezone
. Anche se, la struttura del fuso orario
è stata deprezzata e dovrebbe essere passato il valore NULL
al suo posto. La struttura timeval
, invece, contiene due membri, tv_sec
e tv_usec
, che indicano il numero di secondi e microsecondi trascorsi dall’Epoch. Il seguente codice di esempio dimostra come possiamo misurare il tempo di esecuzione di una singola funzione - loopFunc
.
Generalmente, abbiamo bisogno di circondare qualsiasi blocco di codice che dovrebbe essere misurato con due chiamate di gettimeofday
, una prima e l’altra dopo il blocco. Una volta che la seconda chiamata a gettimeofday
ritorna con successo, possiamo calcolare la differenza di orario utilizzando la funzione definita dall’utente - time_diff
. Prende i valori da entrambe le strutture timeval
e converte la loro differenza in secondi.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#define NUM 1000000
#define NUM2 10000000
float time_diff(struct timeval *start, struct timeval *end) {
return (end->tv_sec - start->tv_sec) + 1e-6 * (end->tv_usec - start->tv_usec);
}
void loopFunc(size_t num) {
int tmp = 0;
for (int i = 0; i < num; ++i) {
tmp += 1;
}
}
int main() {
struct timeval start;
struct timeval end;
gettimeofday(&start, NULL);
loopFunc(NUM);
gettimeofday(&end, NULL);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM, time_diff(&start, &end));
gettimeofday(&start, NULL);
loopFunc(NUM2);
gettimeofday(&end, NULL);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM2, time_diff(&start, &end));
exit(EXIT_SUCCESS);
}
Produzione:
loopFunc(1000000) time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec
Usa la funzione clock_gettime
per calcolare il tempo trascorso in un blocco di codice in C
In alternativa, poiché il gettimeofday
è stato contrassegnato come obsoleto da un po’ di tempo, si consiglia di utilizzare invece la funzione clock_gettime
. Quest’ultima funzione può recuperare i dati di temporizzazione da diversi clock, ai quali viene specificato il primo parametro. Il tipo di orologio comune è un orologio a livello di sistema che misura il cosiddetto tempo dell’orologio da parete ed è identificato dalla macro CLOCK_REALTIME
. Il valore del tempo è memorizzato nella struttura timespec
, che consiste di due membri che rappresentano il numero di secondi e nanosecondi passati dall’Epoch. Notare che il chiamante dichiara in anticipo l’oggetto timespec
e il suo indirizzo viene passato alla funzione clock_gettime
.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#define NUM 1000000
#define NUM2 10000000
float time_diff2(struct timespec *start, struct timespec *end) {
return (end->tv_sec - start->tv_sec) + 1e-9 * (end->tv_nsec - start->tv_nsec);
}
void loopFunc(size_t num) {
int tmp = 0;
for (int i = 0; i < num; ++i) {
tmp += 1;
}
}
int main() {
struct timespec start2;
struct timespec end2;
clock_gettime(CLOCK_REALTIME, &start2);
loopFunc(NUM);
clock_gettime(CLOCK_REALTIME, &end2);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM,
time_diff2(&start2, &end2));
clock_gettime(CLOCK_REALTIME, &start2);
loopFunc(NUM2);
clock_gettime(CLOCK_REALTIME, &end2);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM2,
time_diff2(&start2, &end2));
exit(EXIT_SUCCESS);
}
Produzione:
loopFunc(1000000) time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook