-
Notifications
You must be signed in to change notification settings - Fork 141
Open
Labels
area/deserializationperformanceImproves performance of existing featuresImproves performance of existing features
Milestone
Description
This is an issue I found when testing the performance of vector type, but apparently this applies to all collections.
The code uses itertools to collect fallible items into a Vec<Result<...>>:
ListlikeIterator::<'frame, T>::deserialize(typ, v)
.and_then(|it| it.collect::<Result<_, DeserializationError>>())
.map_err(deser_error_replace_rust_name::<Self>)
Unfortunately itertools does not use the size hint in this case and does not reserve proper space in the returned vector.
Instead, it grows the vector as more items are added.
Also it the size hint for ListLikeIterator doesn't look correct anyways (it delegates to raw iterator, which provides the default None hint).
This can be trivially fixed by creating the vector with proper capacity first (we know the number of elements very early on and it is stored in the field of ListLikeIterator) and then adding the items with e.g. extend.
wprzytula
Metadata
Metadata
Assignees
Labels
area/deserializationperformanceImproves performance of existing featuresImproves performance of existing features