From 31fef237b639fac3a1b719110fa0cfad3df44332 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B6rn=20Steinbrink?= Date: Sat, 27 Feb 2016 00:53:33 +0100 Subject: [PATCH] Avoid excessive reallocations during item-bodies checking When foldings Substs, we map over VecPerParamSpace instances using EnumeratedItems which does not provide an accurate size_hint() in its Iterator implementation. This leads to quite a large number or reallocations. Providing a suitable size_hint() implementation reduces the time spent in item-bodies checking quite a bit. ``` crate | before | after | ~change -------|------------------------- core | 7.28s | 5.44s | -25% std | 2.07s | 1.88s | -9.2% syntax | 8.86s | 8.30s | -6.3% ``` --- src/librustc/middle/subst.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/librustc/middle/subst.rs b/src/librustc/middle/subst.rs index ddc817ffc02..f8c6d3d9341 100644 --- a/src/librustc/middle/subst.rs +++ b/src/librustc/middle/subst.rs @@ -555,6 +555,11 @@ fn next(&mut self) -> Option<(ParamSpace, usize, &'a T)> { None } } + + fn size_hint(&self) -> (usize, Option) { + let size = self.vec.as_slice().len(); + (size, Some(size)) + } } impl IntoIterator for VecPerParamSpace { -- 2.44.0