4 个版本 (2 个重大更新)
使用旧的 Rust 2015
0.3.0 | 2018年2月27日 |
---|---|
0.2.0 | 2017年12月10日 |
0.1.1 | 2017年12月2日 |
0.1.0 | 2017年11月25日 |
#3 在 #过期
每月425 次下载
在 tquic 中使用
16KB
301 代码行
使用二叉堆按过期时间对定时器进行排序的定时器系统。
lib.rs
:
一个基于二叉堆的定时器系统,具有快速删除功能。
定时器按过期时间存储在二叉堆中。为了防止 O(n) 的删除操作,键也存储在一个 active
映射中。定时器只有在存在于活动映射中时才是活动的。当删除定时器时,它仅从活动映射中删除。当调用 expire
时,只有当定时器的键存在于活动映射中时,才返回定时器的键。
为了区分具有相同键的多个添加操作,以便当键被删除并重新添加时,所有之前未过期的键不会变为活动状态(因为它们仍然在堆中),每个堆条目和活动条目都附加到一个单调递增的计数器。这确保只有真正活动的相同键版本可以被过期。
为了提供这种快速删除功能,在过期和 time_remaining 功能期间会有额外的 CPU 开销,用于 hashmap 查找。对于每个堆条目和活动映射值中维护的重复键和单调计数器,还有额外的内存使用。请注意,当添加和删除大量键时,如果这些键位于堆的前端并且已经过期,则过期可能会变得很长,因为需要扫描以获取有效的过期值。但是,这取决于使用场景,因为可能被取消的键将均匀地分布在堆中,并且我们只扫描到非过期时间,无论键是否活动。为用户做出的权衡是,他们是否希望在删除期间执行任何扫描,以在过期和 time_remaining 功能期间节省内存和 CPU。