From 423717aa1e564cc30caf74ab4fad1a0a8e5a8917 Mon Sep 17 00:00:00 2001 From: Ibraheem Ahmed Date: Tue, 7 Nov 2023 14:53:13 -0500 Subject: [PATCH 1/2] reduce backoff spinning/usage --- crossbeam-channel/src/context.rs | 15 --------------- crossbeam-utils/src/backoff.rs | 5 +++-- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/crossbeam-channel/src/context.rs b/crossbeam-channel/src/context.rs index 7467b802c..7037f8344 100644 --- a/crossbeam-channel/src/context.rs +++ b/crossbeam-channel/src/context.rs @@ -138,21 +138,6 @@ impl Context { /// If the deadline is reached, `Selected::Aborted` will be selected. #[inline] pub fn wait_until(&self, deadline: Option) -> Selected { - // Spin for a short time, waiting until an operation is selected. - let backoff = Backoff::new(); - loop { - let sel = Selected::from(self.inner.select.load(Ordering::Acquire)); - if sel != Selected::Waiting { - return sel; - } - - if backoff.is_completed() { - break; - } else { - backoff.snooze(); - } - } - loop { // Check whether an operation has been selected. let sel = Selected::from(self.inner.select.load(Ordering::Acquire)); diff --git a/crossbeam-utils/src/backoff.rs b/crossbeam-utils/src/backoff.rs index bd85dc607..fa25406b6 100644 --- a/crossbeam-utils/src/backoff.rs +++ b/crossbeam-utils/src/backoff.rs @@ -3,7 +3,8 @@ use core::cell::Cell; use core::fmt; const SPIN_LIMIT: u32 = 6; -const YIELD_LIMIT: u32 = 10; +const PRE_SNOOZE_SPIN_LIMIT: u32 = 3; +const YIELD_LIMIT: u32 = 6; /// Performs exponential backoff in spin loops. /// @@ -205,7 +206,7 @@ impl Backoff { /// [`AtomicBool`]: std::sync::atomic::AtomicBool #[inline] pub fn snooze(&self) { - if self.step.get() <= SPIN_LIMIT { + if self.step.get() <= PRE_SNOOZE_SPIN_LIMIT { for _ in 0..1 << self.step.get() { hint::spin_loop(); } From 252665d0e205aa9b0e88824acdb817b619e76ca9 Mon Sep 17 00:00:00 2001 From: Ibraheem Ahmed Date: Thu, 2 May 2024 01:14:33 -0400 Subject: [PATCH 2/2] change `SPIN_LIMIT` to 4 --- crossbeam-utils/src/backoff.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crossbeam-utils/src/backoff.rs b/crossbeam-utils/src/backoff.rs index fa25406b6..9b8b91757 100644 --- a/crossbeam-utils/src/backoff.rs +++ b/crossbeam-utils/src/backoff.rs @@ -2,8 +2,8 @@ use crate::primitive::hint; use core::cell::Cell; use core::fmt; -const SPIN_LIMIT: u32 = 6; -const PRE_SNOOZE_SPIN_LIMIT: u32 = 3; +// https://github.com/oneapi-src/oneTBB/blob/v2021.5.0/include/oneapi/tbb/detail/_utils.h#L46-L48 +const SPIN_LIMIT: u32 = 4; const YIELD_LIMIT: u32 = 6; /// Performs exponential backoff in spin loops. @@ -206,7 +206,7 @@ impl Backoff { /// [`AtomicBool`]: std::sync::atomic::AtomicBool #[inline] pub fn snooze(&self) { - if self.step.get() <= PRE_SNOOZE_SPIN_LIMIT { + if self.step.get() <= SPIN_LIMIT { for _ in 0..1 << self.step.get() { hint::spin_loop(); }