use std::env; use std::fs; use std::path::Path; #[cfg(target_family = "unix")] use std::os::unix::prelude::*; #[cfg(target_os = "wasi")] use std::os::wasi::prelude::*; use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; use realpath_ext::RealpathFlags; fn bench(c: &mut Criterion) { let exe = env::current_exe().unwrap(); let cwd = env::current_dir().unwrap(); let mut buf = [0; libc::PATH_MAX as usize]; let mut group = c.benchmark_group("realpath"); for (ident, path) in [ ("root", "/".as_ref()), ("dot", ".".as_ref()), ("2-parent", "../../".as_ref()), ("bin", "/bin".as_ref()), ("bin (dir)", "/bin/".as_ref()), ("passwd", "/etc/passwd".as_ref()), ("exe", exe.as_ref()), ("cwd", cwd.as_ref()), ] .iter() { let path = Path::as_os_str(*path); group.bench_with_input( BenchmarkId::new("realpath_ext::realpath_raw", ident), path, |b, i| { b.iter(|| { let n = realpath_ext::realpath_raw(i.as_bytes(), &mut buf, RealpathFlags::empty()) .unwrap(); black_box(&buf[..n]); }) }, ); #[cfg(feature = "std")] group.bench_with_input( BenchmarkId::new("realpath_ext::realpath", ident), path, |b, i| { b.iter(|| { let path = realpath_ext::realpath(i, RealpathFlags::empty()).unwrap(); black_box(path); }) }, ); group.bench_with_input(BenchmarkId::new("fs::canonicalize", ident), path, |b, i| { b.iter(|| { let path = fs::canonicalize(i).unwrap(); black_box(path); }) }); } group.finish(); } criterion_group!(benches, bench); criterion_main!(benches);