Skip to content

Commit

Permalink
Add benchmarks for k_smallest implementation variants.
Browse files Browse the repository at this point in the history
  • Loading branch information
adamreichold authored and Philippe-Cholet committed Jul 3, 2024
1 parent fe7ef10 commit e41a62b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ either = { version = "1.0", default-features = false }

[dev-dependencies]
rand = "0.7"
criterion = "0.4.0"
criterion = { version = "0.4.0", features = ["html_reports"] }
paste = "1.0.0" # Used in test_std to instantiate generic tests
permutohedron = "0.2"
quickcheck = { version = "0.9", default_features = false }
Expand Down Expand Up @@ -75,3 +75,7 @@ harness = false
[[bench]]
name = "specializations"
harness = false

[[bench]]
name = "k_smallest"
harness = false
61 changes: 61 additions & 0 deletions benches/k_smallest.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion};
use itertools::Itertools;
use rand::{rngs::StdRng, seq::SliceRandom, SeedableRng};

fn strict(b: &mut Bencher, (k, vals): &(usize, &Vec<usize>)) {
b.iter(|| black_box(vals.iter()).k_smallest(*k))
}

fn relaxed(b: &mut Bencher, (k, vals): &(usize, &Vec<usize>)) {
b.iter(|| black_box(vals.iter()).k_smallest_relaxed(*k))
}

fn ascending(n: usize) -> Vec<usize> {
(0..n).collect()
}

fn random(n: usize) -> Vec<usize> {
let mut vals = (0..n).collect_vec();
vals.shuffle(&mut StdRng::seed_from_u64(42));
vals
}

fn descending(n: usize) -> Vec<usize> {
(0..n).rev().collect()
}

fn k_smallest(c: &mut Criterion, order: &str, vals: fn(usize) -> Vec<usize>) {
let mut g = c.benchmark_group(format!("k-smallest/{order}"));

for log_n in 20..23 {
let n = 1 << log_n;

let vals = vals(n);

for log_k in 7..10 {
let k = 1 << log_k;

let params = format!("{log_n}/{log_k}");
let input = (k, &vals);
g.bench_with_input(BenchmarkId::new("strict", &params), &input, strict);
g.bench_with_input(BenchmarkId::new("relaxed", &params), &input, relaxed);
}
}

g.finish()
}

fn k_smallest_asc(c: &mut Criterion) {
k_smallest(c, "asc", ascending);
}

fn k_smallest_rand(c: &mut Criterion) {
k_smallest(c, "rand", random);
}

fn k_smallest_desc(c: &mut Criterion) {
k_smallest(c, "desc", descending);
}

criterion_group!(benches, k_smallest_asc, k_smallest_rand, k_smallest_desc);
criterion_main!(benches);
1 change: 1 addition & 0 deletions src/k_smallest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ where
return;
}

assert_ne!(buf.len(), buf.capacity());
buf.push(val);

if buf.len() == 2 * k {
Expand Down

0 comments on commit e41a62b

Please sign in to comment.