use std::time::Duration; use criterion::{black_box, criterion_group, criterion_main, Criterion}; use jaggedarray::jagged_array::{JaggedArray, JaggedArrayViewTrait}; use num::{cast::AsPrimitive, traits::{ConstOne, ConstZero, NumAssignOps}, Num}; fn nested_2d_vector_iteration(data: &Vec>) -> usize { let mut result = 0; for i in data { for j in i { result += j; } } result } fn nested_3d_vector_iteration(data: &Vec>>) -> usize { let mut result = 0; for i in data { for j in i { for k in j { result += k; } } } result } fn get_2d_nested_vector(iteration: usize) -> Vec> { (0..iteration) .map(|x| { let a = (0..x + 1).collect::>(); let a = a.leak(); // simulate other allocations in real workload a.to_vec() }) .collect::>() } fn get_3d_nested_vector(iteration: usize) -> Vec>> { (0..iteration) .map(|x| { (0..x + 1) .map(|y| { let a = (0..y + 1).collect::>(); let a = a.leak(); // simulate other allocations in real workload a.to_vec() }) .collect::>() }) .collect::>() } fn nested_2d_jagged_array_iteration + Num+ConstOne+ConstZero>( data: &JaggedArray, 2>, ) -> usize { let mut result = 0; unsafe { let len = data.len(); for i in 0..len { let view = data.view_unchecked::<1, 1>([i]); for j in 0..view.len() { result += view.get_unchecked([j]); } } } result } fn nested_3d_jagged_array_iteration + Num+ConstOne+ConstZero>( data: &JaggedArray, 3>, ) -> usize { let mut result = 0; unsafe { let dims = data.len(); for i in 0..dims { let view = data.view_unchecked::<1, 2>([i]); for j in 0..view.len() { let view = view.view_unchecked::<1, 1>([j]); for k in 0..view.len() { result += view.get_unchecked([k]); } } } } result } fn get_2d_jagged_array + Num + NumAssignOps + std::cmp::PartialOrd+ConstOne+ConstZero>( iteration: usize, ) -> JaggedArray, 2> where usize: AsPrimitive { let mut a = JaggedArray::, 2>::new(); for i in 0..iteration { a.new_row::<0>(); for j in 0..i + 1 { a.push_to_last_row(j); } } a } fn get_3d_jagged_array + Num + NumAssignOps + std::cmp::PartialOrd+ConstOne+ConstZero>( iteration: usize, ) -> JaggedArray, 3> where usize: AsPrimitive { let mut a = JaggedArray::, 3>::new(); for i in 0..iteration { a.new_row::<0>(); for j in 0..i + 1 { a.new_row::<1>(); for k in 0..j + 1 { a.push_to_last_row(k); } } } a } fn criterion_benchmark(c: &mut Criterion) { let mut group = c.benchmark_group("sample-size"); // Configure Criterion.rs to detect smaller differences and increase sample size to improve // precision and counteract the resulting noise. group.sample_size(300).measurement_time(Duration::from_secs(8)); let a = get_2d_nested_vector(10); group.bench_function("2d nested vector iteration 10", |b| { b.iter(|| nested_2d_vector_iteration(black_box(&a))) }); let a = get_2d_jagged_array::(10); group.bench_function("2d jagged array iteration 10", |b| { b.iter(|| nested_2d_jagged_array_iteration(black_box(&a))) }); let a = get_2d_nested_vector(100); group.bench_function("2d nested vector iteration 100", |b| { b.iter(|| nested_2d_vector_iteration(black_box(&a))) }); let a = get_2d_jagged_array::(100); group.bench_function("2d jagged array iteration 100", |b| { b.iter(|| nested_2d_jagged_array_iteration(black_box(&a))) }); let a = get_2d_nested_vector(1000); group.bench_function("2d nested vector iteration 1000", |b| { b.iter(|| nested_2d_vector_iteration(black_box(&a))) }); let a = get_2d_jagged_array::(1000); group.bench_function("2d jagged array iteration 1000", |b| { b.iter(|| nested_2d_jagged_array_iteration(black_box(&a))) }); let a = get_2d_jagged_array::(1000); group.bench_function("2d jagged array iteration 1000(U32)", |b| { b.iter(|| nested_2d_jagged_array_iteration(black_box(&a))) }); let a = get_2d_nested_vector(10000); group.bench_function("2d nested vector iteration 10000", |b| { b.iter(|| nested_2d_vector_iteration(black_box(&a))) }); let a = get_2d_jagged_array::(10000); group.bench_function("2d jagged array iteration 10000", |b| { b.iter(|| nested_2d_jagged_array_iteration(black_box(&a))) }); let a = get_2d_jagged_array::(10000); group.bench_function("2d jagged array iteration 10000(U32)", |b| { b.iter(|| nested_2d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_nested_vector(10); group.bench_function("3d nested vector iteration 10", |b| { b.iter(|| nested_3d_vector_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(10); group.bench_function("3d jagged array iteration 10", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(10); group.bench_function("3d jagged array iteration 10(U16)", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_nested_vector(33); group.bench_function("3d nested vector iteration 33", |b| { b.iter(|| nested_3d_vector_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(33); group.bench_function("3d jagged array iteration 33", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(33); group.bench_function("3d jagged array iteration 33(U16)", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_nested_vector(100); group.bench_function("3d nested vector iteration 100", |b| { b.iter(|| nested_3d_vector_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(100); group.bench_function("3d jagged array iteration 100", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(100); group.bench_function("3d jagged array iteration 100(U32)", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_nested_vector(500); group.bench_function("3d nested vector iteration 500", |b| { b.iter(|| nested_3d_vector_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(500); group.bench_function("3d jagged array iteration 500", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); let a = get_3d_jagged_array::(500); group.bench_function("3d jagged array iteration 500(U32)", |b| { b.iter(|| nested_3d_jagged_array_iteration(black_box(&a))) }); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches);