use std::time::Duration; use calloop::timer::TimeoutAction; use criterion::{criterion_group, criterion_main, Criterion}; fn single(c: &mut Criterion) { let mut event_loop = calloop::EventLoop::<()>::try_new().unwrap(); let loop_handle = event_loop.handle(); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10)); let mut timeout_token = loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); c.bench_function("extend_single", |b| { b.iter(|| { loop_handle.remove(timeout_token); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10)); timeout_token = loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); event_loop.dispatch(Some(Duration::ZERO), &mut ()).unwrap(); }); }); } fn mixed(c: &mut Criterion) { let mut event_loop = calloop::EventLoop::<()>::try_new().unwrap(); let loop_handle = event_loop.handle(); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10 - 1)); loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10)); let mut timeout_token = loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(90 * 10)); loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); c.bench_function("extend_mixed", |b| { b.iter(|| { loop_handle.remove(timeout_token); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10)); timeout_token = loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); event_loop.dispatch(Some(Duration::ZERO), &mut ()).unwrap(); }); }); } fn mixed_multiple(c: &mut Criterion) { let mut event_loop = calloop::EventLoop::<()>::try_new().unwrap(); let loop_handle = event_loop.handle(); for _ in 0..1000 { let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10 - 1)); loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); } let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10)); let mut timeout_token = loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); for _ in 0..1000 { let timer = calloop::timer::Timer::from_duration(Duration::from_secs(90 * 10)); loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); } c.bench_function("extend_mixed_many", |b| { b.iter(|| { loop_handle.remove(timeout_token); let timer = calloop::timer::Timer::from_duration(Duration::from_secs(60 * 10)); timeout_token = loop_handle .insert_source(timer, |_, _, _| TimeoutAction::Drop) .unwrap(); event_loop.dispatch(Some(Duration::ZERO), &mut ()).unwrap(); }); }); } criterion_group!(benches, single, mixed, mixed_multiple); criterion_main!(benches);