|  | #![feature(test)] | 
|  |  | 
|  | extern crate test; | 
|  |  | 
|  | use crossbeam_epoch::{self as epoch, Owned}; | 
|  | use crossbeam_utils::thread::scope; | 
|  | use test::Bencher; | 
|  |  | 
|  | #[bench] | 
|  | fn single_alloc_defer_free(b: &mut Bencher) { | 
|  | b.iter(|| { | 
|  | let guard = &epoch::pin(); | 
|  | let p = Owned::new(1).into_shared(guard); | 
|  | unsafe { | 
|  | guard.defer_destroy(p); | 
|  | } | 
|  | }); | 
|  | } | 
|  |  | 
|  | #[bench] | 
|  | fn single_defer(b: &mut Bencher) { | 
|  | b.iter(|| { | 
|  | let guard = &epoch::pin(); | 
|  | guard.defer(move || ()); | 
|  | }); | 
|  | } | 
|  |  | 
|  | #[bench] | 
|  | fn multi_alloc_defer_free(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(); | 
|  | let p = Owned::new(1).into_shared(guard); | 
|  | unsafe { | 
|  | guard.defer_destroy(p); | 
|  | } | 
|  | } | 
|  | }); | 
|  | } | 
|  | }) | 
|  | .unwrap(); | 
|  | }); | 
|  | } | 
|  |  | 
|  | #[bench] | 
|  | fn multi_defer(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.defer(move || ()); | 
|  | } | 
|  | }); | 
|  | } | 
|  | }) | 
|  | .unwrap(); | 
|  | }); | 
|  | } |