Verstrichene Zeit in Qt

74

Ich suche das Äquivalent in Qt zu GetTickCount()

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

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

irgendwelche Vorschläge?

shoosh
quelle

Antworten:

94

Wie wäre es 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();
Dusty Campbell
quelle
2
Auf meiner virtuellen WinXP-Maschine scheint es nur eine Genauigkeit von 10 ms zu haben - kann jemand dies bestätigen / ablehnen? Ich erhalte Werte von 0, 10 und 20 für eine Operation, die ich teste.
Will Bickford
4
Windows ist beim Timing nicht so genau wie ein UNIX-ähnliches Betriebssystem.
Nathan Moos
1
IIRC, unter Windows XP beträgt die standardmäßig gemeldete Systemuhrauflösung 15 ms, aber mit einigen einfachen Windows-abhängigen Winapi-Aufrufen erhalten Sie möglicherweise immer noch eine bessere Auflösung, wenn nur 1 ms oder besser RTSC auf dem Mainboard vorhanden ist
quetzalcoatl
6
QTime gibt keine CPU-Zeit. Es gibt die gesamte Echtzeit, und das bedeutet, dass Sie auch die Zeit messen, die alle anderen Prozesse benötigen. Daher ist es nicht sehr nützlich, um die Ausführungszeit von Code zu messen.
Nikos C.
4
Dies ist ein subtiler und schrecklicher Fehler, der darauf wartet, passiert zu werden. Es wird von der Systemuhr beeinflusst. Gott bewahre, dass die Sommerzeit läuft, während Ihr Timer läuft.
Andrewrk
127

Ich denke, es ist wahrscheinlich besser zu verwenden, QElapsedTimerda 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();
Sivabudh
quelle
40

Selbst wenn die erste Antwort akzeptiert wurde, sollte der Rest der Leute, die die Antworten lesen, den sivabudhVorschlag berücksichtigen .
QElapsedTimerkann 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();
Lilian A. Moraru
quelle
2
Nochmals: Dies misst die Echtzeit und nicht die vom Prozess verbrauchte CPU-Zeit.
Nikos C.
Es berechnet es, indem es die Anzahl der von der Anwendung verbrauchten Prozessorticks nimmt und mit der Anzahl der Nanosekunden pro Tick multipliziert. Es misst die vom Prozess verbrauchte CPU-Zeit.
Lilian A. Moraru
Es misst die seitdem verstrichene Zeit start()und nicht die vom Prozess verbrauchte Zeit. Es ist ein Echtzeit-Timer. Wenn der Prozess (aufgrund von Multitasking) vorbelegt wird, vergeht weiterhin Zeit, und QElapsedTimer misst dies ebenfalls. QElapsedTimer wäre so gut wie nutzlos, wenn es die Zeitmessung beenden würde, wenn der Prozess verhindert wird.
Nikos C.
@ NikosC. Aus dem Qt-Blog "Qt hat eine Reihe von Timern, aber der nützlichste für das Benchmarking ist QElapsedTimer", dann verwendet "QElapsedTimer die genaueste verfügbare Uhr. Dies bedeutet jedoch auch, dass die tatsächliche Auflösung und Genauigkeit des Timers stark variieren kann zwischen Systemen. ". Wo es die genaueste Uhr aus diesen auswählt : qt-project.org/doc/qt-5/qelapsedtimer.html#ClockType-enum .
Lilian A. Moraru
2

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

Auf meinem Computer wird beispielsweise der folgende Code 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.

Oliver Hoffmann
quelle
1
Genau. Ich habe QElapsedTimer ausprobiert. Mit der Verwendung der Klasse scheint ein gewisser Aufwand verbunden zu sein. Aber sehr gering. Der Unterschied ist nicht so groß. Aber QTime schien mir die Ausführungszeit etwas zu verkürzen. Ich habe den Code für die Zahlenkalkulation von 4 Methoden gemessen (3 Mal mit QTime und 3 Mal mit QElapsedTimer). Der QElapsed-Timer betrug durchschnittlich 8,046 Sekunden und die QTime durchschnittlich 8,016 Sekunden, wobei die Differenz 30 ms betrug. Für die meisten Zwecke nicht signifikant, aber vielleicht für absolute Präzision. Dies lief QT 5.3.1 32-Bit auf einem Windows 7 64-Bit-PC Intel i5.
te7
1
Siehe den Thread hier qtcentre.org/threads/…
te7
2

Hier ist 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.

Damien
quelle