From f2b33bdac0ce0dd198f7236b61e05e202d2a358e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 7 Jan 2024 10:26:23 +0100 Subject: [PATCH] add new 'count' example to count as fast as possible --- examples/dc.rs | 35 +++++++++++++++++++++++++++++++++++ examples/shared/mod.rs | 14 ++++++++------ 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 examples/dc.rs diff --git a/examples/dc.rs b/examples/dc.rs new file mode 100644 index 0000000..c23e92d --- /dev/null +++ b/examples/dc.rs @@ -0,0 +1,35 @@ +//! Collect the amount of directories and files as fast as possible. +mod shared; + +use clap::Parser; +use jwalk::WalkDirGeneric; + +fn main() { + let args = shared::Args::parse(); + + let parallelism = args.parallelism(); + let threads = args.threads(); + let path = args.root.unwrap_or_else(|| ".".into()); + let (mut dirs, mut files, mut symlinks) = (0, 0, 0); + for dir_entry_result in WalkDirGeneric::<((), Option)>::new(&path) + .skip_hidden(false) + .parallelism(parallelism) + { + match dir_entry_result { + Ok(dir_entry) => { + if dir_entry.file_type.is_dir() { + dirs += 1; + } else if dir_entry.file_type.is_file() { + files += 1; + } else if dir_entry.file_type.is_symlink() { + symlinks += 1 + } + } + Err(error) => { + println!("Read dir_entry error: {}", error); + } + } + } + + println!("dirs: {dirs}, files: {files}, symlinks: {symlinks} (threads: {threads})"); +} diff --git a/examples/shared/mod.rs b/examples/shared/mod.rs index 53a66b3..c49ba02 100644 --- a/examples/shared/mod.rs +++ b/examples/shared/mod.rs @@ -12,18 +12,20 @@ pub struct Args { } impl Args { - pub fn parallelism(&self) -> Parallelism { - let threads = self - .threads + pub fn threads(&self) -> usize { + self.threads .unwrap_or_else(|| { - if cfg!(darwin) { + if cfg!(target_vendor = "apple") { NonZeroUsize::new(4).unwrap() } else { std::thread::available_parallelism().unwrap_or(NonZeroUsize::new(1).unwrap()) } }) - .get(); - match threads { + .get() + } + + pub fn parallelism(&self) -> Parallelism { + match self.threads() { 1 => Parallelism::Serial, n => Parallelism::RayonNewPool(n), }