GeezerVison is showing docs.rs — TimerWheel in algorithm - Rust pub struct TimerWheel<T: Timer> { /* private fields */ }
Expand description计时器轮,模拟时钟格式组成的高效计时器
时间轮是一个环形的数据结构,可以想象成一个时钟的面,被分成多个格子
每个格子代表一段时间,这段时间越短,定时器的精度就越高。
每个格子用一个Vec存储放在该格子上的延时任务。
Mark: 在Rust中双向链表中暂未提供元素关键列表的接口,这里改用Vec,删除时会额外移动Vec值
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.append_timer_wheel(60, "MinuteWheel");
timer.append_timer_wheel(12, "HourWheel");
timer.add_timer(30);
assert_eq!(timer.get_delay_id(), 30);
timer.add_timer(149);
assert_eq!(timer.get_delay_id(), 30);
let t = timer.add_timer(600);
assert_eq!(timer.get_delay_id(), 30);
timer.add_timer(1);
assert_eq!(timer.get_delay_id(), 1);
timer.del_timer(t);
timer.add_timer(150);
assert_eq!(timer.get_delay_id(), 1);
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![1, 30]);
timer.add_timer(2);
let val = timer.update_deltatime(119).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![2, 149]);
let val = timer.update_deltatime(1).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![150]);
assert!(timer.is_empty());
}
Implementations§
创建一个计时器轮
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::<u64>::new();
assert!(timer.is_empty());
}
获取计时器轮的长度
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::<u64>::new();
timer.append_timer_wheel(60, "SecondWheel");
assert!(timer.is_empty());
timer.add_timer(1);
assert_eq!(timer.len(), 1);
let t = timer.add_timer(2);
assert_eq!(timer.len(), 2);
timer.del_timer(t);
assert_eq!(timer.len(), 1);
}
是否为空
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::<u64>::new();
assert!(timer.is_empty());
}
清除所有的槽位
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::<u64>::new();
timer.append_timer_wheel(60, "SecondWheel");
assert!(timer.is_empty());
timer.add_timer(1);
timer.add_timer(2);
assert_eq!(timer.len(), 2);
timer.clear();
assert_eq!(timer.len(), 0);
}
添加计时器轮, 设置槽位和精度值, 名字用来辅助
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.append_timer_wheel(60, "MinuteWheel");
timer.append_timer_wheel(12, "HourWheel");
timer.add_timer(30);
}
计时器轮的递进时间
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val, vec![(1, 30)]);
}
计时器轮的递进时间
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val, vec![(1, 30)]);
}
计时器轮的递进时间
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
let mut idx = 0;
timer.update_deltatime_with_callback(30, &mut |_, id, v| {
idx = v;
None
});
assert_eq!(idx, 30);
}
计时器轮的递进时间
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
let mut idx = 0;
timer.update_deltatime_with_callback(30, &mut |_, _, v| {
idx = v;
None
});
assert_eq!(idx, 30);
}
计算下一个delay_id, 根据容器的密度稀疏有关
密度高的基本为O(1)的复杂度, 最差情况为O(n)的复杂度
总刻度数以时钟为计秒轮遍历60次,分轮遍历60次,时轮遍历12次,即最高遍历132次
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
assert_eq!(timer.get_delay_id(), 30);
}
删除指定的定时器,时间复杂度为O(n),
该模型删除不具备优势,需要频繁删除请选用其它时间框架
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
let t = timer.add_timer(30);
timer.del_timer(t);
assert_eq!(timer.len(), 0);
}
获取指定的定时器,时间复杂度为O(n)
该模型获取不具备优势,需要频繁获取请选用其它时间框架
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
let t = timer.add_timer(30);
assert_eq!(timer.get_timer(&t), Some(&30));
}
获取指定的定时器,时间复杂度为O(n)
该模型获取不具备优势,需要频繁获取请选用其它时间框架
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
let t = timer.add_timer(30);
*timer.get_mut_timer(&t).unwrap() = 33;
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val, vec![(1, 33)]);
}
添加定时器元素, 时间复杂度为O(1)
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
}
获取下一个延时
§Examples
use algorithm::TimerWheel;
fn main() {
let mut timer = TimerWheel::new();
timer.append_timer_wheel(60, "SecondWheel");
timer.add_timer(30);
assert_eq!(timer.get_delay_id(), 30);
}
Trait Implementations§
Formats the value using the given formatter. Read more
Executes the destructor for this type. Read more
🔬This is a nightly-only experimental API. (pin_ergonomics) Execute the destructor for this type, but different to Drop::drop, it requires self
to be pinned. Read moreAuto Trait Implementations§Blanket Implementations§
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Returns the argument unchanged.
Calls U::from(self).
That is, this conversion is whatever the implementation of
From<T> for U chooses to do.
Converts the given value to a String. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion. |