Added benchmarks for timer code
This commit is contained in:
@@ -1 +1,4 @@
|
|||||||
mod timer;
|
mod peer;
|
||||||
|
mod timer;
|
||||||
|
|
||||||
|
pub use timer::{Timer, Runner};
|
||||||
8
src/timers/peer.rs
Normal file
8
src/timers/peer.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
use super::timer::Timer;
|
||||||
|
|
||||||
|
struct PeerTimers {
|
||||||
|
pub send_keepalive: Timer,
|
||||||
|
pub new_handshake: Timer,
|
||||||
|
pub zero_key_material: Timer,
|
||||||
|
pub persistent_keepalive: Timer,
|
||||||
|
}
|
||||||
@@ -8,6 +8,8 @@ use std::thread;
|
|||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use std::u64;
|
use std::u64;
|
||||||
|
|
||||||
|
extern crate test;
|
||||||
|
|
||||||
type TimerID = u64;
|
type TimerID = u64;
|
||||||
type TimerKey = (u64, usize);
|
type TimerKey = (u64, usize);
|
||||||
type Callback = (Arc<AtomicBool>, Box<dyn Fn() -> () + Send + 'static>);
|
type Callback = (Arc<AtomicBool>, Box<dyn Fn() -> () + Send + 'static>);
|
||||||
@@ -29,10 +31,10 @@ pub struct Timer {
|
|||||||
cnt: AtomicUsize,
|
cnt: AtomicUsize,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Runner(Arc<RunnerInner>, Option<thread::JoinHandle<()>>);
|
pub struct Runner(Arc<RunnerInner>, Option<thread::JoinHandle<()>>);
|
||||||
|
|
||||||
impl Runner {
|
impl Runner {
|
||||||
fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let inner = Arc::new(RunnerInner {
|
let inner = Arc::new(RunnerInner {
|
||||||
running: AtomicBool::new(true),
|
running: AtomicBool::new(true),
|
||||||
callback: spin::Mutex::new(HashMap::new()),
|
callback: spin::Mutex::new(HashMap::new()),
|
||||||
@@ -50,12 +52,12 @@ impl Runner {
|
|||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let mut next = Instant::now() + ACCURACY;
|
let mut next = Instant::now() + ACCURACY;
|
||||||
while inner.running.load(Ordering::Acquire) {
|
while inner.running.load(Ordering::Acquire) {
|
||||||
// sleep
|
// sleep for 1 tick
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
if next > now {
|
if next > now {
|
||||||
thread::sleep(next - now);
|
thread::sleep(next - now);
|
||||||
}
|
}
|
||||||
next = next + ACCURACY;
|
next = now + ACCURACY;
|
||||||
|
|
||||||
// extract expired events
|
// extract expired events
|
||||||
let expired = inner.wheel.lock().expire();
|
let expired = inner.wheel.lock().expire();
|
||||||
@@ -137,10 +139,35 @@ impl Timer {
|
|||||||
|
|
||||||
impl Drop for Runner {
|
impl Drop for Runner {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
// stop the callback thread
|
|
||||||
self.0.running.store(false, Ordering::SeqCst);
|
self.0.running.store(false, Ordering::SeqCst);
|
||||||
if let Some(handle) = mem::replace(&mut self.1, None) {
|
if let Some(handle) = mem::replace(&mut self.1, None) {
|
||||||
handle.join().unwrap();
|
handle.join().unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for Timer {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use test::Bencher;
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_reset(b: &mut Bencher) {
|
||||||
|
let runner = Runner::new();
|
||||||
|
let timer = runner.timer(Box::new(|| {}));
|
||||||
|
b.iter(|| timer.reset(Duration::from_millis(1000)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn bench_start(b: &mut Bencher) {
|
||||||
|
let runner = Runner::new();
|
||||||
|
let timer = runner.timer(Box::new(|| {}));
|
||||||
|
b.iter(|| timer.start(Duration::from_millis(1000)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user