Ausführungszeit einer Funktion in C++ STL messen
-
Verwenden von
std::chrono::high_resolution_clock::now
undstd::chrono::duration_cast<std::chrono::seconds>
zum Messen der Ausführungszeit einer Funktion -
Verwendung von
std::chrono::high_resolution_clock::now
undstd::chrono::duration<double, std::milli>
zur Messung der Ausführungszeit einer Funktion
Dieser Artikel zeigt verschiedene Methoden zum Messen der Ausführungszeit einer Funktion in C++.
Verwenden von std::chrono::high_resolution_clock::now
und std::chrono::duration_cast<std::chrono::seconds>
zum Messen der Ausführungszeit einer Funktion
Der Namespace std::chrono
konsolidiert alle Dienstprogramme für Datum und Uhrzeit, die von der C++ STL-Bibliothek bereitgestellt werden. Letzteres bietet mehrere Taktimplementierungen, von denen eine std::chrono::high_resolution_clock
ist, die der Uhr mit der kleinsten Tick-Periode entspricht. Beachten Sie jedoch, dass diese Uhr von der Hardwareplattform abhängig ist und sich sogar mehrere Standardbibliotheksimplementierungen unterscheiden. Lesen Sie daher am besten die Compiler-Dokumentation und stellen Sie sicher, dass diese für die Problemanforderungen geeignet ist. Die Idee zum Messen der Ausführungszeit einer Funktion besteht darin, die aktuelle Zeit zweimal von der angegebenen Uhr abzurufen: vor und nach dem Funktionsaufruf und die Differenz zwischen den Werten zu berechnen. Die aktuelle Zeit wird mit der integrierten Methode “Jetzt” abgerufen. Sobald die Differenz berechnet ist, sollte sie in einer bestimmten Zeiteinheit interpretiert werden. Dies erfolgt mit dem Dienstprogramm std::chrono::duration_cast
. Im folgenden Beispiel wandeln wir das Ergebnis in die Einheit std::chrono::seconds
umgerechnet -Einheiten um und geben den Wert mit der integrierten Funktion count
aus. Beachten Sie, dass der funcSleep
im Codebeispiel die Programmausführung für 3 Sekunden unterbricht und dann die Steuerung an die main
-Funktion zurückgibt.
#include <chrono>
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
void funcSleep() { std::this_thread::sleep_for(std::chrono::seconds(3)); }
int main() {
auto start = std::chrono::high_resolution_clock::now();
funcSleep();
auto end = std::chrono::high_resolution_clock::now();
auto int_s = std::chrono::duration_cast<std::chrono::seconds>(end - start);
std::cout << "funcSleep() elapsed time is " << int_s.count() << " seconds )"
<< std::endl;
return EXIT_SUCCESS;
}
Ausgabe:
funcSleep() elapsed time is 3 seconds
Verwendung von std::chrono::high_resolution_clock::now
und std::chrono::duration<double, std::milli>
zur Messung der Ausführungszeit einer Funktion
Im Gegensatz zum vorherigen Code, bei dem die Zeiteinheit in einem ganzzahligen Wert gespeichert wurde, speichert das nächste Beispiel den Intervallwert als Gleitkommazahl in std::chrono::duration<double, std::milli>
Objekt eingeben. std::chrono::duration
ist eine allgemeine Klassenvorlage zur Darstellung des Zeitintervalls. Schließlich wird der Intervallwert mit der Funktion count
abgerufen und an diesem Punkt in den Stream cout
gedruckt.
#include <chrono>
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
void funcSleep() { std::this_thread::sleep_for(std::chrono::seconds(3)); }
int main() {
auto start = std::chrono::high_resolution_clock::now();
funcSleep();
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> float_ms = end - start;
std::cout << "funcSleep() elapsed time is " << float_ms.count()
<< " milliseconds" << std::endl;
return EXIT_SUCCESS;
}
Ausgabe:
funcSleep() elapsed time is 3000.27 milliseconds
In den letzten beiden Beispielen wurde eine Funktion gemessen, die meistens eine konstante Zeit benötigt. Ein ähnlicher Ansatz kann jedoch verwendet werden, um die Ausführungszeit des angegebenen Codeblocks zu berechnen. Das folgende Snippet zeigt beispielhaft die Funktion zur Generierung zufälliger Ganzzahlen, deren Ausführung mehr variable Intervalle erfordert. Beachten Sie, dass wir diesmal beide Methoden verwendet haben, um die Zeit mit Millisekundengenauigkeit und Sekunden anzuzeigen.
#include <chrono>
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
constexpr int WIDTH = 1000000;
void generateNumbers(int arr[]) {
std::srand(std::time(nullptr));
for (size_t i = 0; i < WIDTH; i++) {
arr[i] = std::rand();
}
}
int main() {
int *arr = new int[WIDTH];
auto start = std::chrono::high_resolution_clock::now();
generateNumbers(arr);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> float_ms = end - start;
auto int_ms =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::chrono::duration<long, std::micro> int_usec = int_ms;
std::cout << "generateNumbers() elapsed time is " << float_ms.count()
<< " ms "
<< "( " << int_ms.count() << " milliseconds )" << std::endl;
delete[] arr;
return EXIT_SUCCESS;
}
Ausgabe:
generateNumbers() elapsed time is 30.7443 ms ( 30 milliseconds )
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