summaryrefslogtreecommitdiffstats
path: root/benches/sync_semaphore.rs
diff options
context:
space:
mode:
Diffstat (limited to 'benches/sync_semaphore.rs')
-rw-r--r--benches/sync_semaphore.rs130
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);