diff --git a/Cargo.toml b/Cargo.toml index c7667ab..7ddc0d1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" [dev-dependencies] criterion = "0.3.1" +rand="0.7.3" [[bench]] name = "benches" diff --git a/benches/benches.rs b/benches/benches.rs index 93170ba..3167106 100644 --- a/benches/benches.rs +++ b/benches/benches.rs @@ -1,54 +1,102 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{criterion_group, criterion_main, Criterion}; +use grid::grid; use grid::Grid; +use rand::Rng; -fn init_vec_vec(size: usize) -> Vec> { - vec![vec![0; size]; size] +const SIZE: usize = 1000; + +fn init_vec_vec() -> Vec> { + vec![vec![0; SIZE]; SIZE] } -fn init_vec_flat(size: usize) -> Vec { - vec![0; size * size] +fn init_vec_flat() -> Vec { + vec![0; SIZE * SIZE] } -fn init_grid(size: usize) -> Grid { - Grid::init(size, size, 0) +fn init_grid() -> Grid { + Grid::init(SIZE, SIZE, 0) } fn criterion_benchmark(c: &mut Criterion) { + let mut rng = rand::thread_rng(); + let mut rand = || rng.gen_range(0, SIZE); + + let mut rng_u32 = rand::thread_rng(); + let mut rand_u32 = || rng_u32.gen::(); + + // Init macro + c.bench_function("Macro init vec vec", |b| { + b.iter(|| { + vec![ + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + ] + }) + }); + c.bench_function("Macro init vec flat", |b| { + b.iter(|| { + vec![ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + ] + }) + }); + c.bench_function("Macro init grid", |b| { + b.iter(|| { + grid![[0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9] + [0,1,2,3,4,5,6,7,8,9]] + }) + }); + // New - c.bench_function("Init vec vec 10x10", |b| { - b.iter(|| init_vec_vec(black_box(10))) - }); - c.bench_function("Init vec flat 10x10", |b| { - b.iter(|| init_vec_flat(black_box(10))) - }); - c.bench_function("Init grid 10x10", |b| b.iter(|| init_grid(black_box(10)))); + c.bench_function("Init vec vec", |b| b.iter(|| init_vec_vec())); + c.bench_function("Init vec flat", |b| b.iter(|| init_vec_flat())); + c.bench_function("Init grid", |b| b.iter(|| init_grid())); // Get - c.bench_function("Idx vec vec 10x10", |b| { - let vec_vec = init_vec_vec(10); - b.iter(|| vec_vec[black_box(2)][black_box(3)]) + c.bench_function("Idx vec vec", |b| { + let vec_vec = init_vec_vec(); + b.iter(|| vec_vec[rand()][rand()]) }); - c.bench_function("Idx grid 10x10", |b| { - let grid = init_grid(10); - b.iter(|| grid[black_box(2)][black_box(3)]) + c.bench_function("Idx grid", |b| { + let grid = init_grid(); + b.iter(|| grid[rand()][rand()]) }); - c.bench_function("Get_fn vec vec 10x10", |b| { - let vec_vec = init_vec_vec(10); - b.iter(|| vec_vec.get(black_box(2)).unwrap().get(black_box(3))) + c.bench_function("Get_fn vec vec", |b| { + let vec_vec = init_vec_vec(); + b.iter(|| vec_vec.get(rand()).unwrap().get(rand())) }); - c.bench_function("Get_fn grid 10x10", |b| { - let grid = init_grid(10); - b.iter(|| grid.get(black_box(2), black_box(3))) + c.bench_function("Get_fn grid", |b| { + let grid = init_grid(); + b.iter(|| grid.get(rand(), rand())) }); //Set - c.bench_function("Set vec vec 10x10", |b| { - let mut vec_vec = init_vec_vec(10); - b.iter(|| vec_vec[black_box(2)][black_box(3)] = 2) + c.bench_function("Set vec vec", |b| { + let mut vec_vec = init_vec_vec(); + b.iter(|| vec_vec[rand()][rand()] = rand_u32()) }); - c.bench_function("Set gird 10x10", |b| { - let mut gird = init_grid(10); - b.iter(|| gird[black_box(2)][black_box(3)] = 2) + c.bench_function("Set gird", |b| { + let mut gird = init_grid(); + b.iter(|| gird[rand()][rand()] = rand_u32()) }); } diff --git a/src/lib.rs b/src/lib.rs index 76a8b06..01193ca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -132,8 +132,8 @@ impl Grid { /// Returns None if an element beyond the grid bounds is tried to be accessed. pub fn get(&self, row: usize, col: usize) -> Option<&T> { if row < self.rows && col < self.cols() { - //unsafe { Some(&self.index(row).get_unchecked(col)) } - Some(&self.data[row * self.cols() + col]) + unsafe { Some(&self.data.get_unchecked(row * self.cols() + col)) } + //Some(&self.data.get_unchecked(row * self.cols() + col)) } else { None }