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