Timer in C++ verwenden

  1. Verwendung der Funktion clock() zur Implementierung eines Timers in C++
  2. 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 <iostream>
#include <chrono>

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 <iostream>
#include <sys/time.h>
#include <ctime>

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