Pre-allocate vectors in SSZ decoding (#3417)
## Issue Addressed
Fixes a potential regression in memory fragmentation identified by @paulhauner here: https://github.com/sigp/lighthouse/pull/3371#discussion_r931770045.
## Proposed Changes
Immediately allocate a vector with sufficient size to hold all decoded elements in SSZ decoding. The `size_hint` is derived from the range iterator here:
2983235650/consensus/ssz/src/decode/impls.rs (L489)
## Additional Info
I'd like to test this out on some infra for a substantial duration to see if it affects total fragmentation.
This commit is contained in:
parent
b0b606dabe
commit
5b2843c2cd
@ -29,11 +29,18 @@ pub trait TryFromIter<T>: Sized {
|
||||
impl<T> TryFromIter<T> for Vec<T> {
|
||||
type Error = Infallible;
|
||||
|
||||
fn try_from_iter<I>(iter: I) -> Result<Self, Self::Error>
|
||||
fn try_from_iter<I>(values: I) -> Result<Self, Self::Error>
|
||||
where
|
||||
I: IntoIterator<Item = T>,
|
||||
{
|
||||
Ok(Self::from_iter(iter))
|
||||
// Pre-allocate the expected size of the Vec, which is parsed from the SSZ input bytes as
|
||||
// `num_items`. This length has already been checked to be less than or equal to the type's
|
||||
// maximum length in `decode_list_of_variable_length_items`.
|
||||
let iter = values.into_iter();
|
||||
let (_, opt_max_len) = iter.size_hint();
|
||||
let mut vec = Vec::with_capacity(opt_max_len.unwrap_or(0));
|
||||
vec.extend(iter);
|
||||
Ok(vec)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user