146 lines
3.9 KiB
Rust
146 lines
3.9 KiB
Rust
mod bench_helper;
|
|
use bench_helper::random_set;
|
|
use criterion::{black_box, criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion};
|
|
use read_fonts::collections::IntSet;
|
|
|
|
struct SetTest {
|
|
set_size: u32,
|
|
density: u32,
|
|
}
|
|
|
|
impl SetTest {
|
|
fn max_value(&self) -> u32 {
|
|
self.density * self.set_size
|
|
}
|
|
}
|
|
|
|
impl std::fmt::Display for SetTest {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(f, "{}/{}", self.set_size, self.density)
|
|
}
|
|
}
|
|
|
|
fn set_parameters() -> Vec<SetTest> {
|
|
let mut inputs: Vec<SetTest> = Vec::<SetTest>::new();
|
|
for density in [2, 8, 64, 512] {
|
|
for set_size in [1024, 4096, 32_768, 65_536] {
|
|
inputs.push(SetTest { set_size, density })
|
|
}
|
|
}
|
|
inputs
|
|
}
|
|
|
|
pub fn insert_benchmark(c: &mut Criterion) {
|
|
const NUM_INSERTS: u32 = 1000;
|
|
let inputs = set_parameters();
|
|
|
|
for input in inputs {
|
|
c.bench_with_input(
|
|
BenchmarkId::new("BM_SetInsert_1000", &input),
|
|
&input,
|
|
|b, p: &SetTest| {
|
|
let set = random_set(p.set_size, p.max_value());
|
|
b.iter_batched(
|
|
|| set.clone(),
|
|
|mut s| {
|
|
for i in 0..NUM_INSERTS {
|
|
let v: u32 = i.wrapping_mul(2_654_435_761) % p.max_value();
|
|
s.insert(v);
|
|
}
|
|
},
|
|
BatchSize::SmallInput,
|
|
)
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
pub fn ordered_extend_benchmark(c: &mut Criterion) {
|
|
let num_inserts = 1000u32;
|
|
let inputs = set_parameters();
|
|
|
|
for input in inputs {
|
|
c.bench_with_input(
|
|
BenchmarkId::new("BM_SetOrderedInsert_1000", &input),
|
|
&input,
|
|
|b, p: &SetTest| {
|
|
let set = random_set(p.set_size, p.max_value());
|
|
b.iter_batched(
|
|
|| set.clone(),
|
|
|mut s| {
|
|
s.extend(0..num_inserts);
|
|
},
|
|
BatchSize::SmallInput,
|
|
)
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
pub fn lookup_random_benchmark(c: &mut Criterion) {
|
|
let inputs = set_parameters();
|
|
|
|
for input in inputs {
|
|
let set = random_set(input.set_size, input.max_value());
|
|
let mut needle = input.max_value() / 2;
|
|
c.bench_with_input(
|
|
BenchmarkId::new("BM_SetLookup/random", &input),
|
|
&set,
|
|
|b, s: &IntSet<u32>| {
|
|
b.iter(|| {
|
|
needle += 12345;
|
|
s.contains(needle % input.max_value())
|
|
})
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
pub fn lookup_ordered_benchmark(c: &mut Criterion) {
|
|
let inputs = set_parameters();
|
|
|
|
for input in inputs {
|
|
let set = random_set(input.set_size, input.max_value());
|
|
let mut needle = input.max_value() / 2;
|
|
c.bench_with_input(
|
|
BenchmarkId::new("BM_SetLookup/ordered", &input),
|
|
&set,
|
|
|b, s: &IntSet<u32>| {
|
|
b.iter(|| {
|
|
needle += 3;
|
|
s.contains(needle % input.max_value())
|
|
})
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
pub fn iteration_benchmark(c: &mut Criterion) {
|
|
let inputs = set_parameters();
|
|
|
|
for input in inputs {
|
|
let set = random_set(input.set_size, input.max_value());
|
|
c.bench_with_input(
|
|
BenchmarkId::new("BM_SetIteration", &input),
|
|
&set,
|
|
|b, s: &IntSet<u32>| {
|
|
b.iter(|| {
|
|
for v in s.iter() {
|
|
black_box(v);
|
|
}
|
|
})
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
criterion_group!(
|
|
benches,
|
|
insert_benchmark,
|
|
ordered_extend_benchmark,
|
|
lookup_random_benchmark,
|
|
lookup_ordered_benchmark,
|
|
iteration_benchmark,
|
|
);
|
|
criterion_main!(benches);
|