use std::hint::black_box;
use criterion::{Criterion, criterion_group, criterion_main};
use rand::prelude::*;
use range_set_blaze::RangeSetBlaze; use sparse_ranges::{Range, RangeSet};
const SET_SIZE: usize = 1000;
const RANGE_MAX: usize = 10_000;
fn generate_random_ranges(count: usize) -> Vec<(usize, usize)> {
let mut rng = StdRng::seed_from_u64(42); let mut ranges = Vec::with_capacity(count);
for _ in 0..count {
let a = rng.random_range(0..RANGE_MAX);
let b = rng.random_range(0..RANGE_MAX);
if a < b {
ranges.push((a, b));
} else {
ranges.push((b, a));
}
}
ranges
}
fn union_benchmark(c: &mut Criterion) {
let all_random_ranges = generate_random_ranges(SET_SIZE);
let (set1_random_ranges, set2_random_ranges) = all_random_ranges.split_at(SET_SIZE / 2);
let all_sequential_ranges: Vec<_> = (0..SET_SIZE).map(|i| (i * 10, i * 10 + 5)).collect();
let (set1_seq_ranges, set2_seq_ranges) = all_sequential_ranges.split_at(SET_SIZE / 2);
let mut group = c.benchmark_group("Union Performance");
let mut set1_seq_offset = RangeSet::new();
for &(start, end) in set1_seq_ranges {
set1_seq_offset.insert_range(&Range::new(start, end));
}
let mut set2_seq_offset = RangeSet::new();
for &(start, end) in set2_seq_ranges {
set2_seq_offset.insert_range(&Range::new(start, end));
}
let mut set1_seq_blaze = RangeSetBlaze::new();
for &(start, end) in set1_seq_ranges {
set1_seq_blaze.ranges_insert(start..=end);
}
let mut set2_seq_blaze = RangeSetBlaze::new();
for &(start, end) in set2_seq_ranges {
set2_seq_blaze.ranges_insert(start..=end);
}
group.bench_function("OffsetRangeSet - Sequential Union", |b| {
b.iter(|| {
let _ = black_box(&set1_seq_offset).union_merge(black_box(&set2_seq_offset));
})
});
group.bench_function("RangeSetBlaze - Sequential Union", |b| {
b.iter(|| {
let _ = black_box(&set1_seq_blaze) | black_box(&set2_seq_blaze);
})
});
let mut set1_rand_offset = RangeSet::new();
for &(start, end) in set1_random_ranges {
set1_rand_offset.insert_range(&Range::new(start, end));
}
let mut set2_rand_offset = RangeSet::new();
for &(start, end) in set2_random_ranges {
set2_rand_offset.insert_range(&Range::new(start, end));
}
let mut set1_rand_blaze = RangeSetBlaze::new();
for &(start, end) in set1_random_ranges {
set1_rand_blaze.ranges_insert(start..=end);
}
let mut set2_rand_blaze = RangeSetBlaze::new();
for &(start, end) in set2_random_ranges {
set2_rand_blaze.ranges_insert(start..=end);
}
group.bench_function("OffsetRangeSet - Random Union", |b| {
b.iter(|| {
let _ = black_box(&set1_rand_offset).union_merge(black_box(&set2_rand_offset));
})
});
group.bench_function("RangeSetBlaze - Random Union", |b| {
b.iter(|| {
let _ = black_box(&set1_rand_blaze) | black_box(&set2_rand_blaze);
})
});
group.finish();
}
criterion_group!(benches, union_benchmark);
criterion_main!(benches);