use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
use sqlitegraph::hnsw::{DistanceMetric, HnswConfig, HnswIndex};
mod bench_utils;
fn bench_hnsw_search_scaling(criterion: &mut Criterion) {
let mut group = criterion.benchmark_group("hnsw_scaling");
group.sample_size(20);
let dataset_sizes = vec![100, 500, 1_000]; let dimension = 64;
for &size in &dataset_sizes {
group.throughput(Throughput::Elements(size as u64));
group.bench_with_input(
BenchmarkId::from_parameter(size),
&size,
|bencher, &size| {
let config = HnswConfig {
dimension,
m: 16,
ef_construction: 100, ef_search: 50,
ml: 8,
distance_metric: DistanceMetric::Euclidean,
enable_multilayer: false,
multilayer_level_distribution_base: None,
multilayer_deterministic_seed: None,
};
let mut hnsw = HnswIndex::new("bench", config).unwrap();
for i in 0..size {
let vector = (0..dimension)
.map(|j| ((i * dimension + j) as f32 * 0.01).sin())
.collect::<Vec<_>>();
hnsw.insert_vector(&vector, None).unwrap();
}
let query = (0..dimension)
.map(|j| (j as f32 * 0.01).sin())
.collect::<Vec<_>>();
bencher.iter(|| hnsw.search(&query, 10).unwrap());
},
);
}
group.finish();
}
criterion_group!(benches, bench_hnsw_search_scaling);
criterion_main!(benches);