use std::hint::black_box;
use bench_scale_tool::Harness;
#[path = "../tests/common/mod.rs"]
mod common;
use common::{
HUGE_THRESHOLD, JUMP_A, JUMP_B, JUMP_DENSE, JUMP_MULTI, JUMP_NONE, SEFER_L, SEFER_MAX,
SEFER_MIN_BLOCK, SEFER_N, SEFER_SC,
};
#[inline]
fn step_by_step_walk(size: usize, align: usize) -> Option<usize> {
const SHIFT: u32 = SEFER_MIN_BLOCK.trailing_zeros();
let need = if size > align { size } else { align };
let seed_idx = (need - 1) >> SHIFT;
if seed_idx >= SEFER_L - 1 {
return None;
}
let seed = SEFER_SC.size2class()[seed_idx] as usize;
if align <= (1usize << SHIFT) {
return Some(seed);
}
let table = SEFER_SC.table();
let mut i = seed;
while i < SEFER_N {
let block = table[i];
if block & (align - 1) == 0 {
return Some(i);
}
i += 1;
}
None
}
fn main() {
let mut h = Harness::new("size_classes_bench", env!("CARGO_MANIFEST_DIR"));
h.bench("class_for/small_hit", || {
let result = black_box(SEFER_SC.class_for(black_box(32), black_box(1)));
black_box(result);
});
h.bench("try_class_for/small_hit", || {
let result = black_box(SEFER_SC.try_class_for(black_box(32), black_box(1)));
let _ = black_box(result);
});
h.bench("try_class_for/invalid_align_reject", || {
let result = black_box(SEFER_SC.try_class_for(black_box(32), black_box(0)));
let _ = black_box(result);
});
h.bench("class_for/at_min_block_align_fast", || {
let result = black_box(SEFER_SC.class_for(black_box(32), black_box(16)));
black_box(result);
});
h.bench("class_for/one_past_min_block_align_slow", || {
let result = black_box(SEFER_SC.class_for(black_box(32), black_box(32)));
black_box(result);
});
h.bench("class_for/large_align_slow_path", || {
let result = black_box(SEFER_SC.class_for(black_box(JUMP_A.0), black_box(JUMP_A.1)));
black_box(result);
});
h.bench("class_for/large_align_slow_path_1024", || {
let result = black_box(SEFER_SC.class_for(black_box(JUMP_B.0), black_box(JUMP_B.1)));
black_box(result);
});
h.bench("class_for/jump_vs_walk_none_jump", || {
let result = black_box(SEFER_SC.class_for(black_box(JUMP_NONE.0), black_box(JUMP_NONE.1)));
black_box(result);
});
h.bench("class_for/jump_vs_walk_none_walk", || {
let result = black_box(step_by_step_walk(
black_box(JUMP_NONE.0),
black_box(JUMP_NONE.1),
));
black_box(result);
});
h.bench("class_for/multi_jump", || {
let result =
black_box(SEFER_SC.class_for(black_box(JUMP_MULTI.0), black_box(JUMP_MULTI.1)));
black_box(result);
});
h.bench("class_for/slow_path_none", || {
let result = black_box(SEFER_SC.class_for(black_box(JUMP_NONE.0), black_box(JUMP_NONE.1)));
black_box(result);
});
h.bench("class_for/dense_align_slow_path", || {
let result =
black_box(SEFER_SC.class_for(black_box(JUMP_DENSE.0), black_box(JUMP_DENSE.1)));
black_box(result);
});
h.bench("class_for/near_small_max_below", || {
let result =
black_box(SEFER_SC.class_for(black_box(SEFER_MAX - SEFER_MIN_BLOCK), black_box(1)));
black_box(result);
});
h.bench("class_for/near_small_max_at", || {
let result = black_box(SEFER_SC.class_for(black_box(SEFER_MAX), black_box(1)));
black_box(result);
});
h.bench("class_for/above_small_max_rejection", || {
let result = black_box(SEFER_SC.class_for(black_box(SEFER_MAX + 1), black_box(1)));
black_box(result);
});
h.bench("is_huge/near_huge_threshold", || {
let result = black_box(SEFER_SC.is_huge(black_box(HUGE_THRESHOLD)));
black_box(result);
});
h.run();
}