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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top