2010-12-31 6 views

Antwort

4

Gefallen Sie diesen

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 gibt ** Systemzeit ** ** aber hohe Auflösung ** ** nicht zurück. – 9dan

9

Blick auf GetSystemTimeAsFileTime

Es gibt Ihnen Genauigkeit in 0,1 Mikrosekunden oder 100 ns.

Beachten Sie, dass es Epoch anders als POSIX Epoch ist.

So müssen Sie POSIX Zeit in Mikrosekunden erhalten:

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

So in diesem Fall time(0) == tt/1000000

+3

Wahrscheinlicher ist es, dass die Zeit in 100 Nanosekunden anstatt in 100 Nanosekunden ausgedrückt wird? –

+1

Sie könnten auch 'GetSystemTime()' verwenden ... aber das Problem ist, es ist absolute Zeit, keine relative Zeit. Es ist nicht gut für die Verwendung in einem Programm, um die verstrichene Zeit herauszufinden, da sich die absolute Zeit aus verschiedenen zufälligen Gründen (z. B. Zeitsynchronisation) ändern kann. – Mehrdad

+0

@Lambert GetSystemTime als Millisekunden Genauigkeit, es ist nicht gut genug, auch es verwendet Datumsformat, so dass es schwierig ist, Unterschiede zu berechnen – Artyom

0

Was wir wirklich ein hochauflösendes GetTickCount() ist benötigen. Soweit ich weiß, gibt es das nicht wirklich.

Wenn Sie bereit sind, einen hackischen Weg zu nutzen, um dies zu lösen (das würde wahrscheinlich nur bei einigen Windows-Versionen wie XP funktionieren), schauen Sie sich hier ReactOS an. Dann versuchen Sie diesen Code:

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

Tweaking es könnte Ihnen geben, was Sie in einigen Versionen von Windows benötigen.

+0

GetTickCount ist immer in Millisekunden. Die von Ihnen gepostete 32-Bit-GetTickCount-Implementierung unterscheidet sich nicht von der alten Win32-Implementierung. – wj32

+0

Genau - deshalb habe ich gesagt ** zwicke ** es. Sie können kleinere Bitverschiebungen durchführen oder mit einer kleineren Zahl multiplizieren und mehr Genauigkeit erhalten. – Mehrdad

+0

Mein schlechtes. Überprüfen Sie KeQueryTimeIncrement, um in einen Zeitwert zu konvertieren. – wj32