web-dev-qa-db-fra.com

Obtenez le temps écoulé en Qt

Je cherche l'équivalent dans Qt de 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;

aucune suggestion?

71
shoosh

Que diriez-vous QTime ? Selon votre plateforme, elle devrait avoir une précision de 1 milliseconde. Le code ressemblerait à ceci:

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

Je pense qu'il est probablement préférable d'utiliser QElapsedTimer car c'est pourquoi la classe existe en premier lieu. Il a été introduit avec Qt 4.7. Notez qu'il est également immunisé contre le changement d'heure d'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();
115
sivabudh

Même si la première réponse a été acceptée, les autres personnes qui ont lu les réponses devraient considérer 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();
37
Lilian A. Moraru

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

1
Christian

En 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
Damien

Si vous souhaitez utiliser QElapsedTimer , vous devez considérer la surcharge 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 devez mesurer cela par vous-même et respecter les frais généraux pour votre timing.

1
Oliver Hoffmann