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