Rust 有稳定的时钟吗?

问题描述 投票:0回答:2

Rust 是否有相当于 C++ 的

std::chrono::steady_clock
的东西? (强调稳定

这个时钟的时间点不能随着物理时间的移动而减少 向前,该时钟的滴答声之间的时间是恒定的

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

...瞬间不能保证稳定。换句话说,每个 底层时钟的滴答声可能长度不同(例如某些 秒可能比其他秒长)。瞬间可能会向前跳跃或 体验时间膨胀(减慢或加速)...

rust
2个回答
7
投票

以下是我收集到的一些事实:

  1. gcc 通过clock_gettime(CLOCK_MONOTONIC,...) 系统调用实现steady_clock::now();
  2. llvm 的 libc++ 通过 Unix 的clock_gettime(CLOCK_MONOTONIC, ...) 系统调用实现steady_clock::now()。在 Windows 下,它通过 QueryPerformanceCounter(...); 实现;
  3. Rust 的 Interval 在 Unix 下使用clock_gettime(CLOCK_MONOTONIC,...),在 Windows 下也使用 QueryPerformanceCounter(...);

我没有检查其他平台,但由于 Rust 在底层使用 llvm,因此它很可能使用相同的系统调用。因此 Rust 的 Interval 和 C++ stable_clock 实现使用完全相同的系统调用,至少对于 gcc 和 llvm 来说是这样。

而且Unix的clock_gettime()系统调用不能保证有稳定的速率(或者至少我找不到这样的保证),所以这样的C++保证是令人费解的。此外,如果我们看看实际的 C++ 标准,它说的有些不同:

23.17.7.2 类 stable_clock

  1. 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。当系统暂停时似乎也没有滴答作响。不知道其他拱门有没有类似的东西


0
投票

在 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 选择提供较弱的保证。

看起来我们可以相信它比我们公共平台上广告的更好。

© www.soinside.com 2019 - 2024. All rights reserved.