【问题标题】:C get system time to microsecond accuracy on windows? [duplicate]C在Windows上获得系统时间到微秒精度? [复制]
【发布时间】:2010-12-31 05:13:07
【问题描述】:

可能重复:
measuring time with resolution of microseconds in c++?

嗨,

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

【问题讨论】:

标签: c++ c windows


【解决方案1】:

看看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

【讨论】:

  • 更可能是以 100 纳秒而不是 100 纳秒的精度表示的时间?
  • 您也可以使用GetSystemTime()... 但问题是,这是绝对时间,而不是相对时间。在程序中使用它来计算经过的时间并不好,因为绝对时间会因各种随机原因(例如时间同步)而改变。
  • @Lambert GetSystemTime 为毫秒精度,不够好,而且它使用日期格式,因此很难计算差异
  • @Steve-o 是的,你是对的。但它是Win32API能给出的最准确的度量
  • 来自KeQuerySystemTime:“系统时间通常大约每十毫秒更新一次。”
【解决方案2】:

这样

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

【讨论】:

  • QueryPerformanceCounter 不返回系统时间,而是返回高分辨率计数器
【解决方案3】:

我们真正需要的是高分辨率的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 中的需求。

【讨论】:

  • GetTickCount 始终以毫秒为单位。您发布的 32 位 GetTickCount 实现与旧的 Win32 实现没有什么不同。
  • 没错 -- 这就是我说 tweak 的原因。您可以进行较小的位移或乘以较小的数字,从而获得更高的准确性。
  • 我的错。查看 KeQueryTimeIncrement 以转换为时间值。
  • @wj32: 除了你只能从内核模式调用它...
  • 没错,但我确实说过“检查”该功能。好吧,事实证明你有系统调用NtQueryTimerResolution,它返回这个精确值(时间增量)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2021-09-30
  • 2015-05-29
相关资源
最近更新 更多