#计时器 # #超时 #哈希 #底层 #分层 #事件

hierarchical_hash_wheel_timer

使用具有溢出的分层四级哈希轮的低级计时器实现

3 个稳定版本

1.2.0 2023 年 2 月 12 日
1.1.0 2021 年 7 月 27 日
1.0.0 2020 年 4 月 23 日

#533算法

Download history 210/week @ 2024-03-11 180/week @ 2024-03-18 197/week @ 2024-03-25 262/week @ 2024-04-01 177/week @ 2024-04-08 177/week @ 2024-04-15 189/week @ 2024-04-22 165/week @ 2024-04-29 60/week @ 2024-05-06 63/week @ 2024-05-13 73/week @ 2024-05-20 57/week @ 2024-05-27 86/week @ 2024-06-03 102/week @ 2024-06-10 36/week @ 2024-06-17 41/week @ 2024-06-24

272 每月下载量
3 仓库中使用 (直接使用 2 个)

MIT 许可证

110KB
2K SLoC

哈希轮计时器

使用具有溢出的分层四级哈希轮的低级计时器实现

License Cargo Documentation Build Status

提供的 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