Similarity Benchmarks
March 23, 2026 · View on GitHub
Pairwise vector-vector distance and dot-product benchmarks comparing NumKong against scalar baselines and BLAS-backed libraries.
Rust
| Library | Precision | GSO/s |
|---|---|---|
| Dot | ||
numkong::Dot | u8 → u32 | 37.34 |
numkong::Dot | i8 → i32 | 37.41 |
numkong::Dot | bf16 → f32 | 14.83 |
| serial code | f32 → f32 | 13.86 |
ndarray::dot | f32 → f32 | 12.77 |
nalgebra::dot | f32 → f32 | 12.95 |
| serial code | u8 → u32 | 19.28 |
numkong::Dot | f32 → f64 | 2.50 |
| serial code | i8 → i32 | 19.70 |
| serial code | bf16 → f32 | 0.67 |
numkong::Dot | f16 → f32 | 6.16 |
numkong::Dot | f64 → f64 | 2.81 |
numkong::Dot | e4m3 → f32 | 4.43 |
numkong::Dot | e5m2 → f32 | 6.08 |
numkong::Dot | e2m3 → f32 | 26.64 |
numkong::Dot | e3m2 → f32 | 11.32 |
ndarray::dot | f64 → f64 | 11.62 |
nalgebra::dot | f64 → f64 | 11.66 |
| Angular | ||
numkong::Angular | f32 → f32 | 2.34 |
numkong::Angular | f64 → f64 | 2.30 |
numkong::Angular | i8 → f32 | 31.86 |
numkong::Angular | u8 → f32 | 31.86 |
numkong::Angular | f16 → f32 | 4.81 |
numkong::Angular | bf16 → f32 | 10.28 |
numkong::Angular | e4m3 → f32 | 2.19 |
numkong::Angular | e5m2 → f32 | 5.34 |
numkong::Angular | e2m3 → f32 | 2.60 |
numkong::Angular | e3m2 → f32 | 2.60 |
| Euclidean | ||
numkong::Euclidean | u8 → f32 | 34.85 |
numkong::Euclidean | i8 → f32 | 34.91 |
numkong::Euclidean | bf16 → f32 | 5.54 |
numkong::Euclidean | f32 → f64 | 2.50 |
ndarray::norm | f32 → f32 | 7.61 |
nalgebra::norm | f32 → f32 | 7.74 |
| serial code | f32 → f32 | 11.15 |
| serial code | u8 → f32 | 9.19 |
| serial code | i8 → f32 | 9.26 |
| serial code | bf16 → f32 | 0.66 |
numkong::Euclidean | f16 → f32 | 5.27 |
numkong::Euclidean | f64 → f64 | 2.60 |
numkong::Euclidean | e4m3 → f32 | 2.28 |
numkong::Euclidean | e5m2 → f32 | 5.80 |
numkong::Euclidean | e2m3 → f32 | 2.74 |
numkong::Euclidean | e3m2 → f32 | 2.75 |
ndarray::norm | f64 → f64 | 5.59 |
nalgebra::norm | f64 → f64 | 5.63 |
| Squared Euclidean | ||
numkong::SqEuclidean | f32 → f32 | 2.65 |
numkong::SqEuclidean | f64 → f64 | 2.76 |
numkong::SqEuclidean | i8 → f32 | 38.59 |
numkong::SqEuclidean | u8 → f32 | 38.80 |
numkong::SqEuclidean | f16 → f32 | 5.52 |
numkong::SqEuclidean | bf16 → f32 | 5.70 |
numkong::SqEuclidean | e4m3 → f32 | 2.29 |
numkong::SqEuclidean | e5m2 → f32 | 5.87 |
numkong::SqEuclidean | e2m3 → f32 | 2.76 |
numkong::SqEuclidean | e3m2 → f32 | 2.76 |
| Hamming | ||
numkong::Hamming | u1x8 → u32 | 45.20 |
| Jaccard | ||
numkong::Jaccard | u1x8 → f32 | 36.88 |
| Kullback-Leibler | ||
numkong::KullbackLeibler | f32 → f32 | 2.87 |
numkong::KullbackLeibler | f64 → f64 | 0.27 |
| Jensen-Shannon | ||
numkong::JensenShannon | f32 → f32 | 1.47 |
numkong::JensenShannon | f64 → f64 | 0.17 |
Python
| Library | Precision | GSO/s |
|---|---|---|
| Dot | ||
numkong.dot | u8 → f32 | 9.37 |
numkong.dot | i8 → f32 | 9.81 |
numkong.dot | bf16 → f32 | 1.06 |
numkong.dot | f32 → f32 | 2.02 |
numkong.dot | f64 → f32 | 2.48 |
numpy.dot | f32 → f32 | 3.81 |
numpy.dot | f64 → f64 | 3.68 |
| Angular | ||
numkong.angular | u8 → f32 | 10.07 |
numkong.angular | i8 → f32 | 10.04 |
numkong.angular | bf16 → f32 | 1.03 |
numkong.angular | f32 → f32 | 1.98 |
numkong.angular | f64 → f32 | 2.01 |
| Euclidean | ||
numkong.euclidean | u8 → f32 | 10.24 |
numkong.euclidean | i8 → f32 | 10.32 |
numkong.euclidean | bf16 → f32 | 0.92 |
numkong.euclidean | f32 → f32 | 2.15 |
numkong.euclidean | f64 → f32 | 2.14 |
| SqEuclidean | ||
numkong.sqeuclidean | u8 → f32 | 9.34 |
numkong.sqeuclidean | i8 → f32 | 8.60 |
numkong.sqeuclidean | bf16 → f32 | 0.93 |
numkong.sqeuclidean | f32 → f32 | 2.02 |
numkong.sqeuclidean | f64 → f32 | 2.14 |
Run It
Rust
# Default 2048-dimensional vectors
cargo bench --bench bench_similarity --features bench_similarity
# Smaller 512-dimensional vectors
NUMWARS_DIMS=512 cargo bench --bench bench_similarity --features bench_similarity
# One benchmark group
NUMWARS_FILTER="similarity/angular/f32" \
cargo bench --bench bench_similarity --features bench_similarity
Python
# Default 2048-dimensional pairwise distances
python similarity/bench.py --filter 'angular.*float32'
# Compare probability metrics
python similarity/bench.py --filter 'jensenshannon|kullback' --ndim 1536 --count 128