diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-06-10 22:28:14 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2021-06-10 22:28:14 +0100 |
commit | c4c1fcb8e902adcc7879996fa7f53200fb36ce33 (patch) | |
tree | 47210c5b426680b218362ca4dd58f2ee79cf6244 /crates/hir/src | |
parent | f4da4de7cdd4a7dfe40a417b0100b83ec50d1e1d (diff) | |
parent | 690cd953273317ee4f3eaefd95bbd3538e929522 (diff) |
Merge #9206
9206: minor: Speed up fst items lookup during completions r=SomeoneToIgnore a=SomeoneToIgnore
Part of https://github.com/rust-analyzer/rust-analyzer/issues/7542
A number of profile calls added for `import_on_the_fly` contents.
Before:
<img width="606" alt="Screenshot 2021-06-11 at 00 19 13" src="https://user-images.githubusercontent.com/2690773/121598998-22321e80-ca4b-11eb-9a3d-dc9cb2936705.png">
After:
<img width="859" alt="Screenshot 2021-06-11 at 00 19 27" src="https://user-images.githubusercontent.com/2690773/121599022-2a8a5980-ca4b-11eb-82b6-13ab0ed56d58.png">
As a result, low hanging fruit was spotted: crazy amount of `fst_path` calls. Reducing that won ~200ms in the `import_on_the_fly @ sel` case in the `integrated_completion_benchmark`:
<img width="861" alt="Screenshot 2021-06-11 at 00 19 38" src="https://user-images.githubusercontent.com/2690773/121599277-7d641100-ca4b-11eb-8667-53206994de27.png">
I'm not sure how to proceed with the remaining `???` marks in such methods as `collect_import_map` though: there's nothing but library calls in cycles, but maybe I'll come up with something later.
Co-authored-by: Kirill Bulatov <[email protected]>
Diffstat (limited to 'crates/hir/src')
-rw-r--r-- | crates/hir/src/lib.rs | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index debc3ee62..b9c1dc44d 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -191,6 +191,7 @@ impl Crate { | |||
191 | db: &dyn DefDatabase, | 191 | db: &dyn DefDatabase, |
192 | query: import_map::Query, | 192 | query: import_map::Query, |
193 | ) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> { | 193 | ) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> { |
194 | let _p = profile::span("query_external_importables"); | ||
194 | import_map::search_dependencies(db, self.into(), query).into_iter().map(|item| match item { | 195 | import_map::search_dependencies(db, self.into(), query).into_iter().map(|item| match item { |
195 | ItemInNs::Types(mod_id) | ItemInNs::Values(mod_id) => Either::Left(mod_id.into()), | 196 | ItemInNs::Types(mod_id) | ItemInNs::Values(mod_id) => Either::Left(mod_id.into()), |
196 | ItemInNs::Macros(mac_id) => Either::Right(mac_id.into()), | 197 | ItemInNs::Macros(mac_id) => Either::Right(mac_id.into()), |
@@ -2185,6 +2186,7 @@ impl Type { | |||
2185 | name: Option<&Name>, | 2186 | name: Option<&Name>, |
2186 | mut callback: impl FnMut(&Ty, Function) -> Option<T>, | 2187 | mut callback: impl FnMut(&Ty, Function) -> Option<T>, |
2187 | ) -> Option<T> { | 2188 | ) -> Option<T> { |
2189 | let _p = profile::span("iterate_method_candidates"); | ||
2188 | // There should be no inference vars in types passed here | 2190 | // There should be no inference vars in types passed here |
2189 | // FIXME check that? | 2191 | // FIXME check that? |
2190 | // FIXME replace Unknown by bound vars here | 2192 | // FIXME replace Unknown by bound vars here |
@@ -2218,6 +2220,7 @@ impl Type { | |||
2218 | name: Option<&Name>, | 2220 | name: Option<&Name>, |
2219 | mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>, | 2221 | mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>, |
2220 | ) -> Option<T> { | 2222 | ) -> Option<T> { |
2223 | let _p = profile::span("iterate_path_candidates"); | ||
2221 | let canonical = hir_ty::replace_errors_with_variables(&self.ty); | 2224 | let canonical = hir_ty::replace_errors_with_variables(&self.ty); |
2222 | 2225 | ||
2223 | let env = self.env.clone(); | 2226 | let env = self.env.clone(); |
@@ -2255,6 +2258,7 @@ impl Type { | |||
2255 | &'a self, | 2258 | &'a self, |
2256 | db: &'a dyn HirDatabase, | 2259 | db: &'a dyn HirDatabase, |
2257 | ) -> impl Iterator<Item = Trait> + 'a { | 2260 | ) -> impl Iterator<Item = Trait> + 'a { |
2261 | let _p = profile::span("applicable_inherent_traits"); | ||
2258 | self.autoderef(db) | 2262 | self.autoderef(db) |
2259 | .filter_map(|derefed_type| derefed_type.ty.dyn_trait()) | 2263 | .filter_map(|derefed_type| derefed_type.ty.dyn_trait()) |
2260 | .flat_map(move |dyn_trait_id| hir_ty::all_super_traits(db.upcast(), dyn_trait_id)) | 2264 | .flat_map(move |dyn_trait_id| hir_ty::all_super_traits(db.upcast(), dyn_trait_id)) |