Domanda

Sto cercando l'equivalente in Qt su GetTickCount()

Qualcosa che mi permetterà di misurare il tempo necessario per l'esecuzione di un segmento di codice come in:

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

qualche suggerimento?

È stato utile?

Soluzione

Che ne dici di QTime ? A seconda della piattaforma, dovrebbe avere una precisione di 1 millisecondo. Il codice sarebbe simile a questo:

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

Altri suggerimenti

Penso che probabilmente sia meglio usare QElapsedTimer poiché è per questo che la classe esiste in primo luogo. È stato introdotto con Qt 4.7. Si noti che è anche immune al cambio dell'ora del sistema.

Esempio di utilizzo:

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

Anche se la prima risposta è stata accettata, il resto delle persone che leggono le risposte dovrebbe considerare il suggerimento di sivabudh .
QElapsedTimer può anche essere usato per calcolare il tempo in nanosecondi.
Esempio di codice:

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

Se si desidera utilizzare QElapsedTimer , dovresti considerare il sovraccarico di questa classe.

Ad esempio, il seguente codice viene eseguito sul mio computer:

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";

mi dà questo output:

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

Dovresti misurarlo da solo e rispettare le spese generali per i tuoi tempi.

Spendendo le risposte precedenti, ecco una macro che fa tutto per te.

#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.";

E poi puoi usare semplicemente come:

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

uscita:

  

onSpeedChanged: 102 Tempo trascorso: 2 ms.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top