Utilisez la fonction gettimeofday en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction gettimeofday pour calculer le temps écoulé dans un bloc de code en C
  2. Utilisez la fonction clock_gettime pour calculer le temps écoulé dans un bloc de code en C
Utilisez la fonction gettimeofday en C

Cet article explique plusieurs méthodes de calcul du temps écoulé dans un bloc de code en utilisant la fonction gettimeofday en C.

Utiliser la fonction gettimeofday pour calculer le temps écoulé dans un bloc de code en C

La fonction gettimeofday est une fonction compatible POSIX qui récupère l’heure actuelle avec une précision de l’ordre de la microseconde. La fonction prend deux arguments ; l’un est du type struct timeval et l’autre est struct timezone. Bien que la structure timezone ait été dépréciée et que la valeur NULL devrait être passée à sa place. La structure timeval, d’autre part, contient deux membres, tv_sec et tv_usec, indiquant le nombre de secondes et de microsecondes passées depuis l’époque. L’exemple de code suivant montre comment nous pouvons mesurer le temps d’exécution d’une seule fonction - loopFunc.

En général, nous devons entourer tout bloc de code qui doit être mesuré avec deux appels de gettimeofday, un avant et un autre après le bloc. Une fois que le second appel à gettimeofday est renvoyé avec succès, nous pouvons calculer la différence de temps en utilisant la fonction définie par le client - time_diff. Elle prend les valeurs des deux structures timeval et convertit leur différence en secondes.

#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);
}

Production :

loopFunc(1000000)  time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec

Utilisez la fonction clock_gettime pour calculer le temps écoulé dans un bloc de code en C

Alternativement, puisque le gettimeofday est marqué comme obsolète depuis un certain temps maintenant, il est recommandé d’utiliser la fonction clock_gettime à la place. Cette dernière fonction peut récupérer les données de chronométrage de différentes horloges, qui sont spécifiées dans le premier paramètre. Le type d’horloge le plus courant est l’horloge système qui mesure le temps de l’horloge murale, et qui est identifiée par la macro CLOCK_REALTIME. La valeur du temps est stockée dans la structure timespec, qui consiste en deux membres représentant le nombre de secondes et de nanosecondes passées depuis l’époque. Notez que l’appelant déclare l’objet timespec à l’avance, et son adresse est passée à la fonction 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);
}

Production :

loopFunc(1000000)  time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C Time