use std::hint::black_box;
use criterion::{Criterion, criterion_group, criterion_main};
use sparse_ranges::{Range, RangeSet};
fn bench_chunks_many_small_ranges(c: &mut Criterion) {
let mut group = c.benchmark_group("Many Small Ranges");
let mut initial_set = RangeSet::new();
for i in 0..1000 {
initial_set.insert_range(&Range::new(i * 10, i * 10 + 5));
}
let block_size = 1024;
group.bench_function("gather_small_ranges", |b| {
b.iter(|| {
let mut set = initial_set.clone();
black_box(set.into_chunks(block_size).collect::<Vec<_>>());
})
});
group.finish();
}
fn bench_chunks_one_large_range(c: &mut Criterion) {
let mut group = c.benchmark_group("One Large Range");
let mut initial_set = RangeSet::new();
initial_set.insert_range(&Range::new(0, 1_000_000 - 1));
let block_size = 128;
group.bench_function("split_large_range", |b| {
b.iter(|| {
let mut set = initial_set.clone();
black_box(set.into_chunks(block_size).collect::<Vec<_>>());
})
});
group.finish();
}
fn bench_chunks_mixed_ranges(c: &mut Criterion) {
let mut group = c.benchmark_group("Mixed Ranges");
let mut initial_set = RangeSet::new();
let mut current_pos = 0;
for i in 0..500 {
if i % 5 == 0 {
let large_range = Range::new(current_pos, current_pos + 1000);
initial_set.insert_range(&large_range);
current_pos += 1001;
} else {
let small_range = Range::new(current_pos, current_pos + 10);
initial_set.insert_range(&small_range);
current_pos += 11;
}
}
let block_size = 1024;
group.bench_function("gather_and_split_mixed", |b| {
b.iter(|| {
let mut set = initial_set.clone();
black_box(set.into_chunks(block_size).collect::<Vec<_>>());
})
});
group.finish();
}
criterion_group!(
benches,
bench_chunks_many_small_ranges,
bench_chunks_one_large_range,
bench_chunks_mixed_ranges
);
criterion_main!(benches);