From f9034d4492584ec0d3b97a9dc9001a3b88c97645 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sun, 17 May 2026 13:19:07 +0300 Subject: [PATCH] perf(kiwi): avoid shifting import propagation queues --- .../core/src/kiwi/instance-overrides/constraints.ts | 5 ++++- packages/core/src/kiwi/instance-overrides/dsd.ts | 5 ++++- packages/core/src/kiwi/instance-overrides/populate.ts | 11 ++++++++--- packages/core/src/kiwi/instance-overrides/sync.ts | 5 ++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/core/src/kiwi/instance-overrides/constraints.ts b/packages/core/src/kiwi/instance-overrides/constraints.ts index 073ed9d31..7b8ac2042 100644 --- a/packages/core/src/kiwi/instance-overrides/constraints.ts +++ b/packages/core/src/kiwi/instance-overrides/constraints.ts @@ -178,7 +178,10 @@ function propagateScaling(ctx: OverrideContext, scaled: Set): void { const queue = [...scaled] const visited = new Set() - for (let srcId = queue.shift(); srcId !== undefined; srcId = queue.shift()) { + let index = 0 + while (index < queue.length) { + const srcId = queue[index] + index++ const source = graph.getNode(srcId) if (!source) continue const clones = clonesOf.get(srcId) diff --git a/packages/core/src/kiwi/instance-overrides/dsd.ts b/packages/core/src/kiwi/instance-overrides/dsd.ts index 01d4683af..cf001fe03 100644 --- a/packages/core/src/kiwi/instance-overrides/dsd.ts +++ b/packages/core/src/kiwi/instance-overrides/dsd.ts @@ -206,7 +206,10 @@ function propagateDsdChanges( const queue = [...modified] const visited = new Set() - for (let sourceId = queue.shift(); sourceId !== undefined; sourceId = queue.shift()) { + let index = 0 + while (index < queue.length) { + const sourceId = queue[index] + index++ const source = ctx.graph.getNode(sourceId) if (!source) continue const clones = clonesOf.get(sourceId) diff --git a/packages/core/src/kiwi/instance-overrides/populate.ts b/packages/core/src/kiwi/instance-overrides/populate.ts index b58699f40..31a1189c4 100644 --- a/packages/core/src/kiwi/instance-overrides/populate.ts +++ b/packages/core/src/kiwi/instance-overrides/populate.ts @@ -10,7 +10,10 @@ import type { SceneGraph } from '#core/scene-graph' function collectSubtreeIds(graph: SceneGraph, rootIds: Iterable): Set { const result = new Set() const queue = [...rootIds] - for (let id = queue.shift(); id !== undefined; id = queue.shift()) { + let index = 0 + while (index < queue.length) { + const id = queue[index] + index++ if (result.has(id)) continue result.add(id) const node = graph.getNode(id) @@ -60,8 +63,10 @@ export function populateInstances( const queue = [...rootIds] const visited = new Set() - while (queue.length > 0) { - const nodeId = queue.shift() + let index = 0 + while (index < queue.length) { + const nodeId = queue[index] + index++ if (!nodeId || visited.has(nodeId)) continue visited.add(nodeId) ensurePopulated(nodeId) diff --git a/packages/core/src/kiwi/instance-overrides/sync.ts b/packages/core/src/kiwi/instance-overrides/sync.ts index b86e94e0d..35d7be7da 100644 --- a/packages/core/src/kiwi/instance-overrides/sync.ts +++ b/packages/core/src/kiwi/instance-overrides/sync.ts @@ -159,7 +159,10 @@ export function propagateOverridesTransitively( const visited = new Set() const syncQueue = [...expandedSeeds] - for (let sourceId = syncQueue.shift(); sourceId !== undefined; sourceId = syncQueue.shift()) { + let index = 0 + while (index < syncQueue.length) { + const sourceId = syncQueue[index] + index++ const clones = clonesOf.get(sourceId) if (!clones) continue const source = graph.getNode(sourceId)