flatten_hash_intermediate sets capacity first (#17013)
* flatten_hash_intermediate sets capacity first * use iterator instead of for
This commit is contained in:
parent
a125388f6e
commit
5786be13a4
|
@ -484,7 +484,7 @@ impl AccountsHash {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn flatten_hash_intermediate<T>(
|
fn flatten_hash_intermediate<T>(
|
||||||
data_sections_by_pubkey: Vec<Vec<Vec<T>>>,
|
mut data_sections_by_pubkey: Vec<Vec<Vec<T>>>,
|
||||||
stats: &mut HashStats,
|
stats: &mut HashStats,
|
||||||
) -> Vec<Vec<T>>
|
) -> Vec<Vec<T>>
|
||||||
where
|
where
|
||||||
|
@ -500,22 +500,39 @@ impl AccountsHash {
|
||||||
let mut flatten_time = Measure::start("flatten");
|
let mut flatten_time = Measure::start("flatten");
|
||||||
let mut data_by_pubkey: Vec<Vec<T>> = vec![];
|
let mut data_by_pubkey: Vec<Vec<T>> = vec![];
|
||||||
let mut raw_len = 0;
|
let mut raw_len = 0;
|
||||||
for mut outer in data_sections_by_pubkey {
|
let mut lens = vec![];
|
||||||
let outer_len = outer.len();
|
// pass=0: calculate final lens, then allocate vecs with capacity
|
||||||
for pubkey_index in 0..outer_len {
|
// pass=1: copy data into vecs with correct capacity
|
||||||
let this_len = outer[pubkey_index].len();
|
for pass in 0..2 {
|
||||||
if this_len == 0 {
|
for outer in &mut data_sections_by_pubkey {
|
||||||
continue;
|
let outer_len = outer.len();
|
||||||
}
|
for pubkey_index in 0..outer_len {
|
||||||
raw_len += this_len;
|
let this_len = outer[pubkey_index].len();
|
||||||
let mut data = vec![];
|
if this_len == 0 {
|
||||||
std::mem::swap(&mut data, &mut outer[pubkey_index]);
|
continue;
|
||||||
|
}
|
||||||
|
if pass == 0 {
|
||||||
|
raw_len += this_len;
|
||||||
|
if lens.len() <= pubkey_index {
|
||||||
|
lens.extend(vec![0; pubkey_index - lens.len() + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
if data_by_pubkey.len() <= pubkey_index {
|
lens[pubkey_index] += outer[pubkey_index].len();
|
||||||
data_by_pubkey.extend(vec![vec![]; pubkey_index - data_by_pubkey.len() + 1]);
|
} else {
|
||||||
}
|
let mut data = vec![];
|
||||||
|
std::mem::swap(&mut data, &mut outer[pubkey_index]);
|
||||||
|
|
||||||
data_by_pubkey[pubkey_index].extend(data);
|
data_by_pubkey[pubkey_index].extend(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pass == 0 {
|
||||||
|
data_by_pubkey = lens
|
||||||
|
.iter()
|
||||||
|
.map(|len| Vec::with_capacity(*len))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
lens = vec![]; // we don't need this anymore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flatten_time.stop();
|
flatten_time.stop();
|
||||||
|
|
Loading…
Reference in New Issue