【发布时间】:2010-12-31 05:13:07
【问题描述】:
嗨,
有没有一种简单的方法可以让我在 Windows 机器上获取系统时间,精确到微秒?
【问题讨论】:
嗨,
有没有一种简单的方法可以让我在 Windows 机器上获取系统时间,精确到微秒?
【问题讨论】:
看看GetSystemTimeAsFileTime
它为您提供 0.1 微秒或 100 纳秒的精度。
请注意,它的 Epoch 与 POSIX Epoch 不同。
因此,要获得以微秒为单位的 POSIX 时间,您需要:
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
unsigned long long tt = ft.dwHighDateTime;
tt <<=32;
tt |= ft.dwLowDateTime;
tt /=10;
tt -= 11644473600000000ULL;
所以在这种情况下time(0) == tt / 1000000
【讨论】:
GetSystemTime()... 但问题是,这是绝对时间,而不是相对时间。在程序中使用它来计算经过的时间并不好,因为绝对时间会因各种随机原因(例如时间同步)而改变。
KeQuerySystemTime:“系统时间通常大约每十毫秒更新一次。”
这样
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);
【讨论】:
我们真正需要的是高分辨率的GetTickCount()。据我所知,这并不存在。
如果您愿意使用 hackish 方法来解决此问题(这可能仅适用于 XP 等某些版本的 Windows),请查看ReactOS。然后试试这段代码:
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);
}
调整它可能会满足您在某些版本的 Windows 中的需求。
【讨论】:
NtQueryTimerResolution,它返回这个精确值(时间增量)。