有没有相当于C++std::chrono::steady_clock的Rust?(重点放在steady上)

这个时钟的时间点不能随着物理时间的移动而减少 前锋和time between ticks of this clock is constant分.

std::time::Instant显然不符合:

...瞬间并不能保证是稳定的.换句话说,each tick of the underlying clock might not be the same length(例如,一些 秒可能比其他时间长).瞬间可能向前 skip 或 体验时间inflating (减速或加速)……

推荐答案

以下是我收集到的几个事实:

  1. GCC通过Clock_GetTime(Clock_monotonic,...)syscall实现STRATE_CLOCK::NOW();
  2. Llvm的libc++通过lock_gettime(lock_monotonic,...)syscall for Unix实现了STRATE_CLOCK::NOW().在Windows下通过QueryPerformanceCounter(...)实现;
  3. Ruust的时间间隔使用Unix下的CLOCK_GETTIME(CLOCK_MONTOTONIC,...)和Windows下的QueryPerformanceCounter(...);

我没有判断其他平台,但由于Rust在幕后使用了llvm,所以它很可能使用相同的系统调用.因此,Rust的Interval和C++STATED_CLOCK实现使用完全相同的音节,至少对于GCC和llvm是这样.

此外,Unix的Clock_gettime()syscall不能保证有一个稳定的速率(或者至少我找不到这样的保证),所以这样的C++保证令人费解.此外,如果我们查看实际的C++标准,它所表达的内容略有不同:

23.17.7.2班级稳定时钟

  1. 类STATED_CLOCK的对象表示TIME_POINT的值作为物理时钟从不减小的时钟 时间推进,并且其时间点的值相对于实时以稳定的速率前进.也就是说,时钟可能不会调整.

对我来说,"稳定的汇率"更多的是关于"时钟不能调整",而不是保证滴答之间的时间是恒定的.对我来说,"稳定利率"这个词听起来很模糊.但是,我想这是一个解释的问题.

无论哪种方式,Rust和C++都以相同的方式实现这些时钟,而且这种情况不太可能改变.我认为真相介于两者之间:C++的保证不可能是真的(除非时间恒定到一定的精度),而Rust的警告可能并不像听起来那么糟糕.

EDIT:一些x86 CPU,实际上是所有从奔腾4开始的Intel CPU,都有这个称为"常量TSC"的功能.根据the wikipedia,在Unix系统上可以通过CLOCK_GETTIME(CLOCK_MONTOTONIC_RAW,...)访问它,并且它内置在Windows上的QueryPerformanceCounter中.这个"时钟"以独立于CPU速度的方式滴答作响,但它离"恒定速率"有多近还不清楚(至少对我来说是这样).可能已经很接近了.当然,您需要在Unix上直接执行syscall,而且它仅限于x86 Arch.在系统挂起时,也似乎没有滴答作响.我不知道其他 arch 是否也有类似的东西.

Rust相关问答推荐

如何在 struct 中填充缓冲区并同时显示它?

通用池类型xsx

PyReadonlyArray2到Vec T<>

把Vector3变成Vector4的绝妙方法

如何使用字符串迭代器执行查找?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

在泛型 struct 的字段声明中访问关联的Conant

如何在Tauri中将变量从后端传递到前端

使用极点数据帧时,找不到枚举结果的方法lazy()

重写Rust中的方法以使用`&;mut self`而不是`mut self`

如何修复数组中NewType导致的运行时开销

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

如何重命名 clap_derive 中的子命令占位符?

如何在 Rust 中打印 let-else 语句中的错误?

我可以用 Rust 编写一个不可变变量

没有明确地说return会产生错误:match arms have incompatible types

pyO3 和 Panics

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

如何在 Rust 中编写修改 struct 的函数

Abortable:悬而未决的期货?