internal: split database loading time in anaysis-stats into components

This commit is contained in:
Aleksey Kladov 2021-08-31 14:38:52 +03:00
parent 5c704f11d2
commit 8dbf3832b2
2 changed files with 38 additions and 19 deletions

View File

@ -20,16 +20,16 @@
use itertools::Itertools; use itertools::Itertools;
use oorandom::Rand32; use oorandom::Rand32;
use profile::{Bytes, StopWatch}; use profile::{Bytes, StopWatch};
use project_model::CargoConfig; use project_model::{CargoConfig, ProjectManifest, ProjectWorkspace};
use rayon::prelude::*; use rayon::prelude::*;
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use stdx::format_to; use stdx::format_to;
use syntax::{AstNode, SyntaxNode}; use syntax::{AstNode, SyntaxNode};
use vfs::{Vfs, VfsPath}; use vfs::{AbsPathBuf, Vfs, VfsPath};
use crate::cli::{ use crate::cli::{
flags, flags,
load_cargo::{load_workspace_at, LoadCargoConfig}, load_cargo::{load_workspace, LoadCargoConfig},
print_memory_usage, print_memory_usage,
progress_report::ProgressReport, progress_report::ProgressReport,
report_metric, Result, Verbosity, report_metric, Result, Verbosity,
@ -50,7 +50,6 @@ pub fn run(self, verbosity: Verbosity) -> Result<()> {
Rand32::new(seed) Rand32::new(seed)
}; };
let mut db_load_sw = self.stop_watch();
let mut cargo_config = CargoConfig::default(); let mut cargo_config = CargoConfig::default();
cargo_config.no_sysroot = self.no_sysroot; cargo_config.no_sysroot = self.no_sysroot;
let load_cargo_config = LoadCargoConfig { let load_cargo_config = LoadCargoConfig {
@ -58,10 +57,33 @@ pub fn run(self, verbosity: Verbosity) -> Result<()> {
with_proc_macro: !self.disable_proc_macros, with_proc_macro: !self.disable_proc_macros,
prefill_caches: false, prefill_caches: false,
}; };
let (host, vfs, _proc_macro) = let no_progress = &|_| ();
load_workspace_at(&self.path, &cargo_config, &load_cargo_config, &|_| {})?;
let mut db_load_sw = self.stop_watch();
let path = AbsPathBuf::assert(env::current_dir()?.join(&self.path));
let manifest = ProjectManifest::discover_single(&path)?;
let mut workspace = ProjectWorkspace::load(manifest, &cargo_config, no_progress)?;
let metadata_time = db_load_sw.elapsed();
let build_scripts_time = if self.disable_build_scripts {
None
} else {
let mut build_scripts_sw = self.stop_watch();
let bs = workspace.run_build_scripts(&cargo_config, no_progress)?;
workspace.set_build_scripts(bs);
Some(build_scripts_sw.elapsed())
};
let (host, vfs, _proc_macro) = load_workspace(workspace, &load_cargo_config)?;
let db = host.raw_database(); let db = host.raw_database();
eprintln!("{:<20} {}", "Database loaded:", db_load_sw.elapsed()); eprint!("{:<20} {}", "Database loaded:", db_load_sw.elapsed());
eprint!(" (metadata {}", metadata_time);
if let Some(build_scripts_time) = build_scripts_time {
eprint!("; build {}", build_scripts_time);
}
eprintln!(")");
let mut analysis_sw = self.stop_watch(); let mut analysis_sw = self.stop_watch();
let mut num_crates = 0; let mut num_crates = 0;

View File

@ -8,7 +8,7 @@
use ide::{AnalysisHost, Change}; use ide::{AnalysisHost, Change};
use ide_db::base_db::CrateGraph; use ide_db::base_db::CrateGraph;
use proc_macro_api::ProcMacroClient; use proc_macro_api::ProcMacroClient;
use project_model::{CargoConfig, ProjectManifest, ProjectWorkspace, WorkspaceBuildScripts}; use project_model::{CargoConfig, ProjectManifest, ProjectWorkspace};
use vfs::{loader::Handle, AbsPath, AbsPathBuf}; use vfs::{loader::Handle, AbsPath, AbsPathBuf};
use crate::reload::{load_proc_macro, ProjectFolders, SourceRootConfig}; use crate::reload::{load_proc_macro, ProjectFolders, SourceRootConfig};
@ -31,9 +31,14 @@ pub fn load_workspace_at(
) -> Result<(AnalysisHost, vfs::Vfs, Option<ProcMacroClient>)> { ) -> Result<(AnalysisHost, vfs::Vfs, Option<ProcMacroClient>)> {
let root = AbsPathBuf::assert(std::env::current_dir()?.join(root)); let root = AbsPathBuf::assert(std::env::current_dir()?.join(root));
let root = ProjectManifest::discover_single(&root)?; let root = ProjectManifest::discover_single(&root)?;
let workspace = ProjectWorkspace::load(root, cargo_config, progress)?; let mut workspace = ProjectWorkspace::load(root, cargo_config, progress)?;
load_workspace(workspace, cargo_config, load_config, progress) if load_config.load_out_dirs_from_check {
let build_scripts = workspace.run_build_scripts(cargo_config, progress)?;
workspace.set_build_scripts(build_scripts)
}
load_workspace(workspace, load_config)
} }
// Note: Since this function is used by external tools that use rust-analyzer as a library // Note: Since this function is used by external tools that use rust-analyzer as a library
@ -42,10 +47,8 @@ pub fn load_workspace_at(
// The reason both, `load_workspace_at` and `load_workspace` are `pub` is that some of // The reason both, `load_workspace_at` and `load_workspace` are `pub` is that some of
// these tools need access to `ProjectWorkspace`, too, which `load_workspace_at` hides. // these tools need access to `ProjectWorkspace`, too, which `load_workspace_at` hides.
pub fn load_workspace( pub fn load_workspace(
mut ws: ProjectWorkspace, ws: ProjectWorkspace,
cargo_config: &CargoConfig,
load_config: &LoadCargoConfig, load_config: &LoadCargoConfig,
progress: &dyn Fn(String),
) -> Result<(AnalysisHost, vfs::Vfs, Option<ProcMacroClient>)> { ) -> Result<(AnalysisHost, vfs::Vfs, Option<ProcMacroClient>)> {
let (sender, receiver) = unbounded(); let (sender, receiver) = unbounded();
let mut vfs = vfs::Vfs::default(); let mut vfs = vfs::Vfs::default();
@ -62,12 +65,6 @@ pub fn load_workspace(
None None
}; };
ws.set_build_scripts(if load_config.load_out_dirs_from_check {
ws.run_build_scripts(cargo_config, progress)?
} else {
WorkspaceBuildScripts::default()
});
let crate_graph = ws.to_crate_graph( let crate_graph = ws.to_crate_graph(
&mut |path: &AbsPath| load_proc_macro(proc_macro_client.as_ref(), path), &mut |path: &AbsPath| load_proc_macro(proc_macro_client.as_ref(), path),
&mut |path: &AbsPath| { &mut |path: &AbsPath| {