2010-01-31 21 views
6

Sé que esta pregunta se me ha formulado pocas veces sobre SO, pero ninguna de ellas me está ayudando realmente, por lo que vuelvo a preguntar.Cálculo del tiempo por el código C++

Estoy utilizando Windows XP y ejecutar Visual Studio C++ 2008.

Todo el código que estoy buscando está utilizando time.h pero creo que puede ser no su trabajo correctamente aquí, ya que los resultados me están haciendo sospechosa.

Así que esto es lo que quiero.

star time = get time some how (this is my question) 

my code 

end time = get time some how (this is my question) 

time passed = start time - end time 
+0

lo que está ocasionando el "sospechoso"? –

+0

me devuelve "0" – itsaboutcode

+1

su código se ejecuta demasiado rápido para la precisión del tiempo.h para atraparlo - use una solución que otorgue más precisión (vea mi respuesta) –

Respuesta

8

Esto es lo que uso para imprimir el tiempo en milisegundos.

void StartTimer(_int64 *pt1) 
{ 
    QueryPerformanceCounter((LARGE_INTEGER*)pt1); 
} 

double StopTimer(_int64 t1) 
{ 
    _int64 t2, ldFreq; 

    QueryPerformanceCounter((LARGE_INTEGER*)&t2); 
    QueryPerformanceFrequency((LARGE_INTEGER*)&ldFreq); 
    return ((double)(t2 - t1)/(double)ldFreq) * 1000.0; 
} 

utilizar de esta manera: sugerencia de utilizar QueryPerformanceCounter

_int64 t1; 

    StartTimer(&t1); 

    // do some stuff 

    printf("Time = %.3f\n", StopTimer(t1)); 
+0

Creo que esto ha resuelto mi problema. Gracias Mark. – itsaboutcode

4

Necesita un temporizador de alta precisión. En el caso de Visual Studio, use QueryPerformanceCounter.

Si la precisión no es suficiente, utilice intristics compilador:

#include <intrin.h> 
#pragma intrinsic(__rdtsc) 

unsigned __int64 ticks = __rdtsc(); 

ver información sobre ese intristic here.

Ambas soluciones son solo para Windows, esta última es probablemente solo MSVC. Puedo publicar una solución similar para GCC/Linux si es necesario.

+0

¿Cómo puedo convertirlo a milisegundos? – itsaboutcode

+0

@itsaboutcode, desafortunadamente con tales funciones de rendimiento de bajo nivel, no hay una forma segura de convertirlo a milisegundo, ya que el resultado es diferente dependiendo de la velocidad de su procesador. Puede calcular un valor de ticks/second usando Sleep before hand, y luego hacer la conversión. –

+2

¡Tenga cuidado si utiliza RDTSC en sistemas multinúcleo o multicajas! Cada núcleo de la CPU en un sistema tiene un contador de marca de tiempo separado y pueden estar o no sincronizados. En general, es necesario que haya un controlador que sincronice periódicamente los contadores de marca de tiempo en los núcleos. A menos que establezca explícitamente la afinidad de subprocesos de su proceso, el sistema operativo puede moverlo libremente de un núcleo a otro. Si los TSC de los núcleos no están sincronizados, puede obtener sus horas de inicio y finalización desde diferentes contadores, y la diferencia puede ser drásticamente incorrecta, ¡incluso negativa! –

1

Si está en Windows, la función GetTickCount() es una forma práctica de obtener un temporizador con más de 1 segundo de resolución. La resolución de GetTickCount depende de su sistema operativo, pero probablemente esté entre 10 ms y 16 ms.

Tenga en cuenta que para operaciones rápidas, hacer su código una vez no será suficiente. Su código podría ejecutarse en 0.02 ms, lo que significa que obtendrá 0 de un contador como GetTickCount. Es posible que su código no se ejecute durante el tiempo suficiente para que el temporizador "marque" al siguiente valor. La solución es ejecutar su código en un bucle un millón de veces o lo que sea, el tiempo todo el lote, luego dividir por un millón.

+0

Estoy usando esta función pero no hay resultados. – itsaboutcode

+0

@itsaboutcode: ¿Y cuántas veces está ejecutando su código entre la captura de las horas de "inicio" y "finalización"? –

+0

Solo una vez, es esa cuestión, su código muy largo ... como 6 funciones y en total 250 líneas de código. – itsaboutcode

0

Kornel es una excelente.

Si eso no funciona para usted, y no le importa otra solución solo de Windows, use los "temporizadores multimedia" de Windows. Busque en los archivos de ayuda de Visual Studio "timeBeginPeriod", "timeEndPeriod" y "Using Multimedia Timers".

Para utilizar los temporizadores multimedia, es necesario incluir el encabezado y el vínculo con Winmm.lib:

#include <mmsystem.h> 
#pragma comment(lib, "winmm")  // need this library for multimedia timers 
1

Por lo general, la gente hacer algo como esto para medir algún pequeño intervalo de tiempo:

t0 = getTime(); 

for(int i = 0; i<1000000; ++i) { 
    your code 
} 

t1 = getTime(); 

timePassed = (t1-t0)/1000000; 
0

Esto está trabajando

#include <windows.h> 

SYSTEMTIME startTime; 
GetSystemTime(&startTime); 
WORD startmillis = (startTime.wSecond * 1000) + startTime.wMilliseconds; 

// Do some stuff 

SYSTEMTIME endTime; 
GetSystemTime(&endTime); 
WORD endmillis = (endTime.wSecond * 1000) + endTime.wMilliseconds; 

WORD millis = startmillis - endmillis ; 
Cuestiones relacionadas