use std::{
env,
fs::{self, File},
path::PathBuf,
time::SystemTime,
};
use brunch::{benches, Bench};
use nix::{errno::Errno, sys::stat::stat};
fn setup_tree(depth: usize) -> (PathBuf, PathBuf) {
let mut dir = env::temp_dir();
let unique = format!(
"syd_stat_bench_depth_{}_{}",
depth,
SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos()
);
dir.push(unique);
fs::create_dir_all(&dir).expect("Failed to create top-level directory");
let mut sub = dir.clone();
for d in 0..depth {
sub.push(d.to_string());
fs::create_dir_all(&sub).expect("Failed to create subdirectory");
}
sub.push("benchmark_file");
File::create(&sub).expect("Failed to create benchmark file");
let file_path = sub.clone();
sub.pop();
(dir, file_path)
}
fn bench_stat(file_path: &PathBuf) -> Result<(), Errno> {
stat(file_path).map(drop)
}
fn main() {
let depths = [1, 2, 10, 100];
let mut setups = Vec::new();
for &d in &depths {
let (dir, file) = setup_tree(d);
setups.push((d, dir, file));
}
benches!(
inline:
Bench::new("Stat depth=1").run(|| {
bench_stat(&setups[0].2).unwrap();
}),
Bench::new("Stat depth=2").run(|| {
bench_stat(&setups[1].2).unwrap();
}),
Bench::new("Stat depth=10").run(|| {
bench_stat(&setups[2].2).unwrap();
}),
Bench::new("Stat depth=100").run(|| {
bench_stat(&setups[3].2).unwrap();
}),
);
for (_, dir, _) in setups {
let _ = fs::remove_dir_all(dir);
}
}