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
- steady_clock 类的对象表示 time_point 值永远不会随着物理值减少的时钟 时间提前,并且 time_point 的值相对于实时以稳定的速率提前。也就是说,时钟可能无法调整。
对我来说,听起来“稳定速率”更多的是“时钟无法调整”,而不是保证滴答之间的时间是恒定的。 “稳定利率”这个词对我来说听起来很模糊。但是,我认为这是一个解释问题。
无论哪种方式,Rust 和 C++ 都以相同的方式实现这些时钟,并且这一点不太可能改变。我认为事实介于两者之间:C++ 的保证不可能是真的(除非时间在一定精度范围内恒定),而 Rust 的警告可能并不像听起来那么糟糕。
编辑: 一些 x86 cpu,实际上从 Pentium 4 开始的所有 Intel cpu,都具有称为“恒定 TSC”的功能。根据 wikipedia,它可以在 Unix 系统上通过clock_gettime(CLOCK_MONOTONIC_RAW, ...) 访问,并且它内置于 Windows 上的 QueryPerformanceCounter 中。这个“时钟”以独立于CPU速度的方式滴答,但它与“恒定速率”的接近程度尚不清楚(至少对我来说)。可能非常接近。当然,您需要在 Unix 上进行直接系统调用,并且它仅限于 x86 arch。当系统暂停时似乎也没有滴答作响。不知道其他拱门有没有类似的东西
在 Unix 平台上,Rust 标准库使用 CLOCK_MONOTONIC (或 macOS 上的相关变体),如您在 std/src/sys/pal/unix/time.rs:
中看到的 #[cfg(target_vendor = "apple")]
const clock_id: libc::clockid_t = libc::CLOCK_UPTIME_RAW;
#[cfg(not(target_vendor = "apple"))]
const clock_id: libc::clockid_t = libc::CLOCK_MONOTONIC;
Instant { t: Timespec::now(clock_id) }
Rust 文档中对
Instant
的警告可能存在,因为 Rust 支持 Unix 以外的许多平台,并且其中许多平台可能无法保证稳定的时钟。因此 Rust 选择提供较弱的保证。
看起来我们可以相信它比我们公共平台上广告的更好。