在Win32
系统boost::date_time::microsec_clock()
上使用ftime
实施,{{1}}仅提供毫秒分辨率:Link to doc
Stackoverflow上有一些问题/答案说明并链接文档,但没有解释为什么会这样:
似乎有办法在Windows上实现微秒分辨率:
我感兴趣的是为什么Boost以这种方式实现它,反过来可能会有更合适的解决方案?
答案 0 :(得分:5)
QueryPerformanceCounter
无法帮助您解决此问题。它为您提供了一个时间戳,但由于您不知道计数器何时启动,因此没有可靠的方法来计算其中的绝对时间点。 boost :: date_time是一个(用户可以理解的)时间点。
另一个区别是像QueryPerformanceCounter这样的计数器为您提供了一个稳定增加的计时器,而系统时间可能受到用户的影响,因此可以跳转。
所以这两件事情是针对不同的用例。一个用于表示实时,另一个用于获取软件中的精确计时和基准测试。
GetSystemTimePreciseAsFileTime
似乎符合高分辨率绝对时间的费用。我猜它没有被使用,因为它需要Windows8。
答案 1 :(得分:2)
GetSystemTimePreciseAsFileTime
仅适用于Windows 8桌面应用程序。它模仿Linuxes GetTimeOfDay。该实现使用QueryPerformanceCounter
来实现微秒分辨率。时间戳是在系统时间增量时获取的。对GetSystemTimePreciseAsFileTime
的后续调用将占用系统时间并将经过的“性能计数器时间”(经过的刻度/性能计数器频率)添加为高分辨率部分。
QueryPerformanceCounter
的功能性再次取决于平台特定的细节(HPET,ACPI PM计时器,不变TSC等)。有关详细信息,请参阅MSDN: Acquiring high-resolution time stamps和SO: Is QueryPerformanceFrequency acurate when using HPET?。
各种版本的Windows都有特定的方案来更新系统时间。 Windows XP具有固定的文件时间粒度,这与系统计时器分辨率无关。只有发布Windows XP版本才允许通过更改系统计时器分辨率来修改系统时间粒度。
这可以通过多媒体计时器API timeBeginPeriod
和/或隐藏的API NtSetTimerResolution
来实现(有关使用`的更多详细信息,请参阅this SO answer
timeBeginPeriod和NtSetTimerResolution)。
如上所述,GetSystemTimePreciseAsFileTime
仅适用于桌面应用程序。原因是需要特定的硬件。
我感兴趣的是为什么Boost以这种方式实现它,反过来可能会有更合适的解决方案?
采取上述事实将使实施非常复杂,结果非常具体。每个(!)Windows版本都经历了严重的时间更改。即使从8到8.1的最新小步骤也大大改变了计时程序。但是,在Windows上仍有进一步改善时间问题的空间。
我应该提到GetSystemTimePreciseAsFileTime
,从Windows 8.1开始,不会像{4}那样给出预期或指定的结果。它将系统文件时间与QueryPerformanceCounter
的结果相结合,以填补连续文件时间增量之间的差距,但不考虑系统时间调整。有效的系统时间调整,例如,由SetSystemTimeAdjustment
完成,修改系统时间粒度和系统时间的进度。但是,用于构建GetSystemTimePreciseAsFileTime
结果的已使用性能计数器频率保持不变。结果,微秒部分被SetSystemTimeAdjustment
设置的调整增益关闭。