powerset.rs 1.1 KB

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