xref: /third_party/rust/crates/rustix/benches/mod.rs (revision b8a62b91)
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