From 046d695f26ed08c8a124ec0d0c7a88c4537f4775 Mon Sep 17 00:00:00 2001 From: OceanLi <122793010+ohdearquant@users.noreply.github.com> Date: Mon, 3 Aug 2026 10:55:25 -0400 Subject: [PATCH] bench(spann): add distance benchmarks Add a Criterion harness for the l2_squared and cosine_distance kernels in ruvector-spann, covering dimensions 128/384/768/1536 with seeded random inputs instead of constant fills. --- Cargo.lock | 4 +++ crates/ruvector-spann/Cargo.toml | 6 ++++ crates/ruvector-spann/benches/distance.rs | 42 +++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 crates/ruvector-spann/benches/distance.rs diff --git a/Cargo.lock b/Cargo.lock index 03d9322bc8..4a122ef6ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10603,6 +10603,10 @@ dependencies = [ [[package]] name = "ruvector-spann" version = "0.1.0" +dependencies = [ + "criterion 0.5.1", + "rand 0.8.6", +] [[package]] name = "ruvector-sparse-inference" diff --git a/crates/ruvector-spann/Cargo.toml b/crates/ruvector-spann/Cargo.toml index e65ae137f8..37f4f54863 100644 --- a/crates/ruvector-spann/Cargo.toml +++ b/crates/ruvector-spann/Cargo.toml @@ -13,3 +13,9 @@ path = "src/bin/benchmark.rs" [dependencies] [dev-dependencies] +criterion = { workspace = true } +rand = { workspace = true } + +[[bench]] +name = "distance" +harness = false diff --git a/crates/ruvector-spann/benches/distance.rs b/crates/ruvector-spann/benches/distance.rs new file mode 100644 index 0000000000..e786048f56 --- /dev/null +++ b/crates/ruvector-spann/benches/distance.rs @@ -0,0 +1,42 @@ +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use rand::rngs::StdRng; +use rand::{Rng, SeedableRng}; +use ruvector_spann::distance::{cosine_distance, l2_squared}; + +const DIMENSIONS: [usize; 4] = [128, 384, 768, 1536]; +const SEED: u64 = 0x5eed_5eed_5eed_5eed; + +fn random_vector(rng: &mut StdRng, dim: usize) -> Vec { + (0..dim).map(|_| rng.gen_range(-1.0f32..1.0)).collect() +} + +fn bench_l2_squared(c: &mut Criterion) { + let mut group = c.benchmark_group("l2_squared"); + for &dim in DIMENSIONS.iter() { + let mut rng = StdRng::seed_from_u64(SEED); + let a = random_vector(&mut rng, dim); + let b = random_vector(&mut rng, dim); + + group.bench_with_input(BenchmarkId::from_parameter(dim), &dim, |bench, _| { + bench.iter(|| black_box(l2_squared(black_box(&a), black_box(&b)))); + }); + } + group.finish(); +} + +fn bench_cosine_distance(c: &mut Criterion) { + let mut group = c.benchmark_group("cosine_distance"); + for &dim in DIMENSIONS.iter() { + let mut rng = StdRng::seed_from_u64(SEED); + let a = random_vector(&mut rng, dim); + let b = random_vector(&mut rng, dim); + + group.bench_with_input(BenchmarkId::from_parameter(dim), &dim, |bench, _| { + bench.iter(|| black_box(cosine_distance(black_box(&a), black_box(&b)))); + }); + } + group.finish(); +} + +criterion_group!(benches, bench_l2_squared, bench_cosine_distance); +criterion_main!(benches);