pendulum 0.3.1

Hashed timer wheel with various runtimes
Documentation
#![feature(test)]

extern crate pendulum;
extern crate test;

#[cfg(test)]
mod benches {
    mod pendulum {
        use std::time::Duration;

        use pendulum::{Pendulum, HashedWheelBuilder};
        use test::Bencher;

        #[bench]
        fn bench_insert_single_one_second_timeout(b: &mut Bencher) {
            let mut wheel = HashedWheelBuilder::default()
                .build();

            b.iter(|| {
                let token = wheel.insert_timeout(Duration::new(1, 0), ()).unwrap();
                wheel.remove_timeout(token).unwrap();
            });
        }

        #[bench]
        fn bench_insert_million_one_second_timeouts(b: &mut Bencher) {
            let mut wheel = HashedWheelBuilder::default()
                .with_init_capacity(1_000_000)
                .build();

            b.iter(|| {
                for _ in 0..1_000_000 {
                    let token = wheel.insert_timeout(Duration::new(1, 0), ()).unwrap();
                    wheel.remove_timeout(token).unwrap();
                }
            });
        }

        #[bench]
        fn bench_expire_million_one_second_timeouts(b: &mut Bencher) {
            let mut wheel = HashedWheelBuilder::default()
                .with_tick_duration(Duration::from_millis(100))
                .with_num_slots(11)
                .with_init_capacity(1_000_000)
                .with_max_capacity(1_000_000)
                .build();

            for _ in 0..1_000_000 {
                wheel.insert_timeout(Duration::new(1, 0), ()).unwrap();
            }

            for _ in 0..11 {
                wheel.tick();
            }

            let mut timers_expired = 0;
            b.iter(|| {
                while timers_expired < 1_000_000 {
                    if wheel.expired_timeout().is_some() {
                        timers_expired += 1;
                    }
                }
            });
        }
    }
}