From 3928c6c8dd065283cd53b9729bf8845d1747ba7a Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 29 Nov 2023 16:53:24 -0500 Subject: [PATCH] cli: Tweak default thread count logic --- CHANGELOG.md | 8 +++++--- src/cli.rs | 26 ++++++++------------------ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32667aad8..31ca18fe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,15 +5,17 @@ - Breaking: `.git/` is now ignored by default when using `--hidden` / `-H`, use `--no-ignore` / `-I` or `--no-ignore-vcs` to override, see #1387 and #1396 (@skoriop) - ## Bugfixes - Fix `NO_COLOR` support, see #1421 (@acuteenvy) ## Changes -- The default number of threads is now constrained to be at most 16. This should improve startup time on - systems with many CPU cores. (#1203) +- Performance has been significantly improved, both due to optimizations in the underlying `ignore` + crate (#1429), and in `fd` itself (#1422). + +- The default number of threads is now constrained to be at most 64. This should improve startup time on + systems with many CPU cores. (#1203, #1412, #1431) ## Other diff --git a/src/cli.rs b/src/cli.rs index 1b0228835..3bd8d8403 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -715,24 +715,14 @@ impl Opts { fn default_num_threads() -> NonZeroUsize { // If we can't get the amount of parallelism for some reason, then // default to a single thread, because that is safe. - // Note that the minimum value for a NonZeroUsize is 1. - // Unfortunately, we can't do `NonZeroUsize::new(1).unwrap()` - // in a const context. - const FALLBACK_PARALLELISM: NonZeroUsize = NonZeroUsize::MIN; - // As the number of threads increases, the startup time suffers from - // initializing the threads, and we get diminishing returns from additional - // parallelism. So set a maximum number of threads to use by default. - // - // This value is based on some empirical observations, but the ideal value - // probably depends on the exact hardware in use. - // - // Safety: The literal "20" is known not to be zero. - const MAX_DEFAULT_THREADS: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(20) }; - - std::cmp::min( - std::thread::available_parallelism().unwrap_or(FALLBACK_PARALLELISM), - MAX_DEFAULT_THREADS, - ) + let fallback = NonZeroUsize::MIN; + // To limit startup overhead on massively parallel machines, don't use more + // than 64 threads. + let limit = NonZeroUsize::new(64).unwrap(); + + std::thread::available_parallelism() + .unwrap_or(fallback) + .min(limit) } #[derive(Copy, Clone, PartialEq, Eq, ValueEnum)]