perf(ivy): store binding metadata in the ngDevMode only (#32317)

Binding metadata are only needed:
- for property bindings;
- when TestBed tests are being run.

This commit guards binding metadata storage with the ngDevMode flag
which saves ~6% of a proerty binding processing time in the production
mode (and reduces bundle size).

PR Close #32317
This commit is contained in:
Pawel Kozlowski 2019-08-26 14:41:55 +02:00 committed by atscott
parent 3a4839c97e
commit 0874bf42b6
4 changed files with 72 additions and 67 deletions

View File

@ -72,7 +72,7 @@ export function interpolationV(lView: LView, values: any[]): string|NO_CHANGE {
export function interpolation1(lView: LView, prefix: string, v0: any, suffix: string): string|
NO_CHANGE {
const different = bindingUpdated(lView, lView[BINDING_INDEX]++, v0);
storeBindingMetadata(lView, prefix, suffix);
ngDevMode && storeBindingMetadata(lView, prefix, suffix);
return different ? prefix + renderStringify(v0) + suffix : NO_CHANGE;
}
@ -85,11 +85,13 @@ export function interpolation2(
const different = bindingUpdated2(lView, bindingIndex, v0, v1);
lView[BINDING_INDEX] += 2;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
lView[TVIEW].data[bindingIndex] = i0;
}
}
return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + suffix : NO_CHANGE;
}
@ -104,6 +106,7 @@ export function interpolation3(
const different = bindingUpdated3(lView, bindingIndex, v0, v1, v2);
lView[BINDING_INDEX] += 3;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
@ -111,6 +114,7 @@ export function interpolation3(
tData[bindingIndex] = i0;
tData[bindingIndex + 1] = i1;
}
}
return different ?
prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + suffix :
@ -127,6 +131,7 @@ export function interpolation4(
const different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
lView[BINDING_INDEX] += 4;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
@ -135,6 +140,7 @@ export function interpolation4(
tData[bindingIndex + 1] = i1;
tData[bindingIndex + 2] = i2;
}
}
return different ?
prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 +
@ -153,6 +159,7 @@ export function interpolation5(
different = bindingUpdated(lView, bindingIndex + 4, v4) || different;
lView[BINDING_INDEX] += 5;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
@ -162,6 +169,7 @@ export function interpolation5(
tData[bindingIndex + 2] = i2;
tData[bindingIndex + 3] = i3;
}
}
return different ?
prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 +
@ -180,6 +188,7 @@ export function interpolation6(
different = bindingUpdated2(lView, bindingIndex + 4, v4, v5) || different;
lView[BINDING_INDEX] += 6;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
@ -190,6 +199,7 @@ export function interpolation6(
tData[bindingIndex + 3] = i3;
tData[bindingIndex + 4] = i4;
}
}
return different ?
prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 +
@ -209,6 +219,7 @@ export function interpolation7(
different = bindingUpdated3(lView, bindingIndex + 4, v4, v5, v6) || different;
lView[BINDING_INDEX] += 7;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
@ -220,6 +231,7 @@ export function interpolation7(
tData[bindingIndex + 4] = i4;
tData[bindingIndex + 5] = i5;
}
}
return different ?
prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 +
@ -240,6 +252,7 @@ export function interpolation8(
different = bindingUpdated4(lView, bindingIndex + 4, v4, v5, v6, v7) || different;
lView[BINDING_INDEX] += 8;
if (ngDevMode) {
// Only set static strings the first time (data will be null subsequent runs).
const data = storeBindingMetadata(lView, prefix, suffix);
if (data) {
@ -252,6 +265,7 @@ export function interpolation8(
tData[bindingIndex + 5] = i5;
tData[bindingIndex + 6] = i6;
}
}
return different ?
prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 +

View File

@ -50,6 +50,6 @@ export function ɵɵproperty<T>(
*/
export function bind<T>(lView: LView, value: T): T|NO_CHANGE {
const bindingIndex = lView[BINDING_INDEX]++;
storeBindingMetadata(lView);
ngDevMode && storeBindingMetadata(lView);
return bindingUpdated(lView, bindingIndex, value) ? value : NO_CHANGE;
}

View File

@ -892,7 +892,7 @@ export function elementPropertyInternal<T>(
ngDevMode.rendererSetProperty++;
}
savePropertyDebugData(tNode, lView, propName, lView[TVIEW].data, nativeOnly);
ngDevMode && savePropertyDebugData(tNode, lView, propName, lView[TVIEW].data, nativeOnly);
const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER];
// It is assumed that the sanitizer is only added when the compiler determines that the

View File

@ -98,9 +98,6 @@
{
"name": "INJECTOR_BLOOM_PARENT_SIZE"
},
{
"name": "INTERPOLATION_DELIMITER"
},
{
"name": "InjectFlags"
},
@ -1235,9 +1232,6 @@
{
"name": "saveNameToExportMap"
},
{
"name": "savePropertyDebugData"
},
{
"name": "saveResolvedLocalsInData"
},
@ -1325,9 +1319,6 @@
{
"name": "stateIsPersisted"
},
{
"name": "storeBindingMetadata"
},
{
"name": "storeCleanupFn"
},