8000 perf(core): avoid intermediate arrays and callbacks in definition · angular/angular@e084ced · GitHub
[go: up one dir, main page]

Skip to content

Commit e084ced

Browse files
committed
perf(core): avoid intermediate arrays and callbacks in definition
Makes the following minor performance improvements to `ɵɵdefineComponent`: * Previously `extractDefListOrFactory` had a chain of `.map.filter` which meant that we were unnecessarily creating intermediate arrays just to filter out the null values. These changes switch to simple `for` loop to get around it. * `extractDefListOrFactory` was always returning a callback, however in the most common case the callback isn't actually necessary. We only need the callback if the dependencies had forward references.
1 parent 13e3966 commit e084ced

File tree

9 files changed

+36
-34
lines changed

9 files changed

+36
-34
lines changed

packages/core/src/render3/definition.ts

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,8 @@ export function ɵɵdefineComponent<T>(
382382

383383
initFeatures(def);
384384
const dependencies = componentDefinition.dependencies;
385-
def.directiveDefs = extractDefListOrFactory(dependencies, /* pipeDef */ false);
386-
def.pipeDefs = extractDefListOrFactory(dependencies, /* pipeDef */ true);
385+
def.directiveDefs = extractDefListOrFactory(dependencies, extractDirectiveDef);
386+
def.pipeDefs = extractDefListOrFactory(dependencies, getPipeDef);
387387
def.id = getComponentId(def);
388388

389389
return def;
@@ -394,10 +394,6 @@ export function extractDirectiveDef(type: Type<any>): DirectiveDef<any> | Compon
394394
return getComponentDef(type) || getDirectiveDef(type);
395395
}
396396

397-
function nonNull<T>(value: T | null): value is T {
398-
return value !== null;
399-
}
400-
401397
/**
402398
* @codeGenApi
403399
*/
@@ -657,28 +653,34 @@ function initFeatures<T>(definition: DirectiveDef<T> | ComponentDef<T>): void {
657653
definition.features?.forEach((fn) => fn(definition));
658654
}
659655

660-
export function extractDefListOrFactory(
661-
dependencies: TypeOrFactory<DependencyTypeList> | undefined,
662-
pipeDef: false,
663-
): DirectiveDefListOrFactory | null;
664-
export function extractDefListOrFactory(
665-
dependencies: TypeOrFactory<DependencyTypeList> | undefined,
666-
pipeDef: true,
667-
): PipeDefListOrFactory | null;
668-
export function extractDefListOrFactory(
656+
function resolveDefList<T>(
657+
dependencies: Type<unknown>[],
658+
defExtractor: (type: Type<unknown>) => T | null,
659+
): T[] {
660+
const result: T[] = [];
661+
662+
for (const dep of dependencies) {
663+
const definition = defExtractor(dep);
664+
if (definition !== null) {
665+
result.push(definition);
666+
}
667+
}
668+
669+
return result;
670+
}
671+
672+
export function extractDefListOrFactory<T>(
669673
dependencies: TypeOrFactory<DependencyTypeList> | undefined,
670-
pipeDef: boolean,
671-
): unknown {
674+
defExtractor: (type: Type<unknown>) => T | null,
675+
): (() => T[]) | T[] | null {
672676
if (!dependencies) {
673677
return null;
674678
}
675679

676-
const defExtractor = pipeDef ? getPipeDef : extractDirectiveDef;
677-
678-
return () =>
679-
(typeof dependencies === 'function' ? dependencies() : dependencies)
680-
.map((dep) => defExtractor(dep))
681-
.filter(nonNull)< 1E0A /span>;
680+
// We need to resolve the dependencies in a callback if there are forward references.
681+
return typeof dependencies === 'function'
682+
? () => resolveDefList(dependencies(), defExtractor)
683+
: resolveDefList(dependencies, defExtractor);
682684
}
683685

684686
/**

packages/core/src/render3/scope.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import {Type} from '../interface/type';
1111
import {flatten} from '../util/array_utils';
1212
import {noSideEffects} from '../util/closure';
1313
import {EMPTY_ARRAY} from '../util/empty';
14-
import {getNgModuleDefOrThrow} from './def_getters';
14+
import {getNgModuleDefOrThrow, getPipeDef} from './def_getters';
1515

16-
import {extractDefListOrFactory} from './definition';
16+
import {extractDefListOrFactory, extractDirectiveDef} from './definition';
1717
import {depsTracker} from './deps_tracker/deps_tracker';
1818
import {
1919
ComponentDef,
@@ -38,8 +38,8 @@ export function ɵɵsetComponentScope(
3838
pipes: Type<any>[] | (() => Type<any>[]),
3939
): void {
4040
const def = type.ɵcmp as ComponentDef<any>;
41-
def.directiveDefs = extractDefListOrFactory(directives, /* pipeDef */ false);
42-
def.pipeDefs = extractDefListOrFactory(pipes, /* pipeDef */ true);
41+
def.directiveDefs = extractDefListOrFactory(directives, extractDirectiveDef);
42+
def.pipeDefs = extractDefListOrFactory(pipes, getPipeDef);
4343
}
4444

4545
/**

packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,6 @@
410410
"nextNgElementId",
411411
"ngOnChangesSetInput",
412412
"ngZoneInstanceId",
413-
"nonNull",
414413
"noop",
415414
"noop2",
416415
"normalizeAnimationEntry",
@@ -444,6 +443,7 @@
444443
"replacePostStylesAsPre",
445444
"requiresRefreshOrTraversal",
446445
"resetPreOrderHookFlags",
446+
"resolveDefList",
447447
"resolveForwardRef",
448448
"resolveTiming",
449449
"resolveTimingValue",

packages/core/test/bundling/defer/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,6 @@
420420
"nextNgElementId",
421421
"ngOnChangesSetInput",
422422
"ngZoneInstanceId",
423-
"nonNull",
424423
"noop",
425424
"noop2",
426425
"notFoundValueOrThrow",
@@ -451,6 +450,7 @@
451450
"renderView",
452451
"requiresRefreshOrTraversal",
453452
"resetPreOrderHookFlags",
453+
"resolveDefList",
454454
"resolveDirectives",
455455
"resolveForwardRef",
456456
"retrieveHydrationInfo",

packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,6 @@
527527
"ngOnChangesSetInput",
528528
"ngZoneInstanceId",
529529
"noSideEffects",
530-
"nonNull",
531530
"noop",
532531
"noop2",
533532
"normalizeValidators",
@@ -572,6 +571,7 @@
572571
"reportUnhandledError",
573572
"requiresRefreshOrTraversal",
574573
"resetPreOrderHookFlags",
574+
"resolveDefList",
575575
"resolveDirectives",
576576
"resolveForwardRef",
577577
"resolveProvider",

packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,6 @@
517517
"ngOnChangesSetInput",
518518
"ngZoneInstanceId",
519519
"noSideEffects",
520-
"nonNull",
521520
"noop",
522521
"noop2",
523522
"normalizeValidators",
@@ -564,6 +563,7 @@
564563
"requiredValidator",
565564
"requiresRefreshOrTraversal",
566565
"resetPreOrderHookFlags",
566+
"resolveDefList",
567567
"resolveDirectives",
568568
"resolveForwardRef",
569569
"resolveProvider",

packages/core/test/bundling/hydration/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,6 @@
378378
"nextNgElementId",
379379
"ngOnChangesSetInput",
380380
"ngZoneInstanceId",
381-
"nonNull",
382381
"noop",
383382
"noop2",
384383
"notFoundValueOrThrow",
@@ -412,6 +411,7 @@
412411
"reportUnhandledError",
413412
"requiresRefreshOrTraversal",
414413
"resetPreOrderHookFlags",
414+
"resolveDefList",
415415
"resolveForwardRef",
416416
"retrieveHydrationInfo",
417417
"retrieveHydrationInfoImpl",

packages/core/test/bundling/router/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,6 @@
608608
"noMatch2",
609609
"noSideEffects",
610610
"nodeChildrenAsMap",
611-
"nonNull",
612611
"noop",
613612
"noop2",
614613
"normalizeQueryParams",
@@ -654,6 +653,7 @@
654653
"reportUnhandledError",
655654
"requiresRefreshOrTraversal",
656655
"resetPreOrderHookFlags",
656+
"resolveDefList",
657657
"resolveForwardRef",
658658
"rootRoute",
659659
"routes",

packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@
316316
"nextNgElementId",
317317
"ngOnChangesSetInput",
318318
"ngZoneInstanceId",
319-
"nonNull",
320319
"noop",
321320
"noop2",
322321
"notFoundValueOrThrow",
@@ -341,6 +340,7 @@
341340
"renderView",
342341
"requiresRefreshOrTraversal",
343342
"resetPreOrderHookFlags",
343+
"resolveDefList",
344344
"resolveForwardRef",
345345
"runEffectsInView",
346346
"runInInjectionContext",

0 commit comments

Comments
 (0)
0