From 20af0b6fd68c50aaeda6fcda737e29ec0365d021 Mon Sep 17 00:00:00 2001 From: sxv20_ Date: Sat, 11 May 2019 20:32:41 +0100 Subject: [PATCH] cache a chunk while cloning to increase performance (?) Former-commit-id: 69c1fa67b13a8de49f2c73e9526f548779e988c1 --- common/src/volumes/vol_map.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/common/src/volumes/vol_map.rs b/common/src/volumes/vol_map.rs index e78e5f9ac7..453c0b2254 100644 --- a/common/src/volumes/vol_map.rs +++ b/common/src/volumes/vol_map.rs @@ -82,13 +82,29 @@ impl SampleVol for VolMap { let mut sample = Dyna::filled(range.size().map(|e| e as u32).into(), V::empty(), ()); + let mut last_chunk_pos = self.pos_key(range.min); + let mut last_chunk = self.get_key(last_chunk_pos); + for pos in sample.iter_positions() { + let new_chunk_pos = self.pos_key(range.min + pos); + if last_chunk_pos != new_chunk_pos { + last_chunk = self.get_key(new_chunk_pos); + last_chunk_pos = new_chunk_pos; + } sample .set( pos, - self.get(range.min + pos) - .map(|v| v.clone()) - .unwrap_or(V::empty()), + if let Some(chunk) = last_chunk { + chunk + .get(Self::chunk_offs(range.min + pos)) + .map(|v| v.clone()) + .unwrap_or(V::empty()) + // Fallback in case the chunk doesn't exist + } else { + self.get(range.min + pos) + .map(|v| v.clone()) + .unwrap_or(V::empty()) + }, ) .map_err(|err| VolMapErr::DynaErr(err))?; }