首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有直接QueryPerformanceCounter值的时钟是否符合C++标准?

具有直接QueryPerformanceCounter值的时钟是否符合C++标准?
EN

Stack Overflow用户
提问于 2020-03-27 12:50:39
回答 2查看 335关注 0票数 2

假设我想使用直接的Clock Windows结果创建QueryPerformanceCounterQueryPerformanceCounter Windows返回一些应该除以QueryPerformanceFrequency结果的计数器,从而在秒内产生时间。

通常,基于ClockQueryPerformanceCounter会立即将结果转化为某些单位,方法是乘以某个周期,再除以QueryPerformanceFrequency。这就是在Windows上实现steady_clock的方法。

但假设出于性能原因,我想避免除法,直到真正需要为止。因此,time_point是直接的QueryPerformanceCounter值,而duration是这类值的区别。大多数时候,我都可以对这些值执行算术和比较,转换为一些普通的durationtime_point,只有最后的结果。

我相信这是可能的。我的问题是:这样的Clock是否与标准的Clock完全兼容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-27 13:24:08

它不会完全兼容标准的时钟要求。但大多数情况下,它会编译并执行您想做的事情。不符合的部分是,您必须为您的period指定time_point所基于的内容。某些东西不一定与物理时间单位相对应。

这并不重要,除非减去两个time_points,得到一个duration,然后将这个duration与表示物理时间的东西进行比较。然后你会得到运行时间的垃圾。

另外,如果您在time_point中使用这样的sleep_untilwait_until,那么您的程序就不会休眠或等待预定的时间。

下面是一个基于QueryPerformanceCounter的计时时钟示例,它使用QueryPerformanceFrequencyhttps://stackoverflow.com/a/15755865/576911确定物理单元

票数 2
EN

Stack Overflow用户

发布于 2020-03-28 18:09:00

按照Hinnant的解释,重新定义的time_pointduration与编译时已知的period不对应的时钟不符合Clock要求。

使用模拟算术类型的类来隐藏其他实现细节不起作用。

由于Standard没有定义这个仿真是什么,所以只有标准实现提供的时钟才有机会使用仿真类型。作为一个实际的证明,std::chronoboost::chronoboost::rational中不能很好地工作。

但是,一般的任务是避免对每次查询进行分割,至少有两种实用的解决方案。

第一种解决方案是遵循将分割延迟到需要时的意图,而不是重新定义time_pointduration。定义符合标准的时钟,作为扩展,定义原始时间戳的接口。所以,时钟可以有raw_now()方法,返回raw_time_point类型,这样的区别是raw_duration类型。raw_time_point可以隐式转换为time_pointraw_duration可转换为duration

第二种解决方案是为每次查询计算符合标准的time_point,但是使用不需要除法操作的分水岭库执行快速除法。

库接受除数并对其进行处理,以便使用已处理除数的每个分区都使用快速操作完成。当然,处理除数需要时间,但是对于使用相同除数的重复除法,它是一次性开销。因此,这个库看起来是这个任务的理想匹配。(请注意,对于编译时已知的常量,库并不有用,因为在本例中,编译器避免了自己的除法,但是QueryPerformanceFrequency结果是运行时常量)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60886394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档