Skip to content

Commit

Permalink
Rollup merge of rust-lang#53019 - ljedrz:bad_collects, r=estebank
Browse files Browse the repository at this point in the history
Don't collect() when size_hint is useless

This adjusts PRs rust-lang#52738 and rust-lang#52697 by falling back to calculating capacity and extending or pushing in a loop where `collect()` can't be trusted to calculate the right capacity.

It is a performance win.
kennytm authored Aug 10, 2018
2 parents a77dfcc + b68b396 commit 3e13393
Showing 3 changed files with 18 additions and 7 deletions.
12 changes: 7 additions & 5 deletions src/librustc/infer/outlives/obligations.rs
Original file line number Diff line number Diff line change
@@ -151,12 +151,14 @@ impl<'cx, 'gcx, 'tcx> InferCtxt<'cx, 'gcx, 'tcx> {
debug!("process_registered_region_obligations()");

// pull out the region obligations with the given `body_id` (leaving the rest)
let my_region_obligations = {
let mut my_region_obligations = Vec::with_capacity(self.region_obligations.borrow().len());
{
let mut r_o = self.region_obligations.borrow_mut();
let my_r_o = r_o.drain_filter(|(ro_body_id, _)| *ro_body_id == body_id)
.map(|(_, obligation)| obligation).collect::<Vec<_>>();
my_r_o
};
my_region_obligations.extend(
r_o.drain_filter(|(ro_body_id, _)| *ro_body_id == body_id)
.map(|(_, obligation)| obligation)
);
}

let outlives = &mut TypeOutlives::new(
self,
7 changes: 6 additions & 1 deletion src/librustc_data_structures/small_vec.rs
Original file line number Diff line number Diff line change
@@ -210,7 +210,12 @@ impl<A> Decodable for SmallVec<A>
A::Element: Decodable {
fn decode<D: Decoder>(d: &mut D) -> Result<SmallVec<A>, D::Error> {
d.read_seq(|d, len| {
(0..len).map(|i| d.read_seq_elt(i, |d| Decodable::decode(d))).collect()
let mut vec = SmallVec::with_capacity(len);
// FIXME(#48994) - could just be collected into a Result<SmallVec, D::Error>
for i in 0..len {
vec.push(d.read_seq_elt(i, |d| Decodable::decode(d))?);
}
Ok(vec)
})
}
}
6 changes: 5 additions & 1 deletion src/libsyntax/ast.rs
Original file line number Diff line number Diff line change
@@ -501,7 +501,11 @@ impl Pat {
PatKind::Slice(pats, None, _) if pats.len() == 1 =>
pats[0].to_ty().map(TyKind::Slice)?,
PatKind::Tuple(pats, None) => {
let tys = pats.iter().map(|pat| pat.to_ty()).collect::<Option<Vec<_>>>()?;
let mut tys = Vec::with_capacity(pats.len());
// FIXME(#48994) - could just be collected into an Option<Vec>
for pat in pats {
tys.push(pat.to_ty()?);
}
TyKind::Tup(tys)
}
_ => return None,

0 comments on commit 3e13393

Please sign in to comment.