Ausführungszeit einer Funktion in C++ STL messen

Jinku Hu 12 Oktober 2023
  1. Verwenden von std::chrono::high_resolution_clock::now und std::chrono::duration_cast<std::chrono::seconds> zum Messen der Ausführungszeit einer Funktion
  2. Verwendung von std::chrono::high_resolution_clock::now und std::chrono::duration<double, std::milli> zur Messung der Ausführungszeit einer Funktion
Ausführungszeit einer Funktion in C++ STL messen

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 )
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