use criterion::{ black_box, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, BenchmarkId, Criterion, }; use orx_split_vec::*; fn get_value(i: usize) -> [u64; N] { let modulo = i % 3; if modulo == 0 { [i as u64; N] } else if modulo == 1 { [(i + 1) as u64; N] } else { [(i + 2) as u64; N] } } fn std_vec_new T>(n: usize, value: F) { let mut vec = Vec::new(); for i in 0..n { vec.push(value(i)) } } fn std_vec_with_capacity T>(n: usize, value: F) { let mut vec = Vec::with_capacity(n); for i in 0..n { vec.push(value(i)) } } fn split_vec_linear T>(n: usize, value: F, constant_fragment_capacity: usize) { let mut vec = SplitVec::with_linear_growth(constant_fragment_capacity); for i in 0..n { vec.push(value(i)) } } fn split_vec_doubling T>(n: usize, value: F) { let mut vec = SplitVec::with_doubling_growth(); for i in 0..n { vec.push(value(i)) } } fn test_for_type( group: &mut BenchmarkGroup<'_, WallTime>, num_u64s: usize, treatments: &[usize], value: fn(usize) -> T, ) { for n in treatments { let treatment = format!("n={},elem-type=[u64;{}]", n, num_u64s); group.bench_with_input( BenchmarkId::new("std_vec_with_capacity", &treatment), n, |b, _| b.iter(|| std_vec_with_capacity(black_box(*n), value)), ); group.bench_with_input(BenchmarkId::new("std_vec_new", &treatment), n, |b, _| { b.iter(|| std_vec_new(black_box(*n), value)) }); group.bench_with_input( BenchmarkId::new("split_vec_linear - 2^10%", &treatment), n, |b, _| b.iter(|| split_vec_linear(black_box(*n), value, 10)), ); group.bench_with_input( BenchmarkId::new("split_vec_doubling", &treatment), n, |b, _| b.iter(|| split_vec_doubling(black_box(*n), value)), ); } } fn bench_grow(c: &mut Criterion) { let treatments = vec![1_024, 16_384, 262_144, 4_194_304]; let mut group = c.benchmark_group("grow"); const N: usize = 16; test_for_type(&mut group, N, &treatments, get_value::); group.finish(); } criterion_group!(benches, bench_grow); criterion_main!(benches);