Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有直接查询性能计数器值的时钟是否符合C++;标准_C++_C++11_Query Performance_Performancecounter_Chrono - Fatal编程技术网

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
不起作用。但我最初的问题有解决办法。我已经添加了我自己的答案。