diff --git a/benches/spawn.rs b/benches/spawn.rs index 72a4035757a..7d4b8137354 100644 --- a/benches/spawn.rs +++ b/benches/spawn.rs @@ -2,63 +2,83 @@ //! This essentially measure the time to enqueue a task in the local and remote //! case. +#[macro_use] +extern crate bencher; + use bencher::{black_box, Bencher}; async fn work() -> usize { let val = 1 + 1; + tokio::task::yield_now().await; black_box(val) } -fn basic_scheduler_local_spawn(bench: &mut Bencher) { +fn basic_scheduler_spawn(bench: &mut Bencher) { let runtime = tokio::runtime::Builder::new_current_thread() .build() .unwrap(); - runtime.block_on(async { - bench.iter(|| { + bench.iter(|| { + runtime.block_on(async { let h = tokio::spawn(work()); - black_box(h); - }) + assert_eq!(h.await.unwrap(), 2); + }); }); } -fn threaded_scheduler_local_spawn(bench: &mut Bencher) { +fn basic_scheduler_spawn10(bench: &mut Bencher) { let runtime = tokio::runtime::Builder::new_current_thread() .build() .unwrap(); - runtime.block_on(async { - bench.iter(|| { - let h = tokio::spawn(work()); - black_box(h); - }) + bench.iter(|| { + runtime.block_on(async { + let mut handles = Vec::with_capacity(10); + for _ in 0..10 { + handles.push(tokio::spawn(work())); + } + for handle in handles { + assert_eq!(handle.await.unwrap(), 2); + } + }); }); } -fn basic_scheduler_remote_spawn(bench: &mut Bencher) { - let runtime = tokio::runtime::Builder::new_current_thread() +fn threaded_scheduler_spawn(bench: &mut Bencher) { + let runtime = tokio::runtime::Builder::new_multi_thread() + .worker_threads(1) .build() .unwrap(); - bench.iter(|| { - let h = runtime.spawn(work()); - black_box(h); + runtime.block_on(async { + let h = tokio::spawn(work()); + assert_eq!(h.await.unwrap(), 2); + }); }); } -fn threaded_scheduler_remote_spawn(bench: &mut Bencher) { - let runtime = tokio::runtime::Builder::new_multi_thread().build().unwrap(); - +fn threaded_scheduler_spawn10(bench: &mut Bencher) { + let runtime = tokio::runtime::Builder::new_multi_thread() + .worker_threads(1) + .build() + .unwrap(); bench.iter(|| { - let h = runtime.spawn(work()); - black_box(h); + runtime.block_on(async { + let mut handles = Vec::with_capacity(10); + for _ in 0..10 { + handles.push(tokio::spawn(work())); + } + for handle in handles { + assert_eq!(handle.await.unwrap(), 2); + } + }); }); } bencher::benchmark_group!( spawn, - basic_scheduler_local_spawn, - threaded_scheduler_local_spawn, - basic_scheduler_remote_spawn, - threaded_scheduler_remote_spawn + basic_scheduler_spawn, + basic_scheduler_spawn10, + threaded_scheduler_spawn, + threaded_scheduler_spawn10, ); bencher::benchmark_main!(spawn);