From 2e9d69a7913f18ddd3944b1cb089a50cd9a9cb4f Mon Sep 17 00:00:00 2001 From: Mathias Picker <48158184+MathiasWP@users.noreply.github.com> Date: Fri, 29 May 2026 16:51:03 +0200 Subject: [PATCH] refactor: merge measure + capture_size into one read loop Both are pure DOM reads, so there's no batching reason to keep them in separate loops over the destroyed items. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/svelte/src/internal/client/dom/blocks/each.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 646a85b54f..1f6ed81e04 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -628,9 +628,13 @@ function reconcile(state, array, anchor, flags, get_key) { var controlled_anchor = (flags & EACH_IS_CONTROLLED) !== 0 && length === 0 ? anchor : null; if (is_animated) { - // Doing all the reads _then_ all the writes minimises layout flushes - for (i = 0; i < destroy_length; i += 1) to_destroy[i].nodes?.a?.measure(); - for (i = 0; i < destroy_length; i += 1) to_destroy[i].nodes?.a?.capture_size(); + // Doing all the reads _then_ all the writes minimises layout flushes. + // `measure` and `capture_size` are both reads, so they share a loop. + for (i = 0; i < destroy_length; i += 1) { + var am = to_destroy[i].nodes?.a; + am?.measure(); + am?.capture_size(); + } for (i = 0; i < destroy_length; i += 1) to_destroy[i].nodes?.a?.set_position(); for (i = 0; i < destroy_length; i += 1) to_destroy[i].nodes?.a?.set_transform(); }