Obtenir le temps écoulé dans Qt

Je cherche L'équivalent dans Qt à GetTickCount()

Quelque chose qui me permettra de mesurer le temps qu'il faut pour qu'un segment de code s'exécute comme dans:

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

Des suggestions?

64
demandé sur sashoalm 2008-10-28 23:02:38

6 réponses

Que diriez-vous QTime? Selon votre plate-forme, il devrait avoir une précision de 1 milliseconde. Le Code devrait ressembler à quelque chose comme ceci:

QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();
79
répondu Dusty Campbell 2015-07-06 08:26:00

Je pense que c'est probablement mieux d'utiliser QElapsedTimer depuis c'est pourquoi la classe existe, en premier lieu. Il a été introduit avec Qt 4.7. Notez qu'il est également immunisé au changement d'Heure de l'horloge du système.

Exemple d'utilisation:

#include <QDebug>
#include <QElapsedTimer>
...
...
QElapsedTimer timer;
timer.start();
slowOperation();  // we want to measure the time of this slowOperation()
qDebug() << timer.elapsed();
107
répondu sivabudh 2015-07-06 07:55:03

Même si la première réponse a été acceptée, le reste des personnes qui lisent les réponses devraient tenir compte de la suggestion de sivabudh.
QElapsedTimer peut également être utilisé pour calculer le temps, en nanosecondes.
Exemple de Code:

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();
34
répondu Lilian A. Moraru 2016-11-18 08:23:39

Une stratégie générale consiste à appeler la méthode observée plusieurs fois. 10 appels fournissent une précision de 1,5 ms, 100 un de 0,15 ms.

1
répondu Christian 2012-10-26 15:13:17

Si vous souhaitez utiliser QElapsedTimer, vous devriez considérer la charge de cette classe.

Par exemple, le code suivant s'exécute sur ma machine:

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

Me donne cette sortie:

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

Vous devriez mesurer cela pour vous-même et respecter les frais généraux pour votre timing.

1
répondu Oliver Hoffmann 2015-07-06 07:55:39

Dépensant les réponses précédentes, voici une macro qui fait tout pour vous.

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

Et puis vous pouvez utiliser simplement comme:

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

Sortie:

OnSpeedChanged: 102 Temps écoulé: 2 ms.

1
répondu Damien 2016-07-29 05:46:23