//! Benchmarks for rustix. //! //! To enable these benchmarks, add `--cfg=criterion` to RUSTFLAGS and enable //! the "fs", "time", and "process" cargo features. //! //! ```sh //! RUSTFLAGS=--cfg=criterion cargo bench --features=fs,time,process,stdio //! ``` #[cfg(any( not(criterion), not(feature = "fs"), not(feature = "process"), not(feature = "time"), not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", target_os = "wasi", ))] fn main() { unimplemented!( "Add --cfg=criterion to RUSTFLAGS and enable the \"fs\", \"time\", \"process\", and \"stdio\" cargo \ features." ) } #[cfg(not(any( not(criterion), not(feature = "fs"), not(feature = "process"), not(feature = "time"), not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", target_os = "wasi", )))] use criterion::{criterion_group, criterion_main}; #[cfg(not(any( not(criterion), not(feature = "fs"), not(feature = "process"), not(feature = "time"), not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", target_os = "wasi", )))] mod suite { use criterion::Criterion; pub(super) fn simple_statat(c: &mut Criterion) { use rustix::fs::{statat, AtFlags, CWD}; c.bench_function("simple statat", |b| { b.iter(|| { statat(CWD, "/", AtFlags::empty()).unwrap(); }) }); } pub(super) fn simple_statat_libc(c: &mut Criterion) { c.bench_function("simple statat libc", |b| { b.iter(|| { let mut s = std::mem::MaybeUninit::::uninit(); unsafe { assert_eq!( libc::fstatat( libc::AT_FDCWD, std::ffi::CString::new("/").unwrap().as_c_str().as_ptr() as _, s.as_mut_ptr(), 0 ), 0 ); } }) }); } pub(super) fn simple_statat_libc_cstr(c: &mut Criterion) { c.bench_function("simple statat libc cstr", |b| { b.iter(|| { let mut s = std::mem::MaybeUninit::::uninit(); unsafe { assert_eq!( libc::fstatat( libc::AT_FDCWD, rustix::cstr!("/").as_ptr() as _, s.as_mut_ptr(), 0 ), 0 ); } }) }); } pub(super) fn simple_statat_cstr(c: &mut Criterion) { use rustix::fs::{statat, AtFlags, CWD}; c.bench_function("simple statat cstr", |b| { b.iter(|| { statat(CWD, rustix::cstr!("/"), AtFlags::empty()).unwrap(); }) }); } pub(super) fn simple_fstat(c: &mut Criterion) { use rustix::fs::fstat; c.bench_function("simple fstat", |b| { b.iter(|| { fstat(rustix::stdio::stdin()).unwrap(); }) }); } pub(super) fn simple_fstat_libc(c: &mut Criterion) { c.bench_function("simple fstat libc", |b| { b.iter(|| { let mut s = std::mem::MaybeUninit::::uninit(); unsafe { assert_eq!(libc::fstat(libc::STDIN_FILENO, s.as_mut_ptr()), 0); } }) }); } #[cfg(not(target_os = "wasi"))] pub(super) fn simple_clock_gettime(c: &mut Criterion) { use rustix::time::{clock_gettime, ClockId}; c.bench_function("simple clock_gettime", |b| { b.iter(|| { let _ = clock_gettime(ClockId::Monotonic); }) }); } #[cfg(not(target_os = "wasi"))] pub(super) fn simple_clock_gettime_libc(c: &mut Criterion) { c.bench_function("simple clock_gettime libc", |b| { b.iter(|| { let mut s = std::mem::MaybeUninit::::uninit(); unsafe { assert_eq!( libc::clock_gettime(libc::CLOCK_MONOTONIC, s.as_mut_ptr()), 0 ); let _ = s.assume_init(); } }) }); } #[cfg(not(target_os = "wasi"))] pub(super) fn simple_getpid(c: &mut Criterion) { use rustix::process::getpid; c.bench_function("simple getpid", |b| { b.iter(|| { let _ = getpid(); }) }); } #[cfg(not(target_os = "wasi"))] pub(super) fn simple_getpid_libc(c: &mut Criterion) { c.bench_function("simple getpid libc", |b| { b.iter(|| unsafe { let _ = libc::getpid(); }) }); } } #[cfg(not(any( not(criterion), not(feature = "fs"), not(feature = "process"), not(feature = "time"), not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", target_os = "wasi", )))] criterion_group!( benches, suite::simple_statat, suite::simple_statat_libc, suite::simple_statat_libc_cstr, suite::simple_statat_cstr, suite::simple_fstat, suite::simple_fstat_libc, suite::simple_clock_gettime, suite::simple_clock_gettime_libc, suite::simple_getpid, suite::simple_getpid_libc ); #[cfg(not(any( not(criterion), not(feature = "fs"), not(feature = "process"), not(feature = "time"), not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", target_os = "wasi", )))] criterion_main!(benches);