it-swarm.com.de

Verstrichene Zeit in Qt

Ich suche das Äquivalent in Qt zu GetTickCount()

Etwas, mit dem ich die Zeit messen kann, die ein Codesegment benötigt, um wie folgt ausgeführt zu werden:

uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;

irgendwelche Vorschläge?

71
shoosh

Wie wäre es mit QTime ? Abhängig von Ihrer Plattform sollte die Genauigkeit 1 Millisekunde betragen. Code würde ungefähr so ​​aussehen:

QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();
90
Dusty Campbell

Ich denke, es ist wahrscheinlich besser, QElapsedTimer zu verwenden, da die Klasse deshalb überhaupt existiert. Es wurde mit Qt 4.7 eingeführt. Beachten Sie, dass es auch gegen die Änderung der Uhrzeit des Systems immun ist.

Anwendungsbeispiel:

#include <QDebug>
#include <QElapsedTimer>
...
...
QElapsedTimer timer;
timer.start();
slowOperation();  // we want to measure the time of this slowOperation()
qDebug() << timer.elapsed();
115
sivabudh

Selbst wenn die erste Antwort akzeptiert wurde, sollten die übrigen Personen, die die Antworten lesen, den Vorschlag von sivabudh berücksichtigen.
QElapsedTimer kann auch verwendet werden, um die Zeit in Nanosekunden zu berechnen.
Codebeispiel:

QElapsedTimer timer;
qint64 nanoSec;
timer.start();
//something happens here
nanoSec = timer.nsecsElapsed();
//printing the result(nanoSec)
//something else happening here
timer.restart();
//some other operation
nanoSec = timer.nsecsElapsed();
37

Eine allgemeine Strategie besteht darin, die beobachtete Methode mehrmals aufzurufen. 10 Anrufe liefern eine Genauigkeit von 1,5 ms, 100 von 0,15 ms.

1
Christian

Abgesehen von den vorherigen Antworten finden Sie hier ein Makro, das alles für Sie erledigt.

#include <QDebug>
#include <QElapsedTimer>
#define CONCAT_(x,y) x##y
#define CONCAT(x,y) CONCAT_(x,y)

#define CHECKTIME(x)  \
    QElapsedTimer CONCAT(sb_, __LINE__); \
    CONCAT(sb_, __LINE__).start(); \
    x \
    qDebug() << __FUNCTION__ << ":" << __LINE__ << " Elapsed time: " <<  CONCAT(sb_, __LINE__).elapsed() << " ms.";

Und dann können Sie einfach verwenden als:

CHECKTIME(
    // any code
    for (int i=0; i<1000; i++)
    {
       timeConsumingFunc();
    }
)

ausgabe:

onSpeedChanged: 102 Verstrichene Zeit: 2 ms.

1
Damien

Wenn Sie QElapsedTimer verwenden möchten, sollten Sie den Overhead dieser Klasse berücksichtigen.

Der folgende Code wird beispielsweise auf meinem Computer ausgeführt:

static qint64 time = 0;
static int count = 0;
QElapsedTimer et;
et.start();
time += et.nsecsElapsed();
if (++count % 10000 == 0)
    qDebug() << "timing:" << (time / count) << "ns/call";

gibt mir diese Ausgabe:

timing: 90 ns/call 
timing: 89 ns/call 
...

Sie sollten dies selbst messen und den Overhead für Ihr Timing respektieren.

1
Oliver Hoffmann