C++ 具有直接查询性能计数器值的时钟是否符合C++;标准
假设我想用直接C++ 具有直接查询性能计数器值的时钟是否符合C++;标准,c++,c++11,query-performance,performancecounter,chrono,C++,C++11,Query Performance,Performancecounter,Chrono,假设我想用直接QueryPerformanceCounterwindowsapi结果创建ClockQueryPerformanceCounterWindows API返回一些计数器,这些计数器应除以QueryPerformanceFrequency结果,从而生成以秒为单位的时间 通常基于QueryPerformanceCounter的Clock会立即将结果转换为某些单位,方法是乘以某个周期,除以QueryPerformanceFrequency。这就是在Windows上实现稳定时钟的方法 但假设
QueryPerformanceCounter
windowsapi结果创建Clock
QueryPerformanceCounter
Windows API返回一些计数器,这些计数器应除以QueryPerformanceFrequency
结果,从而生成以秒为单位的时间
通常基于QueryPerformanceCounter
的Clock
会立即将结果转换为某些单位,方法是乘以某个周期,除以QueryPerformanceFrequency
。这就是在Windows上实现稳定时钟的方法
但假设出于性能原因,我希望在真正需要之前避免分割。因此,time\u point
是直接的QueryPerformanceCounter
值,duration
是这样的差异。我可以在大部分时间对这些值进行运算和比较,转换成一些正常的持续时间
或时间点
,仅转换为最终结果
我相信这是可能的。我的问题是:这样的
时钟
会与标准的时钟
完全兼容吗?它不会与标准完全兼容。但大多数情况下,它会编译并执行您想要的操作。不符合的部分是,您必须为您的时间点所基于的期间指定一些内容。有些东西不一定与物理时间单位对应
这并不重要,除非你减去其中两个时间点,得到一个持续时间
,然后将该持续时间
与表示物理时间的东西进行比较。然后你会得到运行时垃圾
另外,如果您在睡眠时间
或等待时间
中使用这样的时间点
,则您的程序将无法睡眠或等待预定时间
下面是一个基于QueryPerformanceCounter
的时钟示例,它确实用QueryPerformanceFrequency
确定了物理单位:重新定义了时间点和持续时间的时钟,它们与编译时已知的周期不一致时钟霍华德·希南特(Howard Hinnant)解释道
使用模拟算术类型的类来隐藏其他实现细节是行不通的
由于标准并没有定义什么是模拟,所以使用模拟类型的机会仅对标准实现提供的时钟可用。作为实践证明,std::chrono
和boost::chrono
不能很好地与boost::rational
配合使用
然而,避免每次查询时出现除数的一般任务至少有两种实际解决方案
第一种解决方案是遵循将除法延迟到需要时的意图,但不重新定义时间点
和持续时间
。定义符合标准的时钟,作为扩展,定义原始时间戳的接口。所以,时钟可能有raw\u now()
方法,返回raw\u time\u point
类型,这样的区别是raw\u duration
类型<代码>原始时间点
可以隐式转换为时间点
和原始持续时间
到持续时间
第二种解决方案是为每个时间查询计算标准一致性时间点
,但使用执行快速除法的库,而无需除法操作
该库获取除数并对其进行处理,以便使用已处理除数的每个除法都使用快速操作完成。当然,处理除数需要时间,但对于使用相同除数的重复除法,这是一次性开销。因此,该库看起来非常适合此任务。(请注意,该库对于编译时已知的常量没有用处,因为在这种情况下,编译器本身避免除法,但QueryPerformanceFrequency
result是运行时常量)。您的意思是这样吗?是,名为requirement的时钟从我的理解来看,时钟的唯一要求是@idclev463035818已经解释过的。。。所以时钟的概念就是要满足这个要求。时间点可以是你想要的任何东西,它只需要表示从epochi传来的滴答声有多少并不真正解释它,但上面的链接列出了满足要求所需的所有内容,而不是这方面的专家,但是,好吧,它只是提供了一些特定的方法,而不是是稳定的
,对语义的要求是相当宽松的…所以,要回答你的问题,你必须展示你的代码。谢谢你的回答。我正在考虑将周期
设为完全合法的纳秒周期,但将特定于系统的单元隐藏在rep
类型中,因为它可能是模拟算术类型的类。这仍然是不可能的吗?那么,当您的自定义rep
转换为标量时,就会发生到物理时间的转换?可能有用。不确定。我自己研究过这个问题,不,自定义rep
不起作用。但我最初的问题有解决办法。我已经添加了我自己的答案。