Obtener el tiempo transcurrido en Qt

5 minutos de lectura

avatar de usuario
calla

Estoy buscando el equivalente en Qt a GetTickCount()

Algo que me permitirá medir el tiempo que tarda en ejecutarse un segmento de código como en:

uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;

¿alguna sugerencia?

avatar de usuario
sivabudh

Creo que probablemente sea mejor usar QElapsedTimer ya que es por eso que la clase existe en primer lugar. Se introdujo con Qt 4.7. Tenga en cuenta que también es inmune 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();

avatar de usuario
campbell polvoriento

Qué tal si QTime? Dependiendo de su plataforma, debería tener una precisión de 1 milisegundo. El código sería algo como esto:

QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();

  • En mi máquina virtual WinXP, parece que solo tiene una precisión de 10 ms. ¿Alguien puede confirmarlo o negarlo? Obtengo valores de 0, 10 y 20 para una operación que estoy probando.

    –Will Bickford

    13 de diciembre de 2011 a las 19:31

  • Windows no es tan preciso como un sistema operativo similar a UNIX cuando se mide el tiempo.

    – Nathan Moos

    30 de marzo de 2012 a las 17:45

  • IIRC, en Windows XP, la resolución del reloj del sistema informada por defecto es de 15 ms, pero con algunas llamadas winapi simples dependientes de Windows, aún puede obtener una mejor resolución si solo hay RTSC de 1 ms o mejor en la placa base

    – quetzalcóatl

    11 de septiembre de 2012 a las 13:32

  • QTime no da tiempo de CPU. Proporciona tiempo real total, y eso significa que también está midiendo el tiempo que tardan todos los demás procesos. Por lo tanto, no es muy útil para medir el tiempo de ejecución del código.

    – Nikos C.

    21 oct 2012 a las 23:44

  • Este es un error sutil y terrible esperando a suceder. Se ve afectado por el reloj del sistema. Dios no permita que el horario de verano suceda mientras su temporizador está funcionando.

    – andrewrk

    18/11/2014 a las 20:31

avatar de usuario
Lilian A. Moraru

Incluso si la primera respuesta fue aceptada, el resto de las personas que lean las respuestas deberían considerar sivabudhsugerencia de .
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();

  • Nuevamente: esto mide el tiempo real, no el tiempo de CPU consumido por el proceso.

    – Nikos C.

    22 de octubre de 2012 a las 0:31

  • Lo calcula tomando el número de tics del procesador que consumió la aplicación y multiplicándolo por el número de nanosegundos por tic. Mide el tiempo de CPU consumido por el proceso.

    – Lilian A. Moraru

    5 de noviembre de 2012 a las 0:50

  • Mide el tiempo transcurrido desde start(), no el tiempo consumido por el proceso. Es un temporizador en tiempo real. Cuando el proceso se adelanta (debido a la multitarea), el tiempo continúa pasando y QElapsedTimer también lo medirá. QElapsedTimer sería bastante inútil si dejara de medir el tiempo cuando el proceso se adelanta.

    – Nikos C.

    5 de noviembre de 2012 a las 0:58


  • @NikosC. Del blog de Qt “Qt tiene varios temporizadores, pero el más útil para la evaluación comparativa es QElapsedTimer”, luego “QElapsedTimer utilizará el reloj más preciso disponible. Sin embargo, esto también significa que la resolución real y la precisión del temporizador pueden variar mucho entre sistemas”. Donde elige el reloj más preciso de estos: qt-project.org/doc/qt-5/qelapsedtimer.html#ClockType-enum .

    – Lilian A. Moraru

    03/04/2014 a las 13:00

Pasando 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();
    }
)

producción:

onSpeedChanged: 102 Tiempo transcurrido: 2 ms.

avatar de usuario
Oliver Hoffman

Si quieres usar QElapsedTimerdebe tener en cuenta los gastos generales 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 
...

Debe medir esto por sí mismo y respetar los gastos generales para su tiempo.

  • Estoy de acuerdo. Probé QElapsedTimer. Parece tener algunos gastos generales asociados con el uso de la clase. Pero muy menor. La diferencia no es tanta. Pero QTime pareció darme un tiempo de ejecución un poco más rápido. Medí el código de procesamiento de números de 4 métodos (3 veces con QTime y 3 con QElapsedTimer). El temporizador QElapsed midió 8,046 segundos en promedio y QTime midió 8,016 segundos en promedio, siendo la diferencia de 30 ms. No es significativo para la mayoría de los propósitos, pero tal vez lo sea para una precisión absoluta. Esto estaba ejecutando QT 5.3.1 de 32 bits en una PC Intel i5 con Windows 7 de 64 bits.

    – te7

    23 de junio de 2015 a las 12:02


  • Ver el hilo aquí qtcentre.org/hilos/…

    – te7

    23 de junio de 2015 a las 12:36

  • Estoy de acuerdo. Probé QElapsedTimer. Parece tener algunos gastos generales asociados con el uso de la clase. Pero muy menor. La diferencia no es tanta. Pero QTime pareció darme un tiempo de ejecución un poco más rápido. Medí el código de procesamiento de números de 4 métodos (3 veces con QTime y 3 con QElapsedTimer). El temporizador QElapsed midió 8,046 segundos en promedio y QTime midió 8,016 segundos en promedio, siendo la diferencia de 30 ms. No es significativo para la mayoría de los propósitos, pero tal vez lo sea para una precisión absoluta. Esto estaba ejecutando QT 5.3.1 de 32 bits en una PC Intel i5 con Windows 7 de 64 bits.

    – te7

    23 de junio de 2015 a las 12:02


  • Ver el hilo aquí qtcentre.org/hilos/…

    – te7

    23 de junio de 2015 a las 12:36

¿Ha sido útil esta solución?