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.