Utilizar un temporizador en C

Jinku Hu 12 octubre 2023
  1. Usar la función gettimeofday como punto de referencia del temporizador
  2. Utilizar la función clock_gettime como referencia del temporizador en C
Utilizar un temporizador en C

Este artículo introducirá múltiples métodos sobre cómo usar un temporizador en C.

Usar la función gettimeofday como punto de referencia del temporizador

gettimeofday es una función compatible con POSIX para recuperar la hora del sistema. Toma dos argumentos, uno del tipo struct timeval y otro del tipo struct timezone, este último ya obsoleto. Por lo tanto, tendríamos que declarar sólo las estructuras timeval para almacenar los valores de la hora recuperada. La estructura struct timeval consta de dos miembros que representan segundos y microsegundos, respectivamente.

En el siguiente ejemplo, implementamos dos funciones para encontrar el valor máximo en el array de enteros. Una de ellas se basa en la comparación de valores, y la otra utiliza los índices para encontrar el entero con el mayor valor. Utilizamos gettimeofday antes y después de llamar a la función max_ para comparar la velocidad de estas funciones.

Fíjate que hay una función time_diff que calcula el tiempo transcurrido en segundos. En este caso, sólo ejecutamos la prueba una vez en un array de enteros generada aleatoriamente, pero en general, deberían utilizarse métodos más estadísticos para medir el rendimiento en los sistemas modernos.

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

Producción :

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

Utilizar la función clock_gettime como referencia del temporizador en C

Alternativamente, podemos utilizar clock_gettime para lograr objetivos de medición similares. El método clock_gettime es un método más reciente y recomendado que se emplea en las bases de código más recientes. Almacena el valor del tiempo en el objeto struct timespec y toma el puntero a éste como segundo parámetro. Mientras tanto, el primer argumento especifica el tipo de reloj a utilizar. En este ejemplo, recuperamos CLOCK_REALTIME porque mide el llamado tiempo del reloj de pared. Se representa como segundos y nanosegundos transcurridos desde la época, la fecha de inicio de la medición del tiempo.

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

Producción :

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

Artículo relacionado - C Time