pvec 0.2.1

RRB-Tree based persistent vector implementation.
Documentation
use super::*;
use rayon::prelude::*;

use crate::pvec::core::RbVec;
use crate::pvec::core::RrbVec;
use crate::pvec::PVec;

use criterion::BatchSize::SmallInput;

macro_rules! generate_vec {
    ($new_vec:expr) => {
        |n: usize| {
            let mut vec = $new_vec();

            for i in 0..n {
                vec.push(i);
            }

            vec
        }
    };
}

fn vector_addition_par(criterion: &mut Criterion, num_threads: usize) {
    macro_rules! bench {
        ($new_vec:expr) => {
            |(vec_one, vec_two)| {
                vec_one
                    .into_par_iter()
                    .zip(vec_two)
                    .map(|(e_1, e_2)| e_1 + e_2)
                    .fold($new_vec, |mut vec_1, x| {
                        vec_1.push(x);
                        vec_1
                    })
                    .reduce($new_vec, |mut vec_1, mut vec_2| {
                        vec_1.append(&mut vec_2);
                        vec_1
                    })
            }
        };
    }

    let mut group =
        criterion.benchmark_group(format!("vector_addition_with_thread_num_{}", num_threads));
    group.plot_config(PlotConfiguration::default().summary_scale(AxisScale::Logarithmic));

    let pool = rayon::ThreadPoolBuilder::new()
        .num_threads(num_threads)
        .build()
        .unwrap();

    macro_rules! make_bench {
        ($name:ident, $p:ident, $new_vec:expr) => {
            group.bench_with_input(BenchmarkId::new($name, $p), $p, |b, n| {
                let generate_vec = generate_vec!($new_vec);

                pool.install(|| {
                    b.iter_batched(
                        || (generate_vec(*n), generate_vec(*n)),
                        bench!($new_vec),
                        SmallInput,
                    );
                });
            });
        };
    }

    let params = vec![
        20, 40, 60, 80, 100, 200, 400, 600, 800, 1000, 2000, 4000, 6000, 8000, 10000, 20000, 40000,
        60000,
    ];

    for p in params.iter() {
        make_bench!(STD_VEC, p, || Vec::new());
        make_bench!(RBVEC, p, || RbVec::new());
        make_bench!(RRBVEC, p, || RrbVec::new());
        make_bench!(PVEC_STD, p, || PVec::new());
        make_bench!(PVEC_RRBVEC_RELAXED, p, || PVec::new_with_tree());
    }

    group.finish();
}

fn vector_addition_1(criterion: &mut Criterion) {
    vector_addition_par(criterion, 1);
}

fn vector_addition_2(criterion: &mut Criterion) {
    vector_addition_par(criterion, 2);
}

fn vector_addition_4(criterion: &mut Criterion) {
    vector_addition_par(criterion, 4);
}

fn vector_addition_8(criterion: &mut Criterion) {
    vector_addition_par(criterion, 8);
}

fn vector_addition_16(criterion: &mut Criterion) {
    vector_addition_par(criterion, 16);
}

criterion_group!(
    benches,
    vector_addition_1,
    vector_addition_2,
    vector_addition_4,
    vector_addition_8,
    vector_addition_16,
);