409 Stimmen

Einfaches Messen der verstrichenen Zeit

Ich versuche zu verwenden Zeit() um verschiedene Punkte meines Programms zu messen.

Was ich nicht verstehe, ist, warum die Werte vorher und nachher gleich sind? Mir ist klar, dass dies nicht der beste Weg ist, um ein Profil meines Programms zu erstellen, ich möchte nur sehen, wie lange etwas dauert.

printf("**MyProgram::before time= %ld\n", time(NULL));

doSomthing();
doSomthingLong();

printf("**MyProgram::after time= %ld\n", time(NULL));

Ich habe es versucht:

struct timeval diff, startTV, endTV;

gettimeofday(&startTV, NULL); 

doSomething();
doSomethingLong();

gettimeofday(&endTV, NULL); 

timersub(&endTV, &startTV, &diff);

printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec);

Wie lese ich ein Ergebnis von **time taken = 0 26339 ? Bedeutet das 26.339 Nanosekunden = 26,3 msec?

Was ist mit **time taken = 4 45025 Bedeutet das 4 Sekunden und 25 msec?

10 Stimmen

Ich verstehe die Frage nicht. Natürlich sind die Werte unterschiedlich. Dazwischen ist Zeit vergangen, also time() gibt einen anderen Wert zurück.

1 Stimmen

Was meinen Sie mit "Ich verstehe nicht, warum die Werte im Vorher und Nachher unterschiedlich sind"? Sie erhalten die aktuelle Zeit (in Sekunden seit dem 1. Januar 1970) mit time(NULL) ... das zweite Mal, wenn Sie es aufrufen, wird N Sekunden nach dem ersten und damit ... anders sein (es sei denn, was auch immer es ist Sie tun, dauert nicht eine Sekunde zu beenden ... in diesem Fall, es wird das gleiche wie das erste sein).

1 Stimmen

Können Sie uns sagen, was gedruckt wird und wie lange es dauert, wenn Sie es mit einer Stoppuhr oder einer Wanduhr (oder einem Kalender) messen?

1voto

kibibu Punkte 5851

Sie sind gleich, weil Ihre doSomething-Funktion schneller abläuft als die Granularität des Timers. Versuchen Sie es:

printf ("**MyProgram::before time= %ld\n", time(NULL));

for(i = 0; i < 1000; ++i) {
    doSomthing();
    doSomthingLong();
}

printf ("**MyProgram::after time= %ld\n", time(NULL));

1voto

Yas Punkte 4057

Matlab geschmackvoll!

tic startet einen Stoppuhr-Timer zur Leistungsmessung. Die Funktion erfasst die interne Zeit bei der Ausführung des tic-Befehls. Zeigen Sie die verstrichene Zeit mit der Funktion toc Funktion.

#include <iostream>
#include <ctime>
#include <thread>
using namespace std;

clock_t START_TIMER;

clock_t tic()
{
    return START_TIMER = clock();
}

void toc(clock_t start = START_TIMER)
{
    cout
        << "Elapsed time: "
        << (clock() - start) / (double)CLOCKS_PER_SEC << "s"
        << endl;
}

int main()
{
    tic();
    this_thread::sleep_for(2s);
    toc();

    return 0;
}

1 Stimmen

Dies ist kein guter Ansatz. Da er standardmäßig eine globale Variable verwendet, ist er nicht reentrant. Eine innere Funktion, die dieselbe Schnittstelle verwendet, könnte das Timing der äußeren Schnittstelle durcheinander bringen.

0voto

Weather Vane Punkte 32572

Als Antwort auf OPs Frage drei spezifische Fragen.

"Was ich nicht verstehe, ist, warum die Werte von vorher und nachher gleich sind? "

En erste Frage und der Beispielcode zeigt, dass time() hat eine Auflösung von 1 Sekunde, so dass die Antwort lauten muss, dass die beiden Funktionen in weniger als 1 Sekunde ausgeführt werden. Aber gelegentlich wird sie (scheinbar unlogisch) informieren 1 Sekunde wenn die beiden Timer-Marken eine Sekunde auseinander liegen.

Das nächste Beispiel verwendet gettimeofday() die diese Struktur füllt

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

und die zweite Frage fragt: "Wie lese ich ein Ergebnis von **time taken = 0 26339 ? Heißt das 26.339 Nanosekunden = 26,3 msec?"

Meine zweite Antwort ist, dass die benötigte Zeit 0 Sekunden und 26339 Mikrosekunden beträgt, also 0,026339 Sekunden, was bestätigt, dass das erste Beispiel in weniger als 1 Sekunde ausgeführt wurde.

En dritte Frage fragt: "Was ist mit **time taken = 4 45025 Bedeutet das 4 Sekunden und 25 msec?"

Meine dritte Antwort ist, dass die benötigte Zeit 4 Sekunden und 45025 Mikrosekunden beträgt, also 4,045025 Sekunden, was zeigt, dass OP die Aufgaben der beiden Funktionen, die er zuvor gemessen hat, geändert hat.

-1voto

TarmoPikaro Punkte 4208
#include <ctime>
#include <functional>

using namespace std;

void f() {
  clock_t begin = clock();

  // ...code to measure time...

  clock_t end = clock();

  function<double(double, double)> convtime = [](clock_t begin, clock_t end)
  {
     return double(end - begin) / CLOCKS_PER_SEC;
  };

  printf("Elapsed time: %.2g sec\n", convtime(begin, end));

}

Ähnliches Beispiel wie hier, nur mit zusätzlicher Umrechnungsfunktion und Ausdruck.

-1voto

Ich habe eine Klasse erstellt, um automatisch die verstrichene Zeit zu messen. Bitte prüfen Sie den Code (c++11) in diesem Link: https://github.com/sonnt174/Common/blob/master/time_measure.h

Beispiel für die Verwendung der Klasse TimeMeasure:

void test_time_measure(std::vector<int> arr) {
  TimeMeasure<chrono::microseconds> time_mea;  // create time measure obj
  std::sort(begin(arr), end(arr));
}

0 Stimmen

Mir gefällt Ihre Druckerklärung mit den Einheiten. Was würde es brauchen, um Ihren Code auf gcc und clang zu portieren? wandbox.org )

1 Stimmen

@HowardHinnant: Danke für die Antwort, ich habe den Code für gcc und clang ebenfalls aktualisiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X