C++ 在windows上获得系统时间到微秒的精度?

C++ 在windows上获得系统时间到微秒的精度?,c++,c,windows,C++,C,Windows,可能重复: 嗨 有没有一种简单的方法可以在Windows机器上获得系统时间,精确到微秒 unsigned __int64 freq; QueryPerformanceFrequency((LARGE_INTEGER*)&freq); double timerFrequency = (1.0/freq); unsigned __int64 startTime; QueryPerformanceCounter((LARGE_INTEGER *)&startTime); //do

可能重复:

有没有一种简单的方法可以在Windows机器上获得系统时间,精确到微秒

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

查看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;
FILETIME-ft;
GetSystemTimeAsFileTime(&ft);
无符号长tt=ft.dwHighDateTime;

tt我们真正需要的是一个高分辨率的
GetTickCount()
。据我所知,这并不是真的存在

如果您愿意使用一种黑客方式来解决这个问题(这可能只适用于某些版本的Windows,如XP),请查看这里的。然后尝试以下代码:

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中,调整它可能会满足您的需要。

QueryPerformanceCounter的副本不会返回系统时间,而是返回高分辨率计数器。更有可能是以100纳秒的精度表示的时间,而不是100纳秒的精度?您也可以使用
GetSystemTime()
。。。但问题是,这是绝对时间,不是相对时间。在程序内部使用它来计算经过的时间是不好的,因为绝对时间可能会因各种随机原因(例如时间同步)而改变。@Lambert GetSystemTime作为毫秒精度,它不够好,而且它使用了日期格式,因此很难计算differences@Steve-是的,你是对的。但是Win32API可以从
KeQuerySystemTime
中给出最精确的度量:“系统时间通常大约每十毫秒更新一次。”GetTickCount总是以毫秒为单位。您发布的32位GetTickCount实现与旧的Win32实现没有什么不同。没错,这就是我说调整它的原因。你可以做更小的位移位或乘以更小的数字,获得更高的精度。我的错。请签出KeQueryTimeIncrement以转换为时间值。@wj32:除了您只能从内核模式调用它之外……是的,但我确实说了“签出”该函数。事实证明,您有一个系统调用
ntquerytimeresolution
,它返回这个精确的值(时间增量)。