| //! 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::<libc::stat>::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::<libc::stat>::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::<libc::stat>::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::<libc::timespec>::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); |