#sleep #accuracy #spin #accurate #native #thread #platform

spin_sleep

精确休眠。只要可信,就尽可能使用原生休眠,然后自旋。

14个版本 (5个稳定版)

1.2.1 2024年8月7日
1.2.0 2024年1月5日
1.1.1 2022年3月24日
1.0.0 2020年4月25日
0.2.1 2017年7月10日

#28操作系统

Download history 9707/week @ 2024-04-27 10414/week @ 2024-05-04 9869/week @ 2024-05-11 10398/week @ 2024-05-18 10358/week @ 2024-05-25 10404/week @ 2024-06-01 8768/week @ 2024-06-08 10425/week @ 2024-06-15 6962/week @ 2024-06-22 6445/week @ 2024-06-29 6875/week @ 2024-07-06 6546/week @ 2024-07-13 7504/week @ 2024-07-20 9772/week @ 2024-07-27 9848/week @ 2024-08-03 9137/week @ 2024-08-10

每月下载量37,263
用于 159 个crate(直接使用62个)

Apache-2.0

28KB
431

spin_sleep crates.io 文档

精确休眠。只要可信,就尽可能使用原生休眠,然后自旋。

thread::sleep的问题在于它并不总是非常精确,而且这种精度因平台和状态而异。自旋尽可能精确,但会不礼貌地消耗CPU。

此库添加了一个折衷方案,使用可配置的原生精度设置,允许thread::sleep等待大部分休眠时间,并在最后一段自旋以保证精度。

SpinSleeper

使用默认原生精度的最简单用法是thread::sleep的替代品。

spin_sleep::sleep(Duration::new(1, 12_550_000));

配置

更高级的用法,包括设置自定义原生精度,可以通过构造一个SpinSleeper来实现。

// Create a new sleeper that trusts native thread::sleep with 100μs accuracy
let spin_sleeper = spin_sleep::SpinSleeper::new(100_000)
    .with_spin_strategy(spin_sleep::SpinStrategy::YieldThread);

// Sleep for 1.01255 seconds, this will:
//  - thread:sleep for 1.01245 seconds, i.e., 100μs less than the requested duration
//  - spin until total 1.01255 seconds have elapsed
spin_sleeper.sleep(Duration::new(1, 12_550_000));

休眠也可以以f64秒或u64纳秒请求(当与time crate一起使用时很有用)

spin_sleeper.sleep_s(1.01255);
spin_sleeper.sleep_ns(1_012_550_000);

操作系统特定的默认设置对于大多数情况已经足够。

let sleeper = SpinSleeper::default();

Windows精度

Windows(>= Windows 10,版本1803)将使用高分辨率的可等待定时器,类似于rust std >= 1.75中的sleep。

早期版本的Windows默认精度特别差(约15ms),spin_sleep将自动在Windows上选择最佳精度,通常实现约1-2ms的原生休眠精度。

最低支持的rust编译器

此crate使用最新稳定版rust维护。

依赖项

~0–8MB
~58K SLoC