From 06209f824cf398bcd3332dc37f2d22cbdd840647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 25 Jul 2023 23:43:00 +0200 Subject: perf: cache node resolution when accesing a global (#19930) Reclaims some of the performance hit introduced by https://github.com/denoland/deno/pull/19307. --- ext/node/resolution.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'ext/node/resolution.rs') diff --git a/ext/node/resolution.rs b/ext/node/resolution.rs index 748506789..143edb6fe 100644 --- a/ext/node/resolution.rs +++ b/ext/node/resolution.rs @@ -1,5 +1,6 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; @@ -111,17 +112,39 @@ pub type NodeResolverRc = deno_fs::sync::MaybeArc; pub struct NodeResolver { fs: FileSystemRc, npm_resolver: NpmResolverRc, + in_npm_package_cache: deno_fs::sync::MaybeArcMutex>, } impl NodeResolver { pub fn new(fs: FileSystemRc, npm_resolver: NpmResolverRc) -> Self { - Self { fs, npm_resolver } + Self { + fs, + npm_resolver, + in_npm_package_cache: deno_fs::sync::MaybeArcMutex::new(HashMap::new()), + } } pub fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool { self.npm_resolver.in_npm_package(specifier) } + pub fn in_npm_package_with_cache(&self, specifier: String) -> bool { + let mut cache = self.in_npm_package_cache.lock(); + + if let Some(result) = cache.get(&specifier) { + return *result; + } + + let result = + if let Ok(specifier) = deno_core::ModuleSpecifier::parse(&specifier) { + self.npm_resolver.in_npm_package(&specifier) + } else { + false + }; + cache.insert(specifier, result); + result + } + /// This function is an implementation of `defaultResolve` in /// `lib/internal/modules/esm/resolve.js` from Node. pub fn resolve( -- cgit v1.2.3