10000 perf(core): avoid intermediate arrays in definition (#61445) · angular/angular@b785256 · GitHub
[go: up one dir, main page]

Skip to content

Commit b785256

Browse files
crisbetothePunderWoman
authored andcommitted
perf(core): avoid intermediate arrays in definition (#61445)
A minor performance improvement for `ɵɵdefineComponent` where the underlying `extractDefListOrFactory` call 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. PR Close #61445
1 parent cf8c853 commit b785256

File tree

9 files changed

+21
-35
lines changed

9 files changed

+21
-35
lines changed

packages/core/src/render3/definition.ts

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@ import type {
2828
DependencyTypeList,
2929
DirectiveDef,
3030
DirectiveDefFeature,
31-
DirectiveDefListOrFactory,
3231
HostBindingsFunction,
3332
InputTransformFunction,
3433
PipeDef,
35-
PipeDefListOrFactory,
3634
TypeOrFactory,
3735
ViewQueriesFunction,
3836
} from './interfaces/definition';
@@ -382,8 +380,8 @@ export function ɵɵdefineComponent<T>(
382380

383381
initFeatures(def);
384382
const dependencies = componentDefinition.dependencies;
385-
def.directiveDefs = extractDefListOrFactory(dependencies, /* pipeDef */ false);
386-
def.pipeDefs = extractDefListOrFactory(dependencies, /* pipeDef */ true);
383+
def.directiveDefs = extractDefListOrFactory(dependencies, extractDirectiveDef);
384+
def.pipeDefs = extractDefListOrFactory(dependencies, getPipeDef);
387385
def.id = getComponentId(def);
388386

389387
return def;
@@ -394,10 +392,6 @@ export function extractDirectiveDef(type: Type<any>): DirectiveDef<any> | Compon
394392
return getComponentDef(type) || getDirectiveDef(type);
395393
}
396394

397-
function nonNull<T>(value: T | null): value is T {
398-
return value !== null;
399-
}
400-
401395
/**
402396
* @codeGenApi
403397
*/
@@ -657,28 +651,27 @@ function initFeatures<T>(definition: DirectiveDef<T> | ComponentDef<T>): void {
657651
definition.features?.forEach((fn) => fn(definition));
658652
}
659653

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(
654+
export function extractDefListOrFactory<T>(
669655
dependencies: TypeOrFactory<DependencyTypeList> | undefined,
670-
pipeDef: boolean,
671-
): unknown {
656+
defExtractor: (type: Type<unknown>) => T | null,
657+
): (() => T[]) | T[] | null {
672658
if (!dependencies) {
673659
return null;
674660
}
675661

676-
const defExtractor = pipeDef ? getPipeDef : extractDirectiveDef;
662+
return () => {
663+
const resolvedDependencies = typeof dependencies === 'function' ? dependencies() : dependencies;
664+
const result: T[] = [];
677665

678-
return () =>
679-
(typeof dependencies === 'function' ? dependencies() : dependencies)
680-
.map((dep) => defExtractor(dep))
681-
.filter(nonNull);
666+
for (const dep of resolvedDependencies) {
667+
const definition = defExtractor(dep);
668+
if (definition !== null) {
669+
result.push(definition);
670+
}
671+
}
672+
673+
return result;
674+
};
682675
}
683676

684677
/**

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: 0 additions & 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",

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

Lines changed: 0 additions & 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",

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

Lines changed: 0 additions & 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",

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

Lines changed: 0 additions & 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",

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

Lines changed: 0 additions & 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",

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

Lines changed: 0 additions & 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",

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

Lines changed: 0 additions & 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",

0 commit comments

Comments
 (0)
0