1 use criterion::{black_box, criterion_group, criterion_main, Criterion};
2 use itertools::Itertools;
3
4 // Keep aggregate generated elements the same, regardless of powerset length.
5 const TOTAL_ELEMENTS: usize = 1 << 12;
calc_iters(n: usize) -> usize6 const fn calc_iters(n: usize) -> usize {
7 TOTAL_ELEMENTS / (1 << n)
8 }
9
powerset_n(c: &mut Criterion, n: usize)10 fn powerset_n(c: &mut Criterion, n: usize) {
11 let id = format!("powerset {}", n);
12 c.bench_function(id.as_str(), move |b| {
13 b.iter(|| {
14 for _ in 0..calc_iters(n) {
15 for elt in (0..n).powerset() {
16 black_box(elt);
17 }
18 }
19 })
20 });
21 }
22
powerset_0(c: &mut Criterion)23 fn powerset_0(c: &mut Criterion) { powerset_n(c, 0); }
24
powerset_1(c: &mut Criterion)25 fn powerset_1(c: &mut Criterion) { powerset_n(c, 1); }
26
powerset_2(c: &mut Criterion)27 fn powerset_2(c: &mut Criterion) { powerset_n(c, 2); }
28
powerset_4(c: &mut Criterion)29 fn powerset_4(c: &mut Criterion) { powerset_n(c, 4); }
30
powerset_8(c: &mut Criterion)31 fn powerset_8(c: &mut Criterion) { powerset_n(c, 8); }
32
powerset_12(c: &mut Criterion)33 fn powerset_12(c: &mut Criterion) { powerset_n(c, 12); }
34
35 criterion_group!(
36 benches,
37 powerset_0,
38 powerset_1,
39 powerset_2,
40 powerset_4,
41 powerset_8,
42 powerset_12,
43 );
44 criterion_main!(benches);