use std::hint::black_box;
use criterion::{Criterion, criterion_group, criterion_main};
use ripvec_core::backend::{Encoding, RerankBackend};
struct StubRerank;
impl RerankBackend for StubRerank {
fn score_batch(&self, encodings: &[Encoding]) -> ripvec_core::Result<Vec<f32>> {
Ok(vec![0.5_f32; encodings.len()])
}
fn is_gpu(&self) -> bool {
false
}
}
fn make_encodings(batch_size: usize) -> Vec<Encoding> {
(0..batch_size)
.map(|_| Encoding {
input_ids: vec![101, 1000, 102],
attention_mask: vec![1, 1, 1],
token_type_ids: vec![0, 0, 0],
})
.collect()
}
fn bench_dispatch(c: &mut Criterion) {
let stub_concrete = StubRerank;
let stub_box: Box<dyn RerankBackend + Send + Sync> = Box::new(StubRerank);
for batch_size in [1_usize, 8, 32, 128] {
let encodings = make_encodings(batch_size);
let mut group = c.benchmark_group(format!("rerank_dispatch_b{batch_size}"));
group.bench_function("concrete", |b| {
b.iter(|| black_box(stub_concrete.score_batch(black_box(&encodings))));
});
group.bench_function("boxed_dyn", |b| {
b.iter(|| black_box(stub_box.score_batch(black_box(&encodings))));
});
group.finish();
}
}
criterion_group!(benches, bench_dispatch);
criterion_main!(benches);