gpt4 book ai didi

c++ - 扩展 std::chrono 功能以处理运行时(非编译时)恒定周期

转载 作者:太空狗 更新时间:2023-10-29 21:02:48 25 4
gpt4 key购买 nike

我一直在 Linux 和 OSX 上试验各种定时器,并想尝试用 std::chrono 使用的相同接口(interface)包装其中的一些。

对于在编译时具有明确定义的“周期”的计时器来说,这很容易做到,例如POSIX clock_gettime() 系列、OSX 上的 clock_get_time() 系列或 gettimeofday()。

但是,有一些有用的计时器,它们的“周期”——虽然是常数——只在运行时才知道。例如: - POSIX 声明 clock() 的周期,CLOCKS_PER_SEC,在非 XSI 系统上可能是一个变量 - 在 Linux 上,times() 的周期在运行时由 sysconf(_SC_CLK_TCK) 给出 - 在 OSX 上,mach_absolute_time() 的周期在运行时由 mach_timebase_info() 给出 - 在最近的 Intel 处理器上,DST 寄存器以恒定速率滴答,但当然只能在运行时确定

要将这些计时器包装在 std::chrono 接口(interface)中,一种可能是使用一段 std::chrono::nanosecond ,并将每个计时器的值转换为纳秒。另一种方法可能是使用浮点表示。但是,这两种方法都会给 now() 函数带来(非常小的)开销,并且(可能很小)会降低精度。

我试图寻求的解决方案是定义一组类来表示此类“运行时常量”周期,这些类是按照与 std::ratio 类相同的方式构建的。但是我预计这将需要重写所有相关的模板类和函数(因为它们采用 constexpr 值)。

如何将这些计时器包装成 std​​:chrono ?

或者对时钟的时间段使用非 constexpr 值?

最佳答案

Does anyone have any experience with wrapping these kind of timers a la std:chrono ?

其实我也是。在 OSX 上,您感兴趣的平台之一。 :-)

你提到:

on OSX, the period of mach_absolute_time() is given at runtime by mach_timebase_info()

完全正确。同样在 OSX 上,libc++实现high_resolution_clocksteady_clock实际上是基于mach_absolute_time .我是此代码的作者,它是开放源代码的,具有慷慨的许可(只要您保留版权,就可以用它做任何您想做的事)。

这是 libc++'s steady_clock::now() 的来源.它的构建方式几乎与您推测的一样。运行时间段在返回之前转换为纳秒。在 OS X 上,转换因子通常为 1,代码通过优化利用了这一事实。然而,该代码足够通用以处理非 1 转换因子。

第一次调用 now()将运行时转换因子查询为纳秒的成本很小。在一般情况下,计算浮点转换因子。在常见情况下(转换因子 == 1),后续成本是通过函数指针调用。我发现开销非常合理。

在 OS X 上,转换因子虽然直到运行时才确定,但仍然是一个常数(即不随程序执行而变化),因此只需计算一次。

如果您的经期实际上是动态变化的,您将需要更多的基础设施来处理这个问题。本质上,您需要积分(微积分)周期与时间曲线,然后计算两个时间点之间的平均周期。这将需要随着时间的推移不断监测周期,并且 <chrono>不是正确的工具。此类工具通常在操作系统级别处理。

关于c++ - 扩展 std::chrono 功能以处理运行时(非编译时)恒定周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14777040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com