autobarts/benches/bench_range_search.rs

92 lines
2.4 KiB
Rust

use std::hint::black_box;
use autobarts::{geom::Point, spindex::RStarTree};
use bevy::math::Vec2;
use criterion::{Criterion, criterion_group};
use rand::{Rng, SeedableRng, seq::SliceRandom};
//
// Benchmark Parameters
//
pub const BENCH_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10);
pub const BENCH_NUM_INSERT: i32 = 50_000;
pub const BENCH_NODE_CAPACITY: usize = 5;
const SEED: u64 = 8;
//
// Data Generation Functions (Raw Data)
//
pub fn generate_2d_data() -> Vec<Point> {
let data: Vec<Point> = (0..BENCH_NUM_INSERT)
.map(|i| {
let point = bevy::prelude::Vec2::new(i as f32, i as f32);
Point {
point,
entity: bevy::prelude::Entity::PLACEHOLDER,
}
})
.collect();
data
}
// Configure Criterion with a timeout for benchmarks
pub fn configure_criterion() -> Criterion {
Criterion::default()
.measurement_time(BENCH_TIMEOUT)
.sample_size(10)
}
const BENCH_RANGE_RADIUS: f32 = 30.0;
fn benchmark_range_rstartree_2d(_c: &mut Criterion) {
let mut points = generate_2d_data();
let mut rng = rand::rngs::StdRng::seed_from_u64(SEED);
let len = points.len();
for i in 0..len {
let j = rng.random_range(0..len);
points.swap(i, j);
}
let mut tree = RStarTree::new(BENCH_NODE_CAPACITY);
tree.insert_bulk(points.clone());
let mut cc = configure_criterion();
let mut idx = 0;
let len = points.len();
cc.bench_function("range_rstartree_2d", |b| {
b.iter(|| {
let res = tree.range_search(&points[idx], BENCH_RANGE_RADIUS);
idx = (idx + 1) % len;
black_box(res)
})
});
}
fn benchmark_range_bbox_rstartree_2d(_c: &mut Criterion) {
let points = generate_2d_data();
let mut tree = RStarTree::new(BENCH_NODE_CAPACITY);
tree.insert_bulk(points);
let query_rect = bevy::math::bounding::Aabb2d::new(
Vec2::new(35.0 - BENCH_RANGE_RADIUS, 45.0 - BENCH_RANGE_RADIUS),
4.0 * Vec2::splat(BENCH_RANGE_RADIUS),
);
let mut cc = configure_criterion();
cc.bench_function("range_rstartree_2d", |b| {
b.iter(|| {
let res = tree.range_search_bbox(&query_rect);
black_box(res)
})
});
}
criterion_group!(
benches,
benchmark_range_rstartree_2d,
//benchmark_range_bbox_rstartree_2d,
);