From 7cd6f12926295476d162e21e315ee72671985cd2 Mon Sep 17 00:00:00 2001 From: Michal Terepeta Date: Fri, 3 Jan 2020 13:59:46 +0100 Subject: [PATCH 1/2] Split `crate_def_map` into two methods This change: - introduces `compute_crate_def_map` query and renames `CrateDefMap::crate_def_map_query` for consistency, - annotates `crate_def_map` as `salsa::transparent` and adds a top-level `crate_def_map` wrapper function around that starts the profiler and immediately calls into `compute_crate_def_map` query. This allows us to better understand where we spent the time, in particular, how much is spent in the recomputaiton and how much in salsa. Example output (where we don't actually re-compute anything, but the query still takes a non-trivial amount of time): ``` 211ms - handle_inlay_hints 150ms - get_inlay_hints 150ms - SourceAnalyzer::new 65ms - def_with_body_from_child_node 65ms - analyze_container 65ms - analyze_container 65ms - Module::from_definition 65ms - Module::from_file 65ms - crate_def_map 1ms - parse_macro_query (6 calls) 0ms - raw_items_query (1 calls) 64ms - ??? ``` Signed-off-by: Michal Terepeta --- crates/ra_hir/src/db.rs | 10 +++++----- crates/ra_hir_def/src/db.rs | 11 ++++++++++- crates/ra_hir_def/src/nameres.rs | 4 ++-- crates/ra_ide/src/change.rs | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index f5ffd64fa7b..0af4a286836 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -1,11 +1,11 @@ //! FIXME: write short doc here pub use hir_def::db::{ - BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery, - DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery, - FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, InternDatabaseStorage, - LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, StaticDataQuery, StructDataQuery, - TraitDataQuery, TypeAliasDataQuery, + BodyQuery, BodyWithSourceMapQuery, ComputeCrateDefMapQuery, ConstDataQuery, + CrateLangItemsQuery, DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, + ExprScopesQuery, FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, + InternDatabaseStorage, LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, StaticDataQuery, + StructDataQuery, TraitDataQuery, TypeAliasDataQuery, }; pub use hir_expand::db::{ AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery, diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index c55fd411107..a348f37bc21 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs @@ -3,6 +3,7 @@ use hir_expand::{db::AstDatabase, HirFileId}; use ra_db::{salsa, CrateId, SourceDatabase}; +use ra_prof::profile; use ra_syntax::SmolStr; use crate::{ @@ -46,9 +47,12 @@ pub trait DefDatabase: InternDatabase + AstDatabase { #[salsa::invoke(RawItems::raw_items_query)] fn raw_items(&self, file_id: HirFileId) -> Arc; - #[salsa::invoke(CrateDefMap::crate_def_map_query)] + #[salsa::transparent] fn crate_def_map(&self, krate: CrateId) -> Arc; + #[salsa::invoke(CrateDefMap::compute_crate_def_map)] + fn compute_crate_def_map(&self, krate: CrateId) -> Arc; + #[salsa::invoke(StructData::struct_data_query)] fn struct_data(&self, id: StructId) -> Arc; #[salsa::invoke(StructData::union_data_query)] @@ -104,3 +108,8 @@ pub trait DefDatabase: InternDatabase + AstDatabase { #[salsa::invoke(Documentation::documentation_query)] fn documentation(&self, def: AttrDefId) -> Option; } + +fn crate_def_map(db: &impl DefDatabase, krate: CrateId) -> Arc { + let _p = profile("crate_def_map"); + db.compute_crate_def_map(krate) +} diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index 5d4ca73a398..43255f4a123 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs @@ -172,13 +172,13 @@ pub struct ModuleData { } impl CrateDefMap { - pub(crate) fn crate_def_map_query( + pub(crate) fn compute_crate_def_map( // Note that this doesn't have `+ AstDatabase`! // This gurantess that `CrateDefMap` is stable across reparses. db: &impl DefDatabase, krate: CrateId, ) -> Arc { - let _p = profile("crate_def_map_query"); + let _p = profile("compute_crate_def_map"); let def_map = { let crate_graph = db.crate_graph(); let edition = crate_graph.edition(krate); diff --git a/crates/ra_ide/src/change.rs b/crates/ra_ide/src/change.rs index 387a9cafb65..4585bf522d0 100644 --- a/crates/ra_ide/src/change.rs +++ b/crates/ra_ide/src/change.rs @@ -309,7 +309,7 @@ macro_rules! sweep_each_query { hir::db::EnumDataQuery hir::db::TraitDataQuery hir::db::RawItemsQuery - hir::db::CrateDefMapQuery + hir::db::ComputeCrateDefMapQuery hir::db::GenericParamsQuery hir::db::FunctionDataQuery hir::db::TypeAliasDataQuery From 2e2e4435605b8fdabb36f018c2d6cba1fd0069b8 Mon Sep 17 00:00:00 2001 From: Michal Terepeta Date: Fri, 3 Jan 2020 14:20:04 +0100 Subject: [PATCH 2/2] Add `_query` suffix to `compute_crate_def_map` for consistency Signed-off-by: Michal Terepeta --- crates/ra_hir_def/src/db.rs | 2 +- crates/ra_hir_def/src/nameres.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index a348f37bc21..da273eb1155 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs @@ -50,7 +50,7 @@ pub trait DefDatabase: InternDatabase + AstDatabase { #[salsa::transparent] fn crate_def_map(&self, krate: CrateId) -> Arc; - #[salsa::invoke(CrateDefMap::compute_crate_def_map)] + #[salsa::invoke(CrateDefMap::compute_crate_def_map_query)] fn compute_crate_def_map(&self, krate: CrateId) -> Arc; #[salsa::invoke(StructData::struct_data_query)] diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index 43255f4a123..4d210eab12e 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs @@ -172,7 +172,7 @@ pub struct ModuleData { } impl CrateDefMap { - pub(crate) fn compute_crate_def_map( + pub(crate) fn compute_crate_def_map_query( // Note that this doesn't have `+ AstDatabase`! // This gurantess that `CrateDefMap` is stable across reparses. db: &impl DefDatabase,