3 个稳定版本
1.2.0 | 2023 年 2 月 12 日 |
---|---|
1.1.0 | 2021 年 7 月 27 日 |
1.0.0 | 2020 年 4 月 23 日 |
#533 在 算法
272 每月下载量
在 3 个 仓库中使用 (直接使用 2 个)
110KB
2K SLoC
哈希轮计时器
使用具有溢出的分层四级哈希轮的低级计时器实现
提供的 API
此 crate 提供了基于分层哈希轮的低级事件计时器实现。
crate 中的 API 提供了三个不同抽象级别的接口,以下从低到高列出。
1 – 单个轮
此 crate 的基本抽象是一个具有 256 个槽位的单个哈希轮,每个槽位使用一个字节进行寻址。每个槽位存储一个泛型事件类型的列表。整个轮可以“滴答”,导致正在移动的槽位中的条目过期。每次滴答时,都会返回所有过期的事件条目以进行处理。
2 – 分层轮
通过组合四个字节轮,我们得到一个分层计时器,可以表示未来 std::u32::MAX
时间单位。为了支持高达 std::u64::MAX
时间单位的超时,我们的实现还包含一个溢出列表,用于存储所有不适合四个轮中的任何一个槽位的计时器。
此 crate 提供了四种层级轮结构的两种变体实现。
wheels::quad_wheel::QuadWheelWithOverflow
直接对应于上述描述的实现。wheels::cancellable::QuadWheelWithOverflow
还支持在定时器到期之前取消挂起的定时器。然而,为了实现这一点,它需要泛型定时器条目类型提供一个唯一的标识符字段。它还使用std::rc::Rc
在内部以避免重复存储实际条目,这使得它(可能)不适合定时器需要在线程之间移动的情况。
3 – 高级API
该crate还提供了两个高级API,可以直接使用,也可以被视为如何在应用程序中使用低级API的示例。
这两个高级API除了支持一次性安排和过期后丢弃的正常定时器外,还提供了周期性重复定时器的内置支持。
模拟定时器
simulation
模块提供了一个用于驱动离散事件模拟的事件定时器实现。它的特点是它可以在没有安排事件的时期快速跳过,因为它不跟踪真实时间,而是提供模拟进程的速度。
线程定时器
thread_timer
模块提供了一个具有毫秒级精度的实时事件调度定时器。它在一个专用的线程上运行,并使用一个名为 TimerRef
的可共享句柄与其他线程进行通信。
文档
有关参考和示例,请参阅 API Docs。
性能
在我的 2019 年 16 英寸 MacBook Pro(2.3 GHz 8 核 Intel Core i9)上,第 2 级API每秒提供 800 万至 1100 万次写入(取决于定时器延迟的分布),并且可以以每秒 270 万条(如果它们分布在多个槽位中)或大约 1100 万条(如果它们聚集到单个槽位)的速度读取(或过期)定时器条目。
您可以通过检查源代码并调用 cargo bench
在自己的硬件上重复这些实验。
许可
根据MIT许可条款许可。
有关详细信息,请参阅 LICENSE。
依赖项
~145KB