From bb89000d03595f392fa4e89fa2f0c83e1f3e5fd8 Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Tue, 16 Dec 2025 04:19:44 -0500 Subject: [PATCH] perf: updateQueue array --- .../src/ReactFiberCommitEffects.js | 24 ++++++++----------- .../react-reconciler/src/ReactFiberHooks.js | 21 ++++++---------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberCommitEffects.js b/packages/react-reconciler/src/ReactFiberCommitEffects.js index f7e20fe9261..51d0c6b81f8 100644 --- a/packages/react-reconciler/src/ReactFiberCommitEffects.js +++ b/packages/react-reconciler/src/ReactFiberCommitEffects.js @@ -145,11 +145,10 @@ export function commitHookEffectListMount( try { const updateQueue: FunctionComponentUpdateQueue | null = (finishedWork.updateQueue: any); - const lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; - if (lastEffect !== null) { - const firstEffect = lastEffect.next; - let effect = firstEffect; - do { + const effects = updateQueue !== null ? updateQueue.effects : null; + if (effects !== null) { + for (let i = 0; i < effects.length; i++) { + const effect = effects[i]; if ((effect.tag & flags) === flags) { if (enableSchedulingProfiler) { if ((flags & HookPassive) !== NoHookEffect) { @@ -237,8 +236,7 @@ export function commitHookEffectListMount( } } } - effect = effect.next; - } while (effect !== firstEffect); + } } } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); @@ -253,11 +251,10 @@ export function commitHookEffectListUnmount( try { const updateQueue: FunctionComponentUpdateQueue | null = (finishedWork.updateQueue: any); - const lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; - if (lastEffect !== null) { - const firstEffect = lastEffect.next; - let effect = firstEffect; - do { + const effects = updateQueue !== null ? updateQueue.effects : null; + if (effects !== null) { + for (let i = 0; i < effects.length; i++) { + const effect = effects[i]; if ((effect.tag & flags) === flags) { // Unmount const inst = effect.inst; @@ -293,8 +290,7 @@ export function commitHookEffectListUnmount( } } } - effect = effect.next; - } while (effect !== firstEffect); + } } } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); diff --git a/packages/react-reconciler/src/ReactFiberHooks.js b/packages/react-reconciler/src/ReactFiberHooks.js index 66a390ebb81..d4510aedc35 100644 --- a/packages/react-reconciler/src/ReactFiberHooks.js +++ b/packages/react-reconciler/src/ReactFiberHooks.js @@ -223,7 +223,6 @@ export type Effect = { inst: EffectInstance, create: () => (() => void) | void, deps: Array | void | null, - next: Effect, }; type StoreInstance = { @@ -245,7 +244,7 @@ type EventFunctionPayload) => Return> = { }; export type FunctionComponentUpdateQueue = { - lastEffect: Effect | null, + effects: Array | null, events: Array> | null, stores: Array> | null, memoCache: MemoCache | null, @@ -1071,7 +1070,7 @@ function updateWorkInProgressHook(): Hook { function createFunctionComponentUpdateQueue(): FunctionComponentUpdateQueue { return { - lastEffect: null, + effects: null, events: null, stores: null, memoCache: null, @@ -1081,7 +1080,7 @@ function createFunctionComponentUpdateQueue(): FunctionComponentUpdateQueue { function resetFunctionComponentUpdateQueue( updateQueue: FunctionComponentUpdateQueue, ): void { - updateQueue.lastEffect = null; + updateQueue.effects = null; updateQueue.events = null; updateQueue.stores = null; if (updateQueue.memoCache != null) { @@ -2571,8 +2570,6 @@ function pushSimpleEffect( create, deps, inst, - // Circular - next: (null: any), }; return pushEffectImpl(effect); } @@ -2584,15 +2581,11 @@ function pushEffectImpl(effect: Effect): Effect { componentUpdateQueue = createFunctionComponentUpdateQueue(); currentlyRenderingFiber.updateQueue = (componentUpdateQueue: any); } - const lastEffect = componentUpdateQueue.lastEffect; - if (lastEffect === null) { - componentUpdateQueue.lastEffect = effect.next = effect; - } else { - const firstEffect = lastEffect.next; - lastEffect.next = effect; - effect.next = firstEffect; - componentUpdateQueue.lastEffect = effect; + let effects = componentUpdateQueue.effects; + if (effects === null) { + componentUpdateQueue.effects = effects = []; } + effects.push(effect); return effect; }