#![feature(test)] | |
extern crate test; | |
use std::sync::Barrier; | |
use crossbeam_epoch as epoch; | |
use crossbeam_utils::thread::scope; | |
use test::Bencher; | |
#[bench] | |
fn single_flush(b: &mut Bencher) { | |
const THREADS: usize = 16; | |
let start = Barrier::new(THREADS + 1); | |
let end = Barrier::new(THREADS + 1); | |
scope(|s| { | |
for _ in 0..THREADS { | |
s.spawn(|_| { | |
epoch::pin(); | |
start.wait(); | |
end.wait(); | |
}); | |
} | |
start.wait(); | |
b.iter(|| epoch::pin().flush()); | |
end.wait(); | |
}) | |
.unwrap(); | |
} | |
#[bench] | |
fn multi_flush(b: &mut Bencher) { | |
const THREADS: usize = 16; | |
const STEPS: usize = 10_000; | |
b.iter(|| { | |
scope(|s| { | |
for _ in 0..THREADS { | |
s.spawn(|_| { | |
for _ in 0..STEPS { | |
let guard = &epoch::pin(); | |
guard.flush(); | |
} | |
}); | |
} | |
}) | |
.unwrap(); | |
}); | |
} |