#![cfg(all(feature = "alloc-core", feature = "alloc-xthread"))]
#![allow(
clippy::cast_possible_truncation,
clippy::needless_pass_by_value,
clippy::semicolon_if_nothing_returned
)]
use std::alloc::Layout;
use std::hint::black_box;
use std::time::Duration;
use criterion::{criterion_group, criterion_main, Criterion};
use sefer_alloc::AllocCore;
const BATCH: usize = 256;
const BLOCK_SIZE: usize = 64;
fn bench_ring_push_drain(c: &mut Criterion) {
let mut group = c.benchmark_group("heap_xthread_ring");
group.sample_size(10);
group.warm_up_time(Duration::from_secs(1));
group.measurement_time(Duration::from_secs(3));
let layout = Layout::from_size_align(BLOCK_SIZE, 8).unwrap();
group.bench_function("push_drain_256", |b| {
let mut core = AllocCore::new().unwrap();
let mut ptrs: [*mut u8; BATCH] = [core::ptr::null_mut(); BATCH];
for slot in ptrs.iter_mut() {
let p = core.alloc(layout);
assert!(!p.is_null(), "pre-alloc OOM");
*slot = p;
}
b.iter(|| {
let mut pushed = 0usize;
for &ptr in &ptrs {
if core.dbg_push_to_ring(ptr, 0) {
pushed += 1;
}
}
black_box(pushed);
core.dbg_drain_all_rings();
black_box(&core);
});
});
group.bench_function("alloc_push_drain_256", |b| {
let mut core = AllocCore::new().unwrap();
let layout64 = Layout::from_size_align(64, 8).unwrap();
b.iter(|| {
let mut ptrs: [*mut u8; BATCH] = [core::ptr::null_mut(); BATCH];
for slot in ptrs.iter_mut() {
*slot = core.alloc(layout64);
}
black_box(&ptrs);
let mut pushed = 0usize;
for &ptr in &ptrs {
if !ptr.is_null() && core.dbg_push_to_ring(ptr, 0) {
pushed += 1;
}
}
black_box(pushed);
core.dbg_drain_all_rings();
black_box(&core);
});
});
group.finish();
}
criterion_group!(benches, bench_ring_push_drain);
criterion_main!(benches);