internal: improve compile times a bit

before after for cargo llvm-lines -q --lib --release -p ide_ssr | head -n 24

  Lines          Copies        Function name
  -----          ------        -------------
  297146 (100%)  12748 (100%)  (TOTAL)
    5970 (2.0%)     47 (0.4%)  core::iter::traits::iterator::Iterator::try_fold
    4750 (1.6%)     27 (0.2%)  hashbrown::raw::RawTable<T,A>::resize
    4080 (1.4%)     30 (0.2%)  alloc::raw_vec::RawVec<T,A>::grow_amortized
    3933 (1.3%)     69 (0.5%)  alloc::raw_vec::RawVec<T,A>::current_memory
    3668 (1.2%)     89 (0.7%)  <core::result::Result<T,E> as core::ops::try_trait::Try>::branch
    3500 (1.2%)     50 (0.4%)  hashbrown::raw::RawTable<T,A>::drop_elements
    3436 (1.2%)     33 (0.3%)  hashbrown::raw::RawTable<T,A>::find
    3415 (1.1%)     17 (0.1%)  hashbrown::raw::RawTable<T,A>::rehash_in_place
    3400 (1.1%)     50 (0.4%)  <hashbrown::raw::RawIterRange<T> as core::iter::traits::iterator::Iterator>::next
    2840 (1.0%)     20 (0.2%)  alloc::raw_vec::RawVec<T,A>::allocate_in
    2700 (0.9%)     30 (0.2%)  core::alloc::layout::Layout::array
    2666 (0.9%)     86 (0.7%)  core::ptr::metadata::from_raw_parts_mut
    2495 (0.8%)     50 (0.4%)  core::option::Option<T>::map
    2354 (0.8%)     38 (0.3%)  alloc::alloc::box_free
    2302 (0.8%)      7 (0.1%)  ide_ssr::parsing::RuleBuilder::try_add
    2146 (0.7%)     45 (0.4%)  core::mem::replace
    2070 (0.7%)     69 (0.5%)  <alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop
    1979 (0.7%)     16 (0.1%)  hashbrown::map::HashMap<K,V,S,A>::insert
    1926 (0.6%)     18 (0.1%)  <core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next
    1922 (0.6%)     62 (0.5%)  core::fmt::ArgumentV1::new
    1885 (0.6%)     13 (0.1%)  alloc::raw_vec::RawVec<T,A>::shrink

  Lines          Copies        Function name
  -----          ------        -------------
  261717 (100%)  11666 (100%)  (TOTAL)
    5239 (2.0%)     42 (0.4%)  core::iter::traits::iterator::Iterator::try_fold
    4750 (1.8%)     27 (0.2%)  hashbrown::raw::RawTable<T,A>::resize
    3933 (1.5%)     69 (0.6%)  alloc::raw_vec::RawVec<T,A>::current_memory
    3536 (1.4%)     26 (0.2%)  alloc::raw_vec::RawVec<T,A>::grow_amortized
    3500 (1.3%)     50 (0.4%)  hashbrown::raw::RawTable<T,A>::drop_elements
    3400 (1.3%)     50 (0.4%)  <hashbrown::raw::RawIterRange<T> as core::iter::traits::iterator::Iterator>::next
    3124 (1.2%)     30 (0.3%)  hashbrown::raw::RawTable<T,A>::find
    2812 (1.1%)     14 (0.1%)  hashbrown::raw::RawTable<T,A>::rehash_in_place
    2604 (1.0%)     84 (0.7%)  core::ptr::metadata::from_raw_parts_mut
    2340 (0.9%)     26 (0.2%)  core::alloc::layout::Layout::array
    2302 (0.9%)      7 (0.1%)  ide_ssr::parsing::RuleBuilder::try_add
    2272 (0.9%)     16 (0.1%)  alloc::raw_vec::RawVec<T,A>::allocate_in
    2201 (0.8%)     35 (0.3%)  alloc::alloc::box_free
    2104 (0.8%)     44 (0.4%)  core::mem::replace
    2079 (0.8%)     42 (0.4%)  <core::result::Result<T,E> as core::ops::try_trait::Try>::branch
    2070 (0.8%)     69 (0.6%)  <alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop
    1926 (0.7%)     18 (0.2%)  <core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next
    1885 (0.7%)     13 (0.1%)  alloc::raw_vec::RawVec<T,A>::shrink
    1833 (0.7%)     13 (0.1%)  hashbrown::raw::RawTable<T,A>::shrink_to
    1771 (0.7%)     91 (0.8%)  core::ptr::read
    1701 (0.6%)     35 (0.3%)  core::option::Option<T>::map
This commit is contained in:
Aleksey Kladov 2021-08-29 18:49:16 +03:00
parent 35d98070d2
commit 76b60efbfb
2 changed files with 77 additions and 16 deletions

View file

@ -2517,18 +2517,35 @@ impl Type {
krate: Crate, krate: Crate,
mut callback: impl FnMut(AssocItem) -> Option<T>, mut callback: impl FnMut(AssocItem) -> Option<T>,
) -> Option<T> { ) -> Option<T> {
for krate in method_resolution::def_crates(db, &self.ty, krate.id)? { let mut slot = None;
self.iterate_assoc_items_dyn(db, krate, &mut |assoc_item_id| {
slot = callback(assoc_item_id.into());
slot.is_some()
});
slot
}
fn iterate_assoc_items_dyn(
self,
db: &dyn HirDatabase,
krate: Crate,
callback: &mut dyn FnMut(AssocItemId) -> bool,
) {
let def_crates = match method_resolution::def_crates(db, &self.ty, krate.id) {
Some(it) => it,
None => return,
};
for krate in def_crates {
let impls = db.inherent_impls_in_crate(krate); let impls = db.inherent_impls_in_crate(krate);
for impl_def in impls.for_self_ty(&self.ty) { for impl_def in impls.for_self_ty(&self.ty) {
for &item in db.impl_data(*impl_def).items.iter() { for &item in db.impl_data(*impl_def).items.iter() {
if let Some(result) = callback(item.into()) { if callback(item) {
return Some(result); return;
} }
} }
} }
} }
None
} }
pub fn type_arguments(&self) -> impl Iterator<Item = Type> + '_ { pub fn type_arguments(&self) -> impl Iterator<Item = Type> + '_ {
@ -2550,6 +2567,31 @@ impl Type {
mut callback: impl FnMut(&Ty, Function) -> Option<T>, mut callback: impl FnMut(&Ty, Function) -> Option<T>,
) -> Option<T> { ) -> Option<T> {
let _p = profile::span("iterate_method_candidates"); let _p = profile::span("iterate_method_candidates");
let mut slot = None;
self.iterate_method_candidates_dyn(
db,
krate,
traits_in_scope,
name,
&mut |ty, assoc_item_id| match assoc_item_id {
AssocItemId::FunctionId(it) => {
slot = callback(ty, it.into());
slot.is_some()
}
AssocItemId::ConstId(_) | AssocItemId::TypeAliasId(_) => false,
},
);
slot
}
fn iterate_method_candidates_dyn(
&self,
db: &dyn HirDatabase,
krate: Crate,
traits_in_scope: &FxHashSet<TraitId>,
name: Option<&Name>,
callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool,
) {
// There should be no inference vars in types passed here // There should be no inference vars in types passed here
// FIXME check that? // FIXME check that?
// FIXME replace Unknown by bound vars here // FIXME replace Unknown by bound vars here
@ -2559,7 +2601,7 @@ impl Type {
let env = self.env.clone(); let env = self.env.clone();
let krate = krate.id; let krate = krate.id;
method_resolution::iterate_method_candidates( method_resolution::iterate_method_candidates_dyn(
&canonical, &canonical,
db, db,
env, env,
@ -2568,11 +2610,8 @@ impl Type {
None, None,
name, name,
method_resolution::LookupMode::MethodCall, method_resolution::LookupMode::MethodCall,
|ty, it| match it { callback,
AssocItemId::FunctionId(f) => callback(ty, f.into()), );
_ => None,
},
)
} }
pub fn iterate_path_candidates<T>( pub fn iterate_path_candidates<T>(
@ -2584,12 +2623,34 @@ impl Type {
mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>, mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>,
) -> Option<T> { ) -> Option<T> {
let _p = profile::span("iterate_path_candidates"); let _p = profile::span("iterate_path_candidates");
let mut slot = None;
self.iterate_path_candidates_dyn(
db,
krate,
traits_in_scope,
name,
&mut |ty, assoc_item_id| {
slot = callback(ty, assoc_item_id.into());
slot.is_some()
},
);
slot
}
fn iterate_path_candidates_dyn(
&self,
db: &dyn HirDatabase,
krate: Crate,
traits_in_scope: &FxHashSet<TraitId>,
name: Option<&Name>,
callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool,
) {
let canonical = hir_ty::replace_errors_with_variables(&self.ty); let canonical = hir_ty::replace_errors_with_variables(&self.ty);
let env = self.env.clone(); let env = self.env.clone();
let krate = krate.id; let krate = krate.id;
method_resolution::iterate_method_candidates( method_resolution::iterate_method_candidates_dyn(
&canonical, &canonical,
db, db,
env, env,
@ -2598,8 +2659,8 @@ impl Type {
None, None,
name, name,
method_resolution::LookupMode::Path, method_resolution::LookupMode::Path,
|ty, it| callback(ty, it.into()), callback,
) );
} }
pub fn as_adt(&self) -> Option<Adt> { pub fn as_adt(&self) -> Option<Adt> {

View file

@ -422,7 +422,7 @@ pub fn iterate_method_candidates<T>(
mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>, mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>,
) -> Option<T> { ) -> Option<T> {
let mut slot = None; let mut slot = None;
iterate_method_candidates_impl( iterate_method_candidates_dyn(
ty, ty,
db, db,
env, env,
@ -440,7 +440,7 @@ pub fn iterate_method_candidates<T>(
slot slot
} }
fn iterate_method_candidates_impl( pub fn iterate_method_candidates_dyn(
ty: &Canonical<Ty>, ty: &Canonical<Ty>,
db: &dyn HirDatabase, db: &dyn HirDatabase,
env: Arc<TraitEnvironment>, env: Arc<TraitEnvironment>,