#![feature(test)] extern crate asyncio; extern crate test; use asyncio::IoContext; use test::Bencher; #[bench] fn bench_thrd01_1000(b: &mut Bencher) { let ctx = &IoContext::new().unwrap(); b.iter(|| { ctx.restart(); let _work = IoContext::work(ctx); fn repeat(ctx: &IoContext, count: usize) { if count > 0 { ctx.post(move |ctx| repeat(ctx, count-1)); } else { ctx.stop(); } } repeat(&ctx, 1000); ctx.run(); }) } #[bench] fn bench_thrd10_1000(b: &mut Bencher) { use std::thread; use std::sync::Arc; use std::sync::atomic::*; let ctx = &IoContext::new().unwrap(); b.iter(|| { let _work = IoContext::work(ctx); ctx.restart(); let count = Arc::new(AtomicIsize::new(1000)); let mut thrds = Vec::new(); for _ in 0..10 { let ctx = ctx.clone(); let count = count.clone(); thrds.push(thread::spawn(move || { fn repeat(ctx: &IoContext, count: Arc) { match count.fetch_sub(1, Ordering::SeqCst) { 1 => ctx.stop(), n if n > 1 => ctx.post(move|ctx| repeat(ctx, count)), _ => (), } } repeat(&ctx, count); ctx.run() })); } for thrd in thrds { thrd.join().unwrap(); } }); }