From d83aeebcca399871bb8e9348b0ebf05bfe024e44 Mon Sep 17 00:00:00 2001 From: "Jeff Washington (jwash)" <75863576+jeffwashington@users.noreply.github.com> Date: Tue, 16 Feb 2021 14:24:45 -0600 Subject: [PATCH] change 2d cumulative calculation (#15346) --- runtime/src/accounts_db.rs | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/runtime/src/accounts_db.rs b/runtime/src/accounts_db.rs index 103b3c34ae..458fd1178b 100644 --- a/runtime/src/accounts_db.rs +++ b/runtime/src/accounts_db.rs @@ -283,26 +283,20 @@ impl CumulativeOffsets { pub fn from_raw_2d(raw: &[Vec>]) -> CumulativeOffsets { let mut total_count: usize = 0; - let cumulative_offsets: Vec = raw - .iter() - .enumerate() - .map(|(i, v)| { - v.iter() - .enumerate() - .filter_map(|(j, v)| { - let len = v.len(); - if len > 0 { - let result = CumulativeOffset::new(vec![i, j], total_count); - total_count += len; - Some(result) - } else { - None - } - }) - .collect::>() - }) - .flatten() - .collect(); + let mut cumulative_offsets = Vec::with_capacity(0); + for (i, v_outer) in raw.iter().enumerate() { + for (j, v) in v_outer.iter().enumerate() { + let len = v.len(); + if len > 0 { + if cumulative_offsets.is_empty() { + // the first inner, non-empty vector we find gives us an approximate rectangular shape + cumulative_offsets = Vec::with_capacity(raw.len() * v_outer.len()); + } + cumulative_offsets.push(CumulativeOffset::new(vec![i, j], total_count)); + total_count += len; + } + } + } Self { cumulative_offsets,