diff options
Diffstat (limited to 'benches/sync_semaphore.rs')
-rw-r--r-- | benches/sync_semaphore.rs | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/benches/sync_semaphore.rs b/benches/sync_semaphore.rs new file mode 100644 index 00000000..c43311c0 --- /dev/null +++ b/benches/sync_semaphore.rs @@ -0,0 +1,130 @@ +use bencher::Bencher; +use std::sync::Arc; +use tokio::{sync::Semaphore, task}; + +fn uncontended(b: &mut Bencher) { + let mut rt = tokio::runtime::Builder::new() + .core_threads(6) + .threaded_scheduler() + .build() + .unwrap(); + + let s = Arc::new(Semaphore::new(10)); + b.iter(|| { + let s = s.clone(); + rt.block_on(async move { + for _ in 0..6 { + let permit = s.acquire().await; + drop(permit); + } + }) + }); +} + +async fn task(s: Arc<Semaphore>) { + let permit = s.acquire().await; + drop(permit); +} + +fn uncontended_concurrent_multi(b: &mut Bencher) { + let mut rt = tokio::runtime::Builder::new() + .core_threads(6) + .threaded_scheduler() + .build() + .unwrap(); + + let s = Arc::new(Semaphore::new(10)); + b.iter(|| { + let s = s.clone(); + rt.block_on(async move { + let j = tokio::try_join! { + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())) + }; + j.unwrap(); + }) + }); +} + +fn uncontended_concurrent_single(b: &mut Bencher) { + let mut rt = tokio::runtime::Builder::new() + .basic_scheduler() + .build() + .unwrap(); + + let s = Arc::new(Semaphore::new(10)); + b.iter(|| { + let s = s.clone(); + rt.block_on(async move { + tokio::join! { + task(s.clone()), + task(s.clone()), + task(s.clone()), + task(s.clone()), + task(s.clone()), + task(s.clone()) + }; + }) + }); +} + +fn contended_concurrent_multi(b: &mut Bencher) { + let mut rt = tokio::runtime::Builder::new() + .core_threads(6) + .threaded_scheduler() + .build() + .unwrap(); + + let s = Arc::new(Semaphore::new(5)); + b.iter(|| { + let s = s.clone(); + rt.block_on(async move { + let j = tokio::try_join! { + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())), + task::spawn(task(s.clone())) + }; + j.unwrap(); + }) + }); +} + +fn contended_concurrent_single(b: &mut Bencher) { + let mut rt = tokio::runtime::Builder::new() + .basic_scheduler() + .build() + .unwrap(); + + let s = Arc::new(Semaphore::new(5)); + b.iter(|| { + let s = s.clone(); + rt.block_on(async move { + tokio::join! { + task(s.clone()), + task(s.clone()), + task(s.clone()), + task(s.clone()), + task(s.clone()), + task(s.clone()) + }; + }) + }); +} + +bencher::benchmark_group!( + sync_semaphore, + uncontended, + uncontended_concurrent_multi, + uncontended_concurrent_single, + contended_concurrent_multi, + contended_concurrent_single +); + +bencher::benchmark_main!(sync_semaphore); |