Einen Timer in C verwenden

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktion gettimeofday als Timer-Benchmark
  2. Verwendung von die Funktion clock_gettime als Timer-Benchmark in C
Einen Timer in C verwenden

Dieser Artikel stellt mehrere Methoden vor, wie ein Timer in C verwendet werden kann.

Verwendung von die Funktion gettimeofday als Timer-Benchmark

gettimeofday ist eine POSIX-konforme Funktion zum Abrufen der Systemzeit. Sie benötigt zwei Argumente, eines vom Typ struct timeval und eines vom Typ struct timezone, wobei letzteres inzwischen veraltet ist. Daher müssten wir nur timeval-Strukturen deklarieren, um die abgerufenen Zeitwerte zu speichern. Das struct timeval besteht aus zwei Mitgliedern, die Sekunden bzw. Mikrosekunden repräsentieren.

Im folgenden Beispiel implementieren wir zwei Funktionen, um den Maximalwert im Array der Ganzzahlen zu finden. Eine davon basiert auf einem Wertevergleich, die andere verwendet die Indizes, um die Ganzzahl mit dem größten Wert zu finden. Wir verwenden gettimeofday vor und nach dem Aufruf der Funktion max_, um die Geschwindigkeit dieser Funktionen zu vergleichen.

Beachten Sie, dass es eine Funktion time_diff gibt, die die verstrichene Zeit in Sekunden berechnet. In diesem Fall führen wir den Test nur einmal mit einem zufällig generierten Array von Ganzzahlen durch, aber im Allgemeinen sollten mehr statistische Methoden verwendet werden, um die Leistung in modernen Systemen zu messen.

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

Ausgabe:

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

Verwendung von die Funktion clock_gettime als Timer-Benchmark in C

Alternativ können wir auch clock_gettime verwenden, um ähnliche Messziele zu erreichen. clock_gettime ist eine neuere und empfohlene Methode, die in neueren Codebasen eingesetzt wird. Sie speichert den Zeitwert in dem Objekt struct timespec und nimmt den Zeiger darauf als zweiten Parameter entgegen. Währenddessen gibt das erste Argument den Typ der zu verwendenden Uhr an. In diesem Beispiel rufen wir CLOCK_REALTIME ab, weil sie die sogenannte Wanduhrzeit misst. Sie wird als Sekunden und Nanosekunden dargestellt, die seit der Epoche, dem Startdatum der Zeitmessung, vergangen sind.

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

Ausgabe:

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

Verwandter Artikel - C Time