From f28b3a32811b0bb89a38812f7fc7bd08a97a0425 Mon Sep 17 00:00:00 2001 From: becheran Date: Sat, 13 Aug 2022 11:07:39 +0200 Subject: [PATCH] Speedup idx function --- benches/benches.rs | 10 +++++----- src/lib.rs | 28 ++++++++++++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/benches/benches.rs b/benches/benches.rs index bde95d1..04bebbb 100644 --- a/benches/benches.rs +++ b/benches/benches.rs @@ -83,7 +83,7 @@ fn criterion_benchmark(c: &mut Criterion) { b.iter_batched( || (rand(), rand()), |(x, y)| { - let _v = vec_vec[criterion::black_box(x)][criterion::black_box(y)]; + let _v = vec_vec[x][y]; }, criterion::BatchSize::SmallInput, ) @@ -92,7 +92,7 @@ fn criterion_benchmark(c: &mut Criterion) { let grid = init_grid(); b.iter_batched( || (rand(), rand()), - |(x, y)| grid[criterion::black_box(x)][criterion::black_box(y)], + |(x, y)| grid[x][y], criterion::BatchSize::SmallInput, ) }); @@ -102,9 +102,9 @@ fn criterion_benchmark(c: &mut Criterion) { || (rand(), rand()), |(x, y)| { let _v = vec_vec - .get(criterion::black_box(x)) + .get(x) .unwrap() - .get(criterion::black_box(y)) + .get(y) .unwrap(); }, criterion::BatchSize::SmallInput, @@ -116,7 +116,7 @@ fn criterion_benchmark(c: &mut Criterion) { || (rand(), rand()), |(x, y)| { let _v = grid - .get(criterion::black_box(x), criterion::black_box(y)) + .get(x, y) .unwrap(); }, criterion::BatchSize::SmallInput, diff --git a/src/lib.rs b/src/lib.rs index 09a4776..15a7dfa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -723,22 +723,19 @@ impl Clone for Grid { impl Index for Grid { type Output = [T]; - fn index(&self, idx: usize) -> &Self::Output { - if idx < self.rows { - let start_idx = idx * self.cols; - &self.data[start_idx..start_idx + self.cols] - } else { - panic!( - "index {:?} out of bounds. Grid has {:?} rows.", - self.rows, idx - ); - } + #[inline] + fn index(&self, idx: usize) -> &[T] { + let start_idx = idx * self.cols; + &self.data[start_idx..start_idx + self.cols] } } impl IndexMut for Grid { - fn index_mut(&mut self, idx: usize) -> &mut Self::Output { - &mut self.data[(idx * self.cols)..] + + #[inline] + fn index_mut(&mut self, idx: usize) -> &mut [T] { + let start_idx = idx * self.cols; + &mut self.data[start_idx..start_idx + self.cols] } } @@ -1217,8 +1214,11 @@ mod test { #[test] fn idx() { - let grid = Grid::init(1, 2, 3); - assert_eq!(grid[0][0], 3); + let grid: Grid = Grid::from_vec(vec![1, 2, 3, 4], 2); + assert_eq!(grid[0][0], 1); + assert_eq!(grid[0][1], 2); + assert_eq!(grid[1][0], 3); + assert_eq!(grid[1][1], 4); } #[test]