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_n_fold(c: &mut Criterion, n: usize)23 fn powerset_n_fold(c: &mut Criterion, n: usize) {
24     let id = format!("powerset {} fold", n);
25     c.bench_function(id.as_str(), move |b| {
26         b.iter(|| {
27             for _ in 0..calc_iters(n) {
28                 (0..n).powerset().fold(0, |s, elt| s + black_box(elt).len());
29             }
30         })
31     });
32 }
33 
powerset_0(c: &mut Criterion)34 fn powerset_0(c: &mut Criterion) {
35     powerset_n(c, 0);
36 }
37 
powerset_1(c: &mut Criterion)38 fn powerset_1(c: &mut Criterion) {
39     powerset_n(c, 1);
40 }
41 
powerset_2(c: &mut Criterion)42 fn powerset_2(c: &mut Criterion) {
43     powerset_n(c, 2);
44 }
45 
powerset_4(c: &mut Criterion)46 fn powerset_4(c: &mut Criterion) {
47     powerset_n(c, 4);
48 }
49 
powerset_8(c: &mut Criterion)50 fn powerset_8(c: &mut Criterion) {
51     powerset_n(c, 8);
52 }
53 
powerset_12(c: &mut Criterion)54 fn powerset_12(c: &mut Criterion) {
55     powerset_n(c, 12);
56 }
57 
powerset_0_fold(c: &mut Criterion)58 fn powerset_0_fold(c: &mut Criterion) {
59     powerset_n_fold(c, 0);
60 }
61 
powerset_1_fold(c: &mut Criterion)62 fn powerset_1_fold(c: &mut Criterion) {
63     powerset_n_fold(c, 1);
64 }
65 
powerset_2_fold(c: &mut Criterion)66 fn powerset_2_fold(c: &mut Criterion) {
67     powerset_n_fold(c, 2);
68 }
69 
powerset_4_fold(c: &mut Criterion)70 fn powerset_4_fold(c: &mut Criterion) {
71     powerset_n_fold(c, 4);
72 }
73 
powerset_8_fold(c: &mut Criterion)74 fn powerset_8_fold(c: &mut Criterion) {
75     powerset_n_fold(c, 8);
76 }
77 
powerset_12_fold(c: &mut Criterion)78 fn powerset_12_fold(c: &mut Criterion) {
79     powerset_n_fold(c, 12);
80 }
81 
82 criterion_group!(
83     benches,
84     powerset_0,
85     powerset_1,
86     powerset_2,
87     powerset_4,
88     powerset_8,
89     powerset_12,
90     powerset_0_fold,
91     powerset_1_fold,
92     powerset_2_fold,
93     powerset_4_fold,
94     powerset_8_fold,
95     powerset_12_fold,
96 );
97 criterion_main!(benches);
98