Utilizar un temporizador en C
-
Usar la función
gettimeofday
como punto de referencia del temporizador -
Utilizar la función
clock_gettime
como referencia del temporizador en C
![Utilizar un temporizador en C](/img/C/feature-image---c-timer.webp)
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
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