Utiliser une minuterie en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction gettimeofday comme point de repère pour le timer
  2. Utiliser la fonction clock_gettime comme point de repère du chronomètre en C
Utiliser une minuterie en C

Cet article présente plusieurs méthodes d’utilisation d’un minuteur en C.

Utiliser la fonction gettimeofday comme point de repère pour le timer

gettimeofday est une fonction compatible POSIX permettant de récupérer l’heure système. Elle prend deux arguments, l’un du type struct timeval et l’autre du type struct timezone, ce dernier étant maintenant obsolète. Ainsi, nous n’aurions besoin de déclarer que les structures timeval pour stocker les valeurs de temps récupérées. struct timeval se est composée de deux membres représentant respectivement les secondes et les microsecondes.

Dans l’exemple suivant, nous implémentons deux fonctions pour trouver la valeur maximale dans le tableau des entiers. L’une d’entre elles est basée sur la comparaison des valeurs, et l’autre utilise les indices pour trouver l’entier ayant la plus grande valeur. Nous utilisons gettimeofday avant et après que la fonction max_ soit appelée pour comparer la vitesse de ces fonctions.

Notez qu’il existe une fonction time_diff qui calcule le temps écoulé en secondes. Dans ce cas, nous n’effectuons le test qu’une seule fois sur un tableau d’entiers généré de façon aléatoire, mais en général, des méthodes plus statistiques devraient être utilisées pour mesurer les performances des systèmes modernes.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>

int max_index(int arr[], int size) {
  size_t max = 0;

  for (int j = 0; j < size; ++j) {
    if (arr[j] > arr[max]) {
      max = j;
    }
  }
  return arr[max];
}

int max_value(int arr[], int size) {
  int max = arr[0];

  for (int j = 0; j < size; ++j) {
    if (arr[j] > max) {
      max = arr[j];
    }
  }
  return max;
}

float time_diff(struct timeval *start, struct timeval *end) {
  return (end->tv_sec - start->tv_sec) + 1e-6 * (end->tv_usec - start->tv_usec);
}

enum { WIDTH = 100000 };

int main() {
  struct timeval start;
  struct timeval end;

  int max;

  int *arr = malloc(WIDTH * sizeof(int));

  srand(time(NULL));
  for (size_t i = 0; i < WIDTH; i++) {
    arr[i] = rand();
  }

  gettimeofday(&start, NULL);
  max = max_index(arr, WIDTH);
  gettimeofday(&end, NULL);

  printf("max_index: %0.8f sec, max = %d\n", time_diff(&start, &end), max);

  gettimeofday(&start, NULL);
  max = max_value(arr, WIDTH);
  gettimeofday(&end, NULL);

  printf("max_value: %0.8f sec, max = %d\n", time_diff(&start, &end), max);

  free(arr);
  exit(EXIT_SUCCESS);
}

Production :

max_index: 0.00028346 sec, max = 2147391322
max_value: 0.00022213 sec, max = 2147391322

Utiliser la fonction clock_gettime comme point de repère du chronomètre en C

Nous pouvons également utiliser clock_gettime pour atteindre des objectifs de mesure similaires. La méthode clock_gettime est une méthode plus récente et recommandée utilisée dans les bases de code plus récentes. Elle stocke la valeur du temps dans l’objet struct timespec et prend le pointeur vers celui-ci comme second paramètre. Pendant ce temps, le premier argument spécifie le type d’horloge à utiliser. Dans cet exemple, nous récupérons CLOCK_REALTIME parce qu’il mesure l’heure dite de l’horloge murale. Il est représenté en secondes et nanosecondes passées depuis l’époque, la date de début de la mesure du temps.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>

int max_index(int arr[], int size) {
  size_t max = 0;

  for (int j = 0; j < size; ++j) {
    if (arr[j] > arr[max]) {
      max = j;
    }
  }
  return arr[max];
}

int max_value(int arr[], int size) {
  int max = arr[0];

  for (int j = 0; j < size; ++j) {
    if (arr[j] > max) {
      max = arr[j];
    }
  }
  return max;
}

float time_diff2(struct timespec *start, struct timespec *end) {
  return (end->tv_sec - start->tv_sec) + 1e-9 * (end->tv_nsec - start->tv_nsec);
}

enum { WIDTH = 100000 };

int main() {
  struct timespec start2, end2;

  int max;

  int *arr = malloc(WIDTH * sizeof(int));

  srand(time(NULL));
  for (size_t i = 0; i < WIDTH; i++) {
    arr[i] = rand();
  }

  clock_gettime(CLOCK_REALTIME, &start2);
  max = max_index(arr, WIDTH);
  clock_gettime(CLOCK_REALTIME, &end2);

  printf("max_index: %0.8f sec, max = %d\n", time_diff2(&start2, &end2), max);

  clock_gettime(CLOCK_REALTIME, &start2);
  max = max_value(arr, WIDTH);
  clock_gettime(CLOCK_REALTIME, &end2);

  printf("max_value: %0.8f sec, max = %d\n", time_diff2(&start2, &end2), max);

  free(arr);
  exit(EXIT_SUCCESS);
}

Production :

max_index: 0.00028346 sec, max = 2147391322
max_value: 0.00022213 sec, max = 2147391322
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