Rust 有相当于 C++ 的吗std::chrono::steady_clock?(强调稳定)
该时钟的时间点不会随着物理时间的向前移动而减少,并且该时钟的滴答之间的时间是恒定的。
std::time::Instant显然不适合:
...瞬间不能保证稳定。换句话说,底层时钟的每个滴答声的长度可能不同(例如,某些秒可能比其他秒长)。某个瞬间可能会向前跳跃或经历时间膨胀(减慢或加速)......
以下是我收集到的一些事实:
我没有检查其他平台,但由于 Rust 在底层使用 llvm,因此它很可能使用相同的系统调用。因此,Rust 的 Interval 和 C++ stable_clock 实现使用完全相同的系统调用,至少对于 gcc 和 llvm 来说是这样。
此外,Unix 的 Clock_gettime() 系统调用不能保证具有稳定的速率(或者至少我找不到这样的保证),因此这样的 C++ 保证令人费解。此外,如果我们看看实际的 C++ 标准,它的说法有些不同:
23.17.7.2 类 stable_clock
- stable_clock 类的对象表示时钟,其中 time_point 的值不会随着物理时间的推进而减少,并且 time_point 的值相对于实时以稳定的速率前进。即,可以不调整时钟。
对我来说,听起来“稳定速率”更多的是“时钟无法调整”,而不是保证滴答之间的时间是恒定的。“稳定利率”这个词对我来说听起来很模糊。但是,我认为这是一个解释问题。
不管怎样,Rust 和 C++ 都以相同的方式实现这些时钟,而且这一点不太可能改变。我认为事实介于两者之间:C++ 的保证不可能是真的(除非时间在一定精度范围内恒定),而 Rust 的警告可能并不像听起来那么糟糕。
编辑:一些 x86 cpu,实际上从 Pentium 4 开始的所有 Intel cpu,都有这个称为“恒定 TSC”的功能。根据维基百科,它可以通过Unix系统上的clock_gettime(CLOCK_MONOTONIC_RAW, ...)来访问,并且它内置于Windows上的QueryPerformanceCounter中。这个“时钟”以独立于CPU速度的方式滴答,但它与“恒定速率”的接近程度尚不清楚(至少对我来说)。可能非常接近。当然,您需要在 Unix 上进行直接系统调用,并且它仅限于 x86 arch。当系统暂停时似乎也没有滴答作响。不知道其他拱门是否也有类似的情况。