From 6f8e9b260b11cbfeda54106f4fbce63bd250536a Mon Sep 17 00:00:00 2001 From: Scott Hovestadt Date: Thu, 28 Mar 2019 20:45:13 -0700 Subject: [PATCH 1/3] Cache regular expression instead of creating anew for every file in script transformer. --- .../jest-transform/src/ScriptTransformer.ts | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index b8d0c5507b2e..d6f461197cfe 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -31,7 +31,8 @@ import enhanceUnexpectedTokenMessage from './enhanceUnexpectedTokenMessage'; type ProjectCache = { configString: string; - ignorePatternsRegExp: RegExp | null; + ignorePatternsRegExp?: RegExp; + transformRegExp?: Array<[RegExp, string]>; transformedFiles: Map; }; @@ -64,7 +65,8 @@ export default class ScriptTransformer { if (!projectCache) { projectCache = { configString: stableStringify(this._config), - ignorePatternsRegExp: calcIgnorePatternRegexp(this._config), + ignorePatternsRegExp: calcIgnorePatternRegExp(this._config), + transformRegExp: calcTransformRegExp(this._config), transformedFiles: new Map(), }; @@ -131,12 +133,18 @@ export default class ScriptTransformer { } private _getTransformPath(filename: Config.Path) { - for (let i = 0; i < this._config.transform.length; i++) { - if (new RegExp(this._config.transform[i][0]).test(filename)) { - return this._config.transform[i][1]; + const transformRegExp = this._cache.transformRegExp; + if (!transformRegExp) { + return undefined; + } + + for (const [regExp, transform] of transformRegExp) { + if (regExp.test(filename)) { + return transform; } } - return null; + + return undefined; } private _getTransformer(filename: Config.Path) { @@ -371,21 +379,19 @@ export default class ScriptTransformer { options: Options, fileSource?: string, ): TransformResult { - let scriptCacheKey = null; + let scriptCacheKey = undefined; let instrument = false; - let result: TransformResult | undefined; if (!options.isCoreModule) { instrument = shouldInstrument(filename, options, this._config); scriptCacheKey = getScriptCacheKey(filename, instrument); - result = this._cache.transformedFiles.get(scriptCacheKey); - } - - if (result) { - return result; + const result = this._cache.transformedFiles.get(scriptCacheKey); + if (result) { + return result; + } } - result = this._transformAndBuildScript( + const result = this._transformAndBuildScript( filename, options, instrument, @@ -539,19 +545,33 @@ const getScriptCacheKey = (filename: Config.Path, instrument: boolean) => { return filename + '_' + mtime.getTime() + (instrument ? '_instrumented' : ''); }; -const calcIgnorePatternRegexp = ( - config: Config.ProjectConfig, -): RegExp | null => { +const calcIgnorePatternRegExp = (config: Config.ProjectConfig) => { if ( !config.transformIgnorePatterns || config.transformIgnorePatterns.length === 0 ) { - return null; + return; } return new RegExp(config.transformIgnorePatterns.join('|')); }; +const calcTransformRegExp = (config: Config.ProjectConfig) => { + if (!config.transform.length) { + return; + } + + const transformRegexp: Array<[RegExp, string]> = []; + for (let i = 0; i < config.transform.length; i++) { + transformRegexp.push([ + new RegExp(config.transform[i][0]), + config.transform[i][1], + ]); + } + + return transformRegexp; +}; + const wrap = (content: string, ...extras: Array) => { const globals = new Set([ 'module', From 3e9741e62f764e5eea6d9ceb65a9ce8ffa9ef714 Mon Sep 17 00:00:00 2001 From: Scott Hovestadt Date: Thu, 28 Mar 2019 20:59:46 -0700 Subject: [PATCH 2/3] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ccf8f3e6c99..fc83419471e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ - `[jest-core]` Improve performance of SearchSource.findMatchingTests by 15% ([#8184](https://github.com/facebook/jest/pull/8184)) - `[jest-resolve]` Optimize internal cache lookup performance ([#8183](https://github.com/facebook/jest/pull/8183)) - `[jest-core]` Dramatically improve watch mode performance ([#8201](https://github.com/facebook/jest/pull/8201)) +- `[jest-transform]` Cache regular expression instead of creating anew for every file in ScriptTransformer ([#8235](https://github.com/facebook/jest/pull/8235)) ## 24.5.0 From 28a1a99cbaf0502aadea86b1fee733799758c196 Mon Sep 17 00:00:00 2001 From: Scott Hovestadt Date: Fri, 29 Mar 2019 08:46:52 -0700 Subject: [PATCH 3/3] Minor optimization on hot path. --- packages/jest-transform/src/ScriptTransformer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index d6f461197cfe..e7267362c981 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -138,9 +138,9 @@ export default class ScriptTransformer { return undefined; } - for (const [regExp, transform] of transformRegExp) { - if (regExp.test(filename)) { - return transform; + for (let i = 0; i < transformRegExp.length; i++) { + if (transformRegExp[i][0].test(filename)) { + return transformRegExp[i][1]; } }