From 4ede859a00a68c45917d227aadd346f1e6294636 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Fri, 15 Nov 2019 13:01:50 -0800 Subject: [PATCH 1/3] perf(ivy): R3TestBed - Do not process NgModuleDefs that have already been processed --- .../core/testing/src/r3_test_bed_compiler.ts | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index b6a832ff30822..7feabdeb59cb2 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -486,17 +486,26 @@ export class R3TestBedCompiler { } private queueTypesFromModulesArray(arr: any[]): void { - for (const value of arr) { - if (Array.isArray(value)) { - this.queueTypesFromModulesArray(value); - } else if (hasNgModuleDef(value)) { - const def = value.ɵmod; - // Look through declarations, imports, and exports, and queue everything found there. - this.queueTypeArray(maybeUnwrapFn(def.declarations), value); - this.queueTypesFromModulesArray(maybeUnwrapFn(def.imports)); - this.queueTypesFromModulesArray(maybeUnwrapFn(def.exports)); + const processedNgModuleDefs = new Set(); + const queueTypesFromModulesArrayRecur = (arr: any[]): void => { + for (const value of arr) { + if (Array.isArray(value)) { + queueTypesFromModulesArrayRecur(value); + } else if (hasNgModuleDef(value)) { + const def = value.ɵmod; + if (processedNgModuleDefs.has(def)) { + return; + } + processedNgModuleDefs.add(def); + // Look through declarations, imports, and exports, and queue + // everything found there. + this.queueTypeArray(maybeUnwrapFn(def.declarations), value); + queueTypesFromModulesArrayRecur(maybeUnwrapFn(def.imports)); + queueTypesFromModulesArrayRecur(maybeUnwrapFn(def.exports)); + } } - } + }; + queueTypesFromModulesArrayRecur(arr); } private maybeStoreNgDef(prop: string, type: Type) { From 23613fe1d071a758cf8e669fa3e0e32ba783e601 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Mon, 18 Nov 2019 07:36:35 -0800 Subject: [PATCH 2/3] fixup! perf(ivy): R3TestBed - Do not process NgModuleDefs that have already been processed --- packages/core/testing/src/r3_test_bed_compiler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index 7feabdeb59cb2..91c3015a4d7b2 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -486,6 +486,9 @@ export class R3TestBedCompiler { } private queueTypesFromModulesArray(arr: any[]): void { + // Because we may encounter the same NgModule while processing the imports and exports of an + // NgModule tree, we cache them in this set so we can skip ones that have already been seen + // encountered. In some test setups, this caching resulted in 10X runtime improvement. const processedNgModuleDefs = new Set(); const queueTypesFromModulesArrayRecur = (arr: any[]): void => { for (const value of arr) { From d78e8d2a444e7898baec7871c6b08801df1e8aa2 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 19 Nov 2019 11:09:29 -0800 Subject: [PATCH 3/3] fixup! perf(ivy): R3TestBed - Do not process NgModuleDefs that have already been processed --- packages/core/testing/src/r3_test_bed_compiler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index 91c3015a4d7b2..a1428055d697a 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -497,7 +497,7 @@ export class R3TestBedCompiler { } else if (hasNgModuleDef(value)) { const def = value.ɵmod; if (processedNgModuleDefs.has(def)) { - return; + continue; } processedNgModuleDefs.add(def); // Look through declarations, imports, and exports, and queue