2010-12-31 9 views

Respuesta

4

gusta esta

unsigned __int64 freq; 
QueryPerformanceFrequency((LARGE_INTEGER*)&freq); 
double timerFrequency = (1.0/freq); 

unsigned __int64 startTime; 
QueryPerformanceCounter((LARGE_INTEGER *)&startTime); 

//do something... 

unsigned __int64 endTime; 
QueryPerformanceCounter((LARGE_INTEGER *)&endTime); 
double timeDifferenceInMilliseconds = ((endTime-startTime) * timerFrequency); 
+5

QueryPerformanceCounter no devuelve ** hora del sistema ** pero alta resolución ** contador **. – 9dan

9

Mira GetSystemTimeAsFileTime

que le da una precisión de 0,1 microsegundos o 100 nanosegundos.

Tenga en cuenta que es diferente de POSIX Epoch.

Así que para obtener el tiempo de POSIX en microsegundos que necesita:

FILETIME ft; 
    GetSystemTimeAsFileTime(&ft); 
    unsigned long long tt = ft.dwHighDateTime; 
    tt <<=32; 
    tt |= ft.dwLowDateTime; 
    tt /=10; 
    tt -= 11644473600000000ULL; 

Por lo tanto, en tal caso time(0) == tt/1000000

+3

¿Es más probable que sea el tiempo expresado en 100 nanosegundos en lugar de una precisión de 100 nanosegundos? –

+1

También podría usar 'GetSystemTime()' ... pero el problema es que es tiempo absoluto, no tiempo relativo. No es bueno usarlo dentro de un programa para calcular el tiempo transcurrido, ya que el tiempo absoluto puede cambiar por varias razones aleatorias (por ejemplo, sincronización de tiempo). – Mehrdad

+0

@Lambert GetSystemTime como milisegundos de precisión, no es lo suficientemente bueno, también usó el formato de fecha, por lo que es difícil calcular las diferencias – Artyom

0

Lo que realmente necesitamos es una alta resolución GetTickCount(). Hasta donde yo sé, esto realmente no existe.

Si está dispuesto a utilizar una forma hackish para resolver esto (que probablemente solo funcione en algunas versiones de Windows como XP), mire aquí en ReactOS. A continuación, probar este código:

long long GetTickCount64() 
{ 
    return (long long) 
     ((((unsigned long long)*(unsigned long int*)0x7FFE0000 
      * (unsigned long long)*(unsigned long int*)0x7FFE0004) 
     * (unsigned long long)10000) >> 0x18); 
} 

Afinando que podría darle lo que necesita en algunas versiones de Windows.

+0

GetTickCount siempre está en milisegundos. La implementación de GetTickCount de 32 bits que ha publicado no es diferente de la implementación anterior de Win32. – wj32

+0

Exactamente - es por eso que dije ** modificar **. Puedes hacer pequeños cambios de bits o multiplicar por un número más pequeño, y obtener más precisión. – Mehrdad

+0

Mi mal. Verifique KeQueryTimeIncrement para convertir a un valor de tiempo. – wj32

Cuestiones relacionadas