Timer in C++ verwenden
-
Verwendung der Funktion
clock()
zur Implementierung eines Timers in C++ -
Verwenden der Funktion
gettimeofday
zur Implementierung eines Timers in C++
Dieser Artikel demonstriert mehrere Methoden, wie ein Timer in C++ verwendet werden kann.
Verwendung der Funktion clock()
zur Implementierung eines Timers in C++
Die Funktion clock()
ist eine POSIX-konforme Methode zum Abrufen der Prozessorzeit des Programms. Die Funktion gibt den Integer-Wert zurück, der durch eine makrodefinierte Konstante namens CLOCKS_PER_SEC
geteilt werden muss, um in mehrere Sekunden umzurechnen.
Der folgende Beispielcode implementiert zwei Funktionen zum Ermitteln des Maximalwerts in einem int
-Array. Die Funktion max_index
führt die Suche basierend auf dem Index der Elemente durch, während die Funktion max_value
wertbasiert ist. Das Ziel ist es, zu berechnen, wie viel Zeit sie aufwenden, um den maximalen int
-Wert in dem 1.000.000
-Element-Array zu finden, das mit zufälligen ganzen Zahlen gefüllt ist.
Beachten Sie, dass wir die Funktion clock()
zweimal aufrufen - vor dem Aufruf von max_index
und dann nach dem Aufruf. Dieses Schema zur Zeitmessung kann allgemein verwendet werden, ohne Rücksicht auf die spezifische Funktion, die die Zeit abruft. In diesem Fall können wir sehen (abhängig vom Hardwaresystem), dass max_value
die Arbeit etwas schneller erledigt als die indexbasierte Suche. Beachten Sie jedoch, dass diese Maximal-Suchalgorithmen eine O(N)
-Komplexität haben und nicht in einer professionellen Codebasis eingesetzt werden sollten, außer vielleicht zum Experimentieren.
#include <chrono>
#include <iostream>
using std::cout;
using std::endl;
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;
}
constexpr int WIDTH = 1000000;
int main() {
clock_t start, end;
int max;
int *arr = new int[WIDTH];
std::srand(std::time(nullptr));
for (size_t i = 0; i < WIDTH; i++) {
arr[i] = std::rand();
}
start = clock();
max = max_index(arr, WIDTH);
end = clock();
printf("max_index: %0.8f sec, max = %d\n",
((float)end - start) / CLOCKS_PER_SEC, max);
start = clock();
max = max_value(arr, WIDTH);
end = clock();
printf("max_value: %0.8f sec, max = %d\n",
((float)end - start) / CLOCKS_PER_SEC, max);
exit(EXIT_SUCCESS);
}
Ausgabe:
max_value: 0.00131400 sec, max = 2147480499
max_value: 0.00089800 sec, max = 2147480499
Verwenden der Funktion gettimeofday
zur Implementierung eines Timers in C++
gettimeofday
ist eine hochgenaue Funktion zur Zeitermittlung in Linux-basierten Systemen, die auch aus dem C++-Quellcode aufgerufen werden kann. Die Funktion wurde entwickelt, um die Zeit- und Zeitzonendaten zu erhalten, aber letzteres ist seit einiger Zeit veraltet, und das zweite Argument sollte nullptr
anstelle der gültigen Zeitzone struct
sein. gettimeofday
speichert die Zeitdaten in einem speziellen struct
namens timeval
, das zwei Datenmitglieder tv_sec
für Sekunden und tv_usec
für Mikrosekunden enthält.
In der Regel deklarieren und initialisieren wir die beiden timeval
-Strukturen, bevor wir die Funktion gettimeofday
aufrufen. Sobald die Funktion aufgerufen wird, sollten die Daten erfolgreich in der entsprechenden Struktur
gespeichert werden, wenn der Rückgabewert von gettimeofday
0
ist. Andernfalls wird der Fehler durch die Rückgabe des Wertes -1
angezeigt. Beachten Sie, dass nach dem Füllen der Structs mit Daten eine Konvertierung in den gemeinsamen Einheitswert der Zeit erforderlich ist. Dieser Beispielcode implementiert die Funktion time_diff
, die die Zeit in Sekunden zurückgibt, die bei Bedarf auf der Konsole ausgegeben werden kann.
#include <sys/time.h>
#include <ctime>
#include <iostream>
using std::cout;
using std::endl;
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);
}
constexpr int WIDTH = 1000000;
int main() {
struct timeval start {};
struct timeval end {};
int max;
int *arr = new int[WIDTH];
std::srand(std::time(nullptr));
for (size_t i = 0; i < WIDTH; i++) {
arr[i] = std::rand();
}
gettimeofday(&start, nullptr);
max = max_index(arr, WIDTH);
gettimeofday(&end, nullptr);
printf("max_index: %0.8f sec, max = %d\n", time_diff(&start, &end), max);
gettimeofday(&start, nullptr);
max = max_value(arr, WIDTH);
gettimeofday(&end, nullptr);
printf("max_value: %0.8f sec, max = %d\n", time_diff(&start, &end), max);
exit(EXIT_SUCCESS);
}
Ausgabe:
max_value: 0.00126000 sec, max = 2147474877
max_value: 0.00093900 sec, max = 2147474877
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