Pregunta
Estoy buscando el equivalente en Qt a GetTickCount()
Algo que me permitirá medir el tiempo que tarda un segmento de código en ejecutarse como en:
uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;
alguna sugerencia?
Solución
¿Qué hay de QTime
? Dependiendo de su plataforma, debe tener una precisión de 1 milisegundo. El código se vería así:
QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();
Otros consejos
Creo que probablemente es mejor usar QElapsedTimer
ya que es por eso que la clase existe en primer lugar. Fue introducido con Qt 4.7. Tenga en cuenta que también está inmunizado al cambio de hora del reloj del sistema.
Ejemplo de uso:
#include <QDebug>
#include <QElapsedTimer>
...
...
QElapsedTimer timer;
timer.start();
slowOperation(); // we want to measure the time of this slowOperation()
qDebug() << timer.elapsed();
Incluso si la primera respuesta fue aceptada, el resto de las personas que lean las respuestas deben considerar la sugerencia de sivabudh
.
QElapsedTimer
también se puede utilizar para calcular el tiempo en nanosegundos.
Ejemplo de código:
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();
Si desea utilizar QElapsedTimer
, Debes considerar la sobrecarga de esta clase.
Por ejemplo, el siguiente código se ejecuta en mi máquina:
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 da esta salida:
timing: 90 ns/call
timing: 89 ns/call
...
Debes medir esto por ti mismo y respetar los gastos generales por tu tiempo.
Gastando las respuestas anteriores, aquí hay una macro que hace todo por ti.
#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.";
Y luego puedes usarlo simplemente como:
CHECKTIME(
// any code
for (int i=0; i<1000; i++)
{
timeConsumingFunc();
}
)
salida:
onSpeedChanged: 102 Tiempo transcurrido: 2 ms.