c – 为什么在Windows上没有具有microsec分辨率的boost :: date_
在Win32系统上,boost :: date_time :: microsec_clock()是使用ftime实现的,ftime只提供毫秒级的分辨率:
Link to doc
Stackoverflow上有一些问题/答案说明这一点并链接文档,但没有解释为什么会这样: > Stackoverflow #1 似乎有办法在Windows上实现微秒分辨率: > GetSystemTimePreciseAsFileTime(Win8) 我感兴趣的是为什么Boost以这种方式实现它,反过来又有可能解决方案更合适? 解决方法
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?. 这可以通过多媒体计时器API timeBeginPeriod和/或隐藏的API NtSetTimerResolution来实现(有关使用`的更多详细信息,请参阅this SO answer). 如上所述,GetSystemTimePreciseAsFileTime仅适用于桌面应用程序.原因是需要特定的硬件. 我感兴趣的是为什么Boost以这种方式实现它,反过来又有可能解决方案更合适? 采用上述事实将使实施非常复杂,结果非常具体.每个(!)Windows版本都经历了严重的时间更改.即使从8到8.1的最新小步骤也大大改变了计时程序.但是,在Windows上仍有进一步改善时间问题的空间. 我应该提一下,从Windows 8.1开始,GetSystemTimePreciseAsFileTime没有给出预期的结果或在MSDN: GetSystemTimePreciseAsFileTime function指定的结果.它将系统文件时间与QueryPerformanceCounter的结果相结合,以填补连续文件时间增量之间的差距,但它不需要系统时间调整考虑在内.有效的系统时间调整,例如,由SetSystemTimeAdjustment完成,修改系统时间粒度和系统时间的进度.但是,用于构建GetSystemTimePreciseAsFileTime结果的已使用性能计数器频率保持不变.结果,微秒部分被SetSystemTimeAdjustment设置的调整增益关闭. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |