1/// Benchmarks for rustix. 2/// 3/// To enable these benchmarks, add `--cfg=criterion` to RUSTFLAGS and enable 4/// the "fs", "time", and "process" cargo features. 5 6#[cfg(any( 7 not(criterion), 8 not(feature = "fs"), 9 not(feature = "process"), 10 not(feature = "time"), 11 windows, 12 target_os = "emscripten", 13 target_os = "redox", 14 target_os = "wasi", 15))] 16fn main() { 17 unimplemented!() 18} 19 20#[cfg(not(any( 21 not(criterion), 22 not(feature = "fs"), 23 not(feature = "process"), 24 not(feature = "time"), 25 windows, 26 target_os = "emscripten", 27 target_os = "redox", 28 target_os = "wasi", 29)))] 30use criterion::{criterion_group, criterion_main}; 31 32#[cfg(not(any( 33 not(criterion), 34 not(feature = "fs"), 35 not(feature = "process"), 36 not(feature = "time"), 37 windows, 38 target_os = "emscripten", 39 target_os = "redox", 40 target_os = "wasi", 41)))] 42mod suite { 43 use criterion::Criterion; 44 45 pub(super) fn simple_statat(c: &mut Criterion) { 46 use rustix::fs::{cwd, statat, AtFlags}; 47 48 c.bench_function("simple statat", |b| { 49 b.iter(|| { 50 statat(cwd(), "/", AtFlags::empty()).unwrap(); 51 }) 52 }); 53 } 54 55 pub(super) fn simple_statat_libc(c: &mut Criterion) { 56 c.bench_function("simple statat libc", |b| { 57 b.iter(|| { 58 let mut s = std::mem::MaybeUninit::<libc::stat>::uninit(); 59 unsafe { 60 assert_eq!( 61 libc::fstatat( 62 libc::AT_FDCWD, 63 std::ffi::CString::new("/").unwrap().as_c_str().as_ptr() as _, 64 s.as_mut_ptr(), 65 0 66 ), 67 0 68 ); 69 } 70 }) 71 }); 72 } 73 74 pub(super) fn simple_statat_libc_cstr(c: &mut Criterion) { 75 c.bench_function("simple statat libc cstr", |b| { 76 b.iter(|| { 77 let mut s = std::mem::MaybeUninit::<libc::stat>::uninit(); 78 unsafe { 79 assert_eq!( 80 libc::fstatat( 81 libc::AT_FDCWD, 82 rustix::cstr!("/").as_ptr() as _, 83 s.as_mut_ptr(), 84 0 85 ), 86 0 87 ); 88 } 89 }) 90 }); 91 } 92 93 pub(super) fn simple_statat_cstr(c: &mut Criterion) { 94 use rustix::fs::{cwd, statat, AtFlags}; 95 96 c.bench_function("simple statat cstr", |b| { 97 b.iter(|| { 98 statat(cwd(), rustix::cstr!("/"), AtFlags::empty()).unwrap(); 99 }) 100 }); 101 } 102 103 #[cfg(not(target_os = "wasi"))] 104 pub(super) fn simple_clock_gettime(c: &mut Criterion) { 105 use rustix::time::{clock_gettime, ClockId}; 106 107 c.bench_function("simple clock_gettime", |b| { 108 b.iter(|| { 109 let _ = clock_gettime(ClockId::Monotonic); 110 }) 111 }); 112 } 113 114 #[cfg(not(target_os = "wasi"))] 115 pub(super) fn simple_clock_gettime_libc(c: &mut Criterion) { 116 c.bench_function("simple clock_gettime libc", |b| { 117 b.iter(|| { 118 let mut s = std::mem::MaybeUninit::<libc::timespec>::uninit(); 119 unsafe { 120 assert_eq!( 121 libc::clock_gettime(libc::CLOCK_MONOTONIC, s.as_mut_ptr()), 122 0 123 ); 124 let _ = s.assume_init(); 125 } 126 }) 127 }); 128 } 129 130 #[cfg(not(target_os = "wasi"))] 131 pub(super) fn simple_getpid(c: &mut Criterion) { 132 use rustix::process::getpid; 133 134 c.bench_function("simple getpid", |b| { 135 b.iter(|| { 136 let _ = getpid(); 137 }) 138 }); 139 } 140 141 #[cfg(not(target_os = "wasi"))] 142 pub(super) fn simple_getpid_libc(c: &mut Criterion) { 143 c.bench_function("simple getpid libc", |b| { 144 b.iter(|| unsafe { 145 let _ = libc::getpid(); 146 }) 147 }); 148 } 149} 150 151#[cfg(not(any( 152 not(criterion), 153 not(feature = "fs"), 154 not(feature = "process"), 155 not(feature = "time"), 156 windows, 157 target_os = "emscripten", 158 target_os = "redox", 159 target_os = "wasi", 160)))] 161criterion_group!( 162 benches, 163 suite::simple_statat, 164 suite::simple_statat_libc, 165 suite::simple_statat_libc_cstr, 166 suite::simple_statat_cstr, 167 suite::simple_clock_gettime, 168 suite::simple_clock_gettime_libc, 169 suite::simple_getpid, 170 suite::simple_getpid_libc 171); 172#[cfg(not(any( 173 not(criterion), 174 not(feature = "fs"), 175 not(feature = "process"), 176 not(feature = "time"), 177 windows, 178 target_os = "emscripten", 179 target_os = "redox", 180 target_os = "wasi", 181)))] 182criterion_main!(benches); 183