1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use itertools::Itertools;
// Keep aggregate generated elements the same, regardless of powerset length.
const TOTAL_ELEMENTS: usize = 1 << 12;
const fn calc_iters(n: usize) -> usize {
TOTAL_ELEMENTS / (1 << n)
}
fn powerset_n(c: &mut Criterion, n: usize) {
let id = format!("powerset {}", n);
c.bench_function(id.as_str(), move |b| {
b.iter(|| {
for _ in 0..calc_iters(n) {
for elt in (0..n).powerset() {
black_box(elt);
}
}
})
});
}
fn powerset_n_fold(c: &mut Criterion, n: usize) {
let id = format!("powerset {} fold", n);
c.bench_function(id.as_str(), move |b| {
b.iter(|| {
for _ in 0..calc_iters(n) {
(0..n).powerset().fold(0, |s, elt| s + black_box(elt).len());
}
})
});
}
fn powerset_0(c: &mut Criterion) {
powerset_n(c, 0);
}
fn powerset_1(c: &mut Criterion) {
powerset_n(c, 1);
}
fn powerset_2(c: &mut Criterion) {
powerset_n(c, 2);
}
fn powerset_4(c: &mut Criterion) {
powerset_n(c, 4);
}
fn powerset_8(c: &mut Criterion) {
powerset_n(c, 8);
}
fn powerset_12(c: &mut Criterion) {
powerset_n(c, 12);
}
fn powerset_0_fold(c: &mut Criterion) {
powerset_n_fold(c, 0);
}
fn powerset_1_fold(c: &mut Criterion) {
powerset_n_fold(c, 1);
}
fn powerset_2_fold(c: &mut Criterion) {
powerset_n_fold(c, 2);
}
fn powerset_4_fold(c: &mut Criterion) {
powerset_n_fold(c, 4);
}
fn powerset_8_fold(c: &mut Criterion) {
powerset_n_fold(c, 8);
}
fn powerset_12_fold(c: &mut Criterion) {
powerset_n_fold(c, 12);
}
criterion_group!(
benches,
powerset_0,
powerset_1,
powerset_2,
powerset_4,
powerset_8,
powerset_12,
powerset_0_fold,
powerset_1_fold,
powerset_2_fold,
powerset_4_fold,
powerset_8_fold,
powerset_12_fold,
);
criterion_main!(benches);
|