Skip to content

Commit

Permalink
reduce the recursion to its core, keep no state
Browse files Browse the repository at this point in the history
  • Loading branch information
Byron committed Jun 1, 2021
1 parent a6afcfe commit 247cf38
Showing 1 changed file with 39 additions and 54 deletions.
93 changes: 39 additions & 54 deletions benches/walk_benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,74 +32,59 @@ fn checkout_linux_if_needed() {
}
}

#[derive(Default)]
struct FsTree {
children: Vec<FsTree>,
metadata: Option<std::fs::Metadata>,
}
fn recursive_descent(
root: impl AsRef<Path>,
file_type: Option<std::fs::FileType>,
get_file_metadata: bool,
) {
let root = root.as_ref();
let (_metadata, is_dir) = file_type
.map(|ft| {
(
if !ft.is_dir() && get_file_metadata {
std::fs::symlink_metadata(root).ok()
} else {
None
},
ft.is_dir(),
)
})
.or_else(|| {
std::fs::symlink_metadata(root)
.map(|m| {
let is_dir = m.file_type().is_dir();
(Some(m), is_dir)
})
.ok()
})
.unwrap_or((None, false));

impl FsTree {
fn recursive_descent(
root: impl AsRef<Path>,
file_type: Option<std::fs::FileType>,
get_file_metadata: bool,
) -> Self {
let root = root.as_ref();
let (metadata, is_dir) = file_type
.map(|ft| {
(
if !ft.is_dir() && get_file_metadata {
std::fs::symlink_metadata(root).ok()
} else {
None
},
ft.is_dir(),
)
})
.or_else(|| {
std::fs::symlink_metadata(root)
.map(|m| {
let is_dir = m.file_type().is_dir();
(Some(m), is_dir)
if is_dir {
std::fs::read_dir(root)
.map(|iter| {
iter.filter_map(Result::ok)
.collect::<Vec<_>>()
.into_par_iter()
.map(|entry| {
recursive_descent(entry.path(), entry.file_type().ok(), get_file_metadata)
})
.ok()
.for_each(|_| {})
})
.unwrap_or((None, false));

let children: Vec<_> = if is_dir {
std::fs::read_dir(root)
.map(|iter| {
iter.filter_map(Result::ok)
.collect::<Vec<_>>()
.into_par_iter()
.map(|entry| {
FsTree::recursive_descent(
entry.path(),
entry.file_type().ok(),
get_file_metadata,
)
})
.collect()
})
.unwrap_or_default()
} else {
Vec::new()
};
FsTree { children, metadata }
}
.unwrap_or_default()
};
}

fn walk_benches(c: &mut Criterion) {
checkout_linux_if_needed();

c.bench_function(
"simple recursive NO file metadata (unsorted, n threads)",
|b| b.iter(|| black_box(FsTree::recursive_descent(linux_dir(), None, false))),
|b| b.iter(|| black_box(recursive_descent(linux_dir(), None, false))),
);

c.bench_function(
"simple recursive WITH file metadata (unsorted, n threads)",
|b| b.iter(|| black_box(FsTree::recursive_descent(linux_dir(), None, true))),
|b| b.iter(|| black_box(recursive_descent(linux_dir(), None, true))),
);

c.bench_function("jwalk (unsorted, n threads)", |b| {
Expand Down

0 comments on commit 247cf38

Please sign in to comment.