Verwendung der gettimeofday-Funktion in C
-
Verwenden Sie die Funktion
gettimeofday
, um die verstrichene Zeit in einem Code-Block in C zu berechnen -
Verwendung der Funktion
clock_gettime
zur Berechnung der verstrichenen Zeit in einem Codeblock 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
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