83 Stimmen

Abrufen der verstrichenen Zeit in Qt

Ich bin auf der Suche nach dem Äquivalent in Qt zu GetTickCount()

Etwas, das es mir ermöglicht, die Zeit zu messen, die für die Ausführung eines Codesegments wie in benötigt wird:

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

Irgendwelche Vorschläge?

0 Stimmen

Für Qt 6 können Sie nicht verwenden QTime seit QTime::elapsed() y QTime::start() sind in Qt 5 bereits veraltet.

145voto

sivabudh Punkte 30515

Ich denke, es ist wahrscheinlich besser, die QElapsedTimer denn dafür gibt es die Klasse ja überhaupt erst. Sie wurde mit Qt 4.7 eingeführt. Beachten Sie, dass sie auch immun gegen die Änderung der Systemuhrzeit ist.

Beispiel für die Verwendung:

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

96voto

Dusty Campbell Punkte 3098

Wie wäre es mit QTime ? Je nach Plattform sollte es eine Genauigkeit von 1 Millisekunde haben. Der Code würde etwa so aussehen:

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

42voto

Lilian A. Moraru Punkte 1008

Auch wenn die erste Antwort akzeptiert wurde, sollten die übrigen Personen, die die Antworten lesen, überlegen sivabudh Vorschlag der Kommission.
QElapsedTimer kann auch verwendet werden, um die Zeit in Nanosekunden zu berechnen.
Code-Beispiel:

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

3voto

Damien Punkte 1422

In Ergänzung zu 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 als verwenden:

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

sortie :

onSpeedChanged : 102 Verstrichene Zeit: 2 ms.

2voto

Oliver Hoffmann Punkte 132

Wenn Sie Folgendes verwenden möchten QElapsedTimer sollten Sie den Aufwand für diese Klasse berücksichtigen.

Der folgende Code wird zum Beispiel auf meinem Rechner 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 für sich selbst messen und den Overhead für Ihr Timing beachten.

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