use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use edgevec::quantization::ScalarQuantizer;
use rand::{Rng, SeedableRng};
use rand_chacha::ChaCha8Rng;
use std::hint::black_box;
fn bench_quantization_speed(c: &mut Criterion) {
let seed = 42;
let mut rng = ChaCha8Rng::seed_from_u64(seed);
let dimensions = [768, 1536];
let mut group = c.benchmark_group("quantization_latency");
for &dim in &dimensions {
let vector: Vec<f32> = (0..dim).map(|_| rng.gen_range(-10.0..10.0)).collect();
let batch = vec![vector.as_slice()];
let quantizer = ScalarQuantizer::train(&batch);
group.throughput(Throughput::Elements(1));
group.bench_with_input(BenchmarkId::from_parameter(dim), &dim, |b, _| {
b.iter(|| {
black_box(quantizer.quantize(black_box(&vector)))
});
});
}
group.finish();
}
fn bench_quantization_throughput(c: &mut Criterion) {
let seed = 42;
let mut rng = ChaCha8Rng::seed_from_u64(seed);
let dim = 1536;
let batch_size = 1000;
let vectors: Vec<Vec<f32>> = (0..batch_size)
.map(|_| (0..dim).map(|_| rng.gen_range(-10.0..10.0)).collect())
.collect();
let refs: Vec<&[f32]> = vectors.iter().map(|v| v.as_slice()).collect();
let quantizer = ScalarQuantizer::train(&refs);
let mut group = c.benchmark_group("quantization_throughput");
group.throughput(Throughput::Elements(batch_size as u64));
group.bench_function("quantize_1k_1536d", |b| {
b.iter(|| {
for v in &vectors {
black_box(quantizer.quantize(black_box(v)));
}
});
});
group.finish();
}
criterion_group!(
benches,
bench_quantization_speed,
bench_quantization_throughput
);
criterion_main!(benches);