diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-05-28 16:23:11 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-28 16:23:11 -0400 |
commit | 57617af16a4280aa3bc54292f18763942d67d460 (patch) | |
tree | f6246576cc8715c6cea1dc3ebe15720bde5bb512 | |
parent | 3e8f29ae4123abaddd9544a87e16448219fdd5f7 (diff) |
perf: parse source files in parallel (#23858)
-rw-r--r-- | cli/cache/module_info.rs | 22 | ||||
-rw-r--r-- | cli/graph_util.rs | 5 | ||||
-rw-r--r-- | cli/tools/doc.rs | 2 |
3 files changed, 19 insertions, 10 deletions
diff --git a/cli/cache/module_info.rs b/cli/cache/module_info.rs index e34b8d2bb..959f84451 100644 --- a/cli/cache/module_info.rs +++ b/cli/cache/module_info.rs @@ -7,7 +7,6 @@ use deno_ast::ModuleSpecifier; use deno_core::error::AnyError; use deno_core::serde_json; use deno_graph::ModuleInfo; -use deno_graph::ModuleParser; use deno_graph::ParserModuleAnalyzer; use deno_runtime::deno_webstorage::rusqlite::params; @@ -15,6 +14,7 @@ use super::cache_db::CacheDB; use super::cache_db::CacheDBConfiguration; use super::cache_db::CacheFailure; use super::FastInsecureHasher; +use super::ParsedSourceCache; const SELECT_MODULE_INFO: &str = " SELECT @@ -136,18 +136,18 @@ impl ModuleInfoCache { pub fn as_module_analyzer<'a>( &'a self, - parser: &'a dyn ModuleParser, + parsed_source_cache: &'a Arc<ParsedSourceCache>, ) -> ModuleInfoCacheModuleAnalyzer<'a> { ModuleInfoCacheModuleAnalyzer { module_info_cache: self, - parser, + parsed_source_cache, } } } pub struct ModuleInfoCacheModuleAnalyzer<'a> { module_info_cache: &'a ModuleInfoCache, - parser: &'a dyn ModuleParser, + parsed_source_cache: &'a Arc<ParsedSourceCache>, } #[async_trait::async_trait(?Send)] @@ -177,9 +177,17 @@ impl<'a> deno_graph::ModuleAnalyzer for ModuleInfoCacheModuleAnalyzer<'a> { } // otherwise, get the module info from the parsed source cache - // todo(23858): take advantage of this being async - let analyzer = ParserModuleAnalyzer::new(self.parser); - let module_info = analyzer.analyze(specifier, source, media_type).await?; + let module_info = deno_core::unsync::spawn_blocking({ + let cache = self.parsed_source_cache.clone(); + let specifier = specifier.clone(); + move || { + let parser = cache.as_capturing_parser(); + let analyzer = ParserModuleAnalyzer::new(&parser); + analyzer.analyze_sync(&specifier, source, media_type) + } + }) + .await + .unwrap()?; // then attempt to cache it if let Err(err) = self.module_info_cache.set_module_info( diff --git a/cli/graph_util.rs b/cli/graph_util.rs index 81ae21d0d..017d6b35d 100644 --- a/cli/graph_util.rs +++ b/cli/graph_util.rs @@ -470,8 +470,9 @@ impl ModuleGraphBuilder { } let maybe_imports = self.options.to_maybe_imports()?; - let parser = self.parsed_source_cache.as_capturing_parser(); - let analyzer = self.module_info_cache.as_module_analyzer(&parser); + let analyzer = self + .module_info_cache + .as_module_analyzer(&self.parsed_source_cache); let mut loader = match options.loader { Some(loader) => MutLoaderRef::Borrowed(loader), None => MutLoaderRef::Owned(self.create_graph_loader()), diff --git a/cli/tools/doc.rs b/cli/tools/doc.rs index 696823a91..bebe4567f 100644 --- a/cli/tools/doc.rs +++ b/cli/tools/doc.rs @@ -89,7 +89,7 @@ pub async fn doc(flags: Flags, doc_flags: DocFlags) -> Result<(), AnyError> { let module_info_cache = factory.module_info_cache()?; let parsed_source_cache = factory.parsed_source_cache(); let capturing_parser = parsed_source_cache.as_capturing_parser(); - let analyzer = module_info_cache.as_module_analyzer(&capturing_parser); + let analyzer = module_info_cache.as_module_analyzer(parsed_source_cache); let doc_nodes_by_url = match doc_flags.source_files { DocSourceFileFlag::Builtin => { |