2008-10-28 13 views
57

Busco el equivalente en Qt a GetTickCount()tiempo transcurrido en Qt

Algo que me permitirá medir el tiempo que le toma a un segmento de código se ejecute como en:

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

alguna sugerencia?

Respuesta

75

¿Qué tal QTime? Dependiendo de su plataforma, debe tener una precisión de 1 milisegundo. Código sería algo como esto:

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

En mi máquina virtual WinXP parece que solo tiene 10 ms de precisión. ¿Alguien puede confirmar/denegar esto? Obtengo valores de 0, 10 y 20 para una operación que estoy probando. –

+3

Windows no es tan preciso como un sistema operativo de tipo UNIX al momento. –

+0

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

103

creo que es probablemente mejor usar QElapsedTimer ya que es por eso que existe la clase en el 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(); 
34

Incluso si la primera respuesta fue aceptada, el resto de las personas que leen las respuestas debe considerar sivabudh 's sugerencia.
QElapsedTimer también se puede utilizar para calcular el tiempo en nanosegundos.
ejemplo 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(); 
+2

De nuevo: Esto mide el tiempo real, no el tiempo de CPU consumido por el proceso. –

+0

Lo calcula tomando la cantidad de marcas de procesador consumidas por la aplicación y multiplicando por el número de nanosegundos por Tick. Mide el tiempo de CPU consumido por el proceso. –

+0

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

1

Una estrategia general es llamar al método observado varias veces. 10 llamadas entregan una precisión de 1,5 ms, 100 una de 0,15 ms.

+0

Eso no responde la pregunta. Él quiere que una función le brinde una forma de medir el tiempo de las llamadas; le estás diciendo cómo reducir el error en una serie de mediciones. – itsbruce

1

Si desea utilizar QElapsedTimer, debe considerar la sobrecarga de esta clase.

Por ejemplo, el siguiente código se ejecutan 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 este resultado:

timing: 90 ns/call 
timing: 89 ns/call 
... 

Se debe medir esto por sí mismo y respetar la sobrecarga para su sincronización.

+0

Estoy de acuerdo. Intenté QElapsedTimer. Parece tener algunos gastos generales asociados con el uso de la clase. Pero muy menor. La diferencia no es mucho. Pero QTime parecía darme un poco más de tiempo de ejecución. Medí el código numérico de 4 métodos (3 veces con QTime y 3 con QElapsedTimer). El temporizador QElappendió midió 8.046 segundos en promedio y el tiempo QT midió 8.016 segundos en promedio, la diferencia es de 30 ms. No es significativo para la mayoría de los propósitos, pero tal vez sea para una precisión absoluta. Esto estaba ejecutando QT 5.3.1 32 bit en un PC con Windows 7 64 bit Intel i5. – te7

+0

Vea el hilo aquí http://www.qtcentre.org/threads/62883-Simple-stopwatch-to-time-some-code?p=278558#post278558 – te7

1

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 entonces usted puede utilizar simple como:

CHECKTIME(
    // any code 
    for (int i=0; i<1000; i++) 
    { 
     timeConsumingFunc(); 
    } 
) 

de salida:

onSpeedChanged: 102 Tiempo transcurrido: 2 ms.

Cuestiones relacionadas