Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
77
crates/ruvector-core/benches/quantization_bench.rs
Normal file
77
crates/ruvector-core/benches/quantization_bench.rs
Normal file
@@ -0,0 +1,77 @@
|
||||
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
|
||||
use ruvector_core::quantization::*;
|
||||
|
||||
fn bench_scalar_quantization(c: &mut Criterion) {
|
||||
let mut group = c.benchmark_group("scalar_quantization");
|
||||
|
||||
for size in [128, 384, 768, 1536].iter() {
|
||||
let vector: Vec<f32> = (0..*size).map(|i| i as f32 * 0.1).collect();
|
||||
|
||||
group.bench_with_input(BenchmarkId::new("encode", size), size, |bench, _| {
|
||||
bench.iter(|| ScalarQuantized::quantize(black_box(&vector)));
|
||||
});
|
||||
|
||||
let quantized = ScalarQuantized::quantize(&vector);
|
||||
group.bench_with_input(BenchmarkId::new("decode", size), size, |bench, _| {
|
||||
bench.iter(|| quantized.reconstruct());
|
||||
});
|
||||
|
||||
let quantized2 = ScalarQuantized::quantize(&vector);
|
||||
group.bench_with_input(BenchmarkId::new("distance", size), size, |bench, _| {
|
||||
bench.iter(|| quantized.distance(black_box(&quantized2)));
|
||||
});
|
||||
}
|
||||
|
||||
group.finish();
|
||||
}
|
||||
|
||||
fn bench_binary_quantization(c: &mut Criterion) {
|
||||
let mut group = c.benchmark_group("binary_quantization");
|
||||
|
||||
for size in [128, 384, 768, 1536].iter() {
|
||||
let vector: Vec<f32> = (0..*size)
|
||||
.map(|i| if i % 2 == 0 { 1.0 } else { -1.0 })
|
||||
.collect();
|
||||
|
||||
group.bench_with_input(BenchmarkId::new("encode", size), size, |bench, _| {
|
||||
bench.iter(|| BinaryQuantized::quantize(black_box(&vector)));
|
||||
});
|
||||
|
||||
let quantized = BinaryQuantized::quantize(&vector);
|
||||
group.bench_with_input(BenchmarkId::new("decode", size), size, |bench, _| {
|
||||
bench.iter(|| quantized.reconstruct());
|
||||
});
|
||||
|
||||
let quantized2 = BinaryQuantized::quantize(&vector);
|
||||
group.bench_with_input(
|
||||
BenchmarkId::new("hamming_distance", size),
|
||||
size,
|
||||
|bench, _| {
|
||||
bench.iter(|| quantized.distance(black_box(&quantized2)));
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
group.finish();
|
||||
}
|
||||
|
||||
fn bench_quantization_compression_ratio(c: &mut Criterion) {
|
||||
let dimensions = 384;
|
||||
let vector: Vec<f32> = (0..dimensions).map(|i| i as f32 * 0.01).collect();
|
||||
|
||||
c.bench_function("scalar_vs_binary_encoding", |b| {
|
||||
b.iter(|| {
|
||||
let scalar = ScalarQuantized::quantize(black_box(&vector));
|
||||
let binary = BinaryQuantized::quantize(black_box(&vector));
|
||||
(scalar, binary)
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
criterion_group!(
|
||||
benches,
|
||||
bench_scalar_quantization,
|
||||
bench_binary_quantization,
|
||||
bench_quantization_compression_ratio
|
||||
);
|
||||
criterion_main!(benches);
|
||||
Reference in New Issue
Block a user