From e3422e0aed57f5c7790db155f4efdb2acb9d4182 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 22 Aug 2019 11:12:04 +0200 Subject: [PATCH] perf(ivy): minimise writes to the lView[BINDING_INDEX] / binding root (#32263) This commit removes all the (duplicated) logic of setting lView[BINDING_INDEX] from `enterView`. `enterView` is on the critcal path perf-wise so we should avoid having any logic in there and minimise memory read / write. This simple refactoring in this PR reduces time spent in noop change detection by ~12% (from ~800ms down to ~700ms on a local machine where measurements were taken). PR Close #32263 --- packages/core/src/render3/instructions/shared.ts | 6 +----- packages/core/src/render3/state.ts | 4 ---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 223b8554fb..af4287b5a1 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -377,10 +377,7 @@ export function refreshView( try { resetPreOrderHookFlags(lView); - // Resetting the bindingIndex of the current LView as the next steps may trigger change - // detection. - lView[BINDING_INDEX] = tView.bindingStartIndex; - + setBindingRoot(lView[BINDING_INDEX] = tView.bindingStartIndex); if (templateFn !== null) { executeTemplate(lView, templateFn, RenderFlags.Update, context); } @@ -463,7 +460,6 @@ export function refreshView( } finally { lView[FLAGS] &= ~(LViewFlags.Dirty | LViewFlags.FirstLViewPass); - lView[BINDING_INDEX] = tView.bindingStartIndex; leaveView(oldView); } } diff --git a/packages/core/src/render3/state.ts b/packages/core/src/render3/state.ts index 22591942e3..9304a95eb9 100644 --- a/packages/core/src/render3/state.ts +++ b/packages/core/src/render3/state.ts @@ -414,10 +414,6 @@ export function setCurrentQueryIndex(value: number): void { export function enterView(newView: LView, hostTNode: TElementNode | TViewNode | null): LView { ngDevMode && assertLViewOrUndefined(newView); const oldView = lView; - if (newView) { - const tView = newView[TVIEW]; - bindingRootIndex = tView.bindingStartIndex; - } previousOrParentTNode = hostTNode !; isParent = true;