C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Win32系统上,boost :: date_time :: microsec_clock()是使用ftime实现的,ftime只提供毫秒级的分辨率: Link to doc

Stackoverflow上有一些问题/答案说明这一点并链接文档,但没有解释为什么会这样:

> Stackoverflow #1
> Stackoverflow #2

似乎有办法在Windows上实现微秒分辨率:

> GetSystemTimePreciseAsFileTime(Win8)
> QueryPerformanceCounter

我感兴趣的是为什么Boost以这种方式实现它,反过来又有可能解决方案更合适?

解决方法@H_502_23@
GetSystemTimePreciseAsFileTime仅适用于Windows 8桌面应用程序.它模仿Linuxes GetTimeOfDay.该实现使用QueryPerformanceCounter来实现微秒分辨率.时间戳是在系统时间增量时获取的.对GetSystemTimePreciseAsFileTime的后续调用将花费系统时间并将经过的“性能计数器时间”(经过的刻度/性能计数器频率)添加为高分辨率部分.

QueryPerformanceCounter的功能再次取决于平台特定的细节(HPET,ACPI PM计时器,不变TSC等).有关详细信息,请参见MSDN: Acquiring high-resolution time stampsSO: 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上仍有进一步改善时间问题的空间.

我应该提一下,从Windows 8.1开始,GetSystemTimePreciseAsFileTime没有给出预期的结果或在MSDN: GetSystemTimePreciseAsFileTime function指定的结果.它将系统文件时间与QueryPerformanceCounter的结果相结合,以填补连续文件时间增量之间的差距,但它不需要系统时间调整考虑在内.有效的系统时间调整,例如,由SetSystemTimeAdjustment完成,修改系统时间粒度和系统时间的进度.但是,用于构建GetSystemTimePreciseAsFileTime结果的已使用性能计数器频率保持不变.结果,微秒部分被SetSystemTimeAdjustment设置的调整增益关闭.

大佬总结

以上是大佬教程为你收集整理的c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?全部内容,希望文章能够帮你解决c – 为什么在Windows上没有具有microsec分辨率的boost :: date_time?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: