use std::hint::black_box;
use criterion::{criterion_group, criterion_main, Criterion};
use subetha_pointers::k_tower_pointer::KTower2;
fn ktower_resolve(c: &mut Criterion) {
let regions: Vec<Vec<u64>> = (0..8).map(|r| {
(0..1024u64).map(|i| r * 1000 + i).collect()
}).collect();
let table: Vec<*const u8> = regions.iter()
.map(|r| r.as_ptr() as *const u8).collect();
let ptrs: Vec<KTower2<u64>> = (0..1024u32).map(|i| {
let region = i % 8;
let offset = (i / 8) * 8;
KTower2::new(region, offset)
}).collect();
let native: Vec<(u32, u32)> = ptrs.iter()
.map(|p| (p.region_id(), p.offset()))
.collect();
c.bench_function("hybrid.ktower/resolve_1024", |b| {
b.iter(|| {
let mut sum = 0u64;
for p in ptrs.iter() {
let r = unsafe { *p.resolve(black_box(&table)) };
sum = sum.wrapping_add(r);
}
black_box(sum)
});
});
c.bench_function("hybrid.ktower/native_struct_resolve_1024", |b| {
b.iter(|| {
let mut sum = 0u64;
for &(rid, off) in native.iter() {
let base = black_box(&table)[rid as usize];
let p = unsafe { base.add(off as usize) as *const u64 };
sum = sum.wrapping_add(unsafe { *p });
}
black_box(sum)
});
});
let direct: Vec<*const u64> = ptrs.iter().map(|p| {
unsafe { p.resolve(&table) }
}).collect();
c.bench_function("hybrid.ktower/direct_ptr_1024", |b| {
b.iter(|| {
let mut sum = 0u64;
for p in direct.iter() {
sum = sum.wrapping_add(unsafe { **p });
}
black_box(sum)
});
});
}
criterion_group!(benches, ktower_resolve);
criterion_main!(benches);