Verwendung der gettimeofday-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion gettimeofday, um die verstrichene Zeit in einem Code-Block in C zu berechnen
  2. Verwendung der Funktion clock_gettime zur Berechnung der verstrichenen Zeit in einem Codeblock in C
Verwendung der gettimeofday-Funktion in C

In diesem Artikel werden mehrere Methoden zur Berechnung der verstrichenen Zeit in einem Code-Block unter Verwendung der Funktion gettimeofday in C erläutert.

Verwenden Sie die Funktion gettimeofday, um die verstrichene Zeit in einem Code-Block in C zu berechnen

Die Funktion gettimeofday ist eine POSIX-konforme Funktion, die die aktuelle Zeit bis auf eine Mikrosekunde genau abruft. Die Funktion nimmt zwei Argumente entgegen; eines ist vom Typ struct timeval, das andere ist struct timezone. Obwohl die Struktur timezone veraltet ist und stattdessen der Wert NULL übergeben werden sollte. Die Struktur timeval hingegen enthält zwei Mitglieder, tv_sec und tv_usec, die die Anzahl der Sekunden und Mikrosekunden angeben, die seit der Epoche vergangen sind. Der folgende Beispielcode demonstriert, wie wir die Ausführungszeit einer einzelnen Funktion - loopFunc - messen können.

Im Allgemeinen müssen wir jeden Codeblock, der gemessen werden soll, mit zwei Aufrufen von gettimeofday umgeben, einen vor und einen nach dem Block. Sobald der zweite Aufruf von gettimeofday erfolgreich zurückkommt, können wir die Zeitdifferenz mit Hilfe der benutzerdefinierten Funktion - time_diff - berechnen. Sie nimmt die Werte aus beiden timeval-Strukturen und konvertiert ihre Differenz in Sekunden.

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

Ausgabe:

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

Verwendung der Funktion clock_gettime zur Berechnung der verstrichenen Zeit in einem Codeblock in C

Da die Funktion gettimeofday seit einiger Zeit als veraltet markiert ist, empfiehlt es sich, stattdessen die Funktion clock_gettime zu verwenden. Die letztere Funktion kann Zeitdaten von verschiedenen Uhren abrufen, die als erster Parameter angegeben werden. Der übliche Uhrentyp ist eine systemweite Uhr, die die sogenannte Wanduhrzeit misst, und sie wird durch das Makro CLOCK_REALTIME identifiziert. Der Zeitwert wird in der Struktur timespec gespeichert, die aus zwei Mitgliedern besteht, die die Anzahl der Sekunden und Nanosekunden darstellen, die von der Epoche übergeben werden. Beachten Sie, dass der Aufrufer das timespec-Objekt im Voraus deklariert und dessen Adresse an die Funktion clock_gettime übergeben wird.

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

Ausgabe:

loopFunc(1000000)  time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec
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