From eb80b77580b03106a73988bf7e3f74cefd2afbdc Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Apr 2025 18:30:01 +0100 Subject: [PATCH 1/3] chore: avoid microtasks when flushing sync --- .changeset/polite-melons-tickle.md | 5 ++ benchmarking/benchmarks/reactivity/index.js | 52 +++++++++---------- .../svelte/src/internal/client/runtime.js | 38 +++++++++----- 3 files changed, 55 insertions(+), 40 deletions(-) create mode 100644 .changeset/polite-melons-tickle.md diff --git a/.changeset/polite-melons-tickle.md b/.changeset/polite-melons-tickle.md new file mode 100644 index 000000000000..42967ea936d3 --- /dev/null +++ b/.changeset/polite-melons-tickle.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: avoid microtasks when flushing sync diff --git a/benchmarking/benchmarks/reactivity/index.js b/benchmarking/benchmarks/reactivity/index.js index 58b3f5cb295b..5dbfce0bb9d4 100644 --- a/benchmarking/benchmarks/reactivity/index.js +++ b/benchmarking/benchmarks/reactivity/index.js @@ -24,32 +24,32 @@ import { // Not all tests are the same, and many parts have been tweaked to capture different data. export const reactivity_benchmarks = [ - sbench_create_signals, - sbench_create_0to1, - sbench_create_1to1, - sbench_create_2to1, - sbench_create_4to1, - sbench_create_1000to1, - sbench_create_1to2, - sbench_create_1to4, - sbench_create_1to8, - sbench_create_1to1000, - kairo_avoidable_owned, - kairo_avoidable_unowned, - kairo_broad_owned, - kairo_broad_unowned, - kairo_deep_owned, - kairo_deep_unowned, + // sbench_create_signals, + // sbench_create_0to1, + // sbench_create_1to1, + // sbench_create_2to1, + // sbench_create_4to1, + // sbench_create_1000to1, + // sbench_create_1to2, + // sbench_create_1to4, + // sbench_create_1to8, + // sbench_create_1to1000, + // kairo_avoidable_owned, + // kairo_avoidable_unowned, + // kairo_broad_owned, + // kairo_broad_unowned, + // kairo_deep_owned, + // kairo_deep_unowned, kairo_diamond_owned, kairo_diamond_unowned, - kairo_triangle_owned, - kairo_triangle_unowned, - kairo_mux_owned, - kairo_mux_unowned, - kairo_repeated_owned, - kairo_repeated_unowned, - kairo_unstable_owned, - kairo_unstable_unowned, - mol_bench_owned, - mol_bench_unowned + // kairo_triangle_owned, + // kairo_triangle_unowned, + // kairo_mux_owned, + // kairo_mux_unowned, + // kairo_repeated_owned, + // kairo_repeated_unowned, + // kairo_unstable_owned, + // kairo_unstable_unowned, + // mol_bench_owned, + // mol_bench_unowned ]; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 7a926bf62457..6279c6bddad6 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -47,6 +47,7 @@ const handled_errors = new WeakSet(); let is_throwing_error = false; let is_flushing = false; +let is_flushing_sync = false; /** @type {Effect | null} */ let last_scheduled_effect = null; @@ -734,7 +735,9 @@ function flush_queued_effects(effects) { export function schedule_effect(signal) { if (!is_flushing) { is_flushing = true; - queueMicrotask(flush_queued_root_effects); + if (!is_flushing_sync) { + queueMicrotask(flush_queued_root_effects); + } } var effect = (last_scheduled_effect = signal); @@ -818,23 +821,30 @@ function process_effects(root) { * @returns {T} */ export function flushSync(fn) { - var result; - - if (fn) { - is_flushing = true; - flush_queued_root_effects(); - result = fn(); - } + var previously_flushing_sync = is_flushing_sync; - flush_tasks(); + try { + var result; + is_flushing_sync = true; - while (queued_root_effects.length > 0) { - is_flushing = true; - flush_queued_root_effects(); + if (fn) { + is_flushing = true; + flush_queued_root_effects(); + result = fn(); + } + flush_tasks(); + + while (queued_root_effects.length > 0) { + is_flushing = true; + flush_queued_root_effects(); + flush_tasks(); + } + + return /** @type {T} */ (result); + } finally { + is_flushing_sync = previously_flushing_sync; } - - return /** @type {T} */ (result); } /** From 479cf5d36d0e77c9b80dfa4de4028c4ad8d1e32d Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Apr 2025 18:31:04 +0100 Subject: [PATCH 2/3] chore: avoid microtasks when flushing sync --- benchmarking/benchmarks/reactivity/index.js | 52 ++++++++++----------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/benchmarking/benchmarks/reactivity/index.js b/benchmarking/benchmarks/reactivity/index.js index 5dbfce0bb9d4..58b3f5cb295b 100644 --- a/benchmarking/benchmarks/reactivity/index.js +++ b/benchmarking/benchmarks/reactivity/index.js @@ -24,32 +24,32 @@ import { // Not all tests are the same, and many parts have been tweaked to capture different data. export const reactivity_benchmarks = [ - // sbench_create_signals, - // sbench_create_0to1, - // sbench_create_1to1, - // sbench_create_2to1, - // sbench_create_4to1, - // sbench_create_1000to1, - // sbench_create_1to2, - // sbench_create_1to4, - // sbench_create_1to8, - // sbench_create_1to1000, - // kairo_avoidable_owned, - // kairo_avoidable_unowned, - // kairo_broad_owned, - // kairo_broad_unowned, - // kairo_deep_owned, - // kairo_deep_unowned, + sbench_create_signals, + sbench_create_0to1, + sbench_create_1to1, + sbench_create_2to1, + sbench_create_4to1, + sbench_create_1000to1, + sbench_create_1to2, + sbench_create_1to4, + sbench_create_1to8, + sbench_create_1to1000, + kairo_avoidable_owned, + kairo_avoidable_unowned, + kairo_broad_owned, + kairo_broad_unowned, + kairo_deep_owned, + kairo_deep_unowned, kairo_diamond_owned, kairo_diamond_unowned, - // kairo_triangle_owned, - // kairo_triangle_unowned, - // kairo_mux_owned, - // kairo_mux_unowned, - // kairo_repeated_owned, - // kairo_repeated_unowned, - // kairo_unstable_owned, - // kairo_unstable_unowned, - // mol_bench_owned, - // mol_bench_unowned + kairo_triangle_owned, + kairo_triangle_unowned, + kairo_mux_owned, + kairo_mux_unowned, + kairo_repeated_owned, + kairo_repeated_unowned, + kairo_unstable_owned, + kairo_unstable_unowned, + mol_bench_owned, + mol_bench_unowned ]; From 359dc169d5852a3fb71fc0c72b11f9e37bee43d5 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Apr 2025 18:31:21 +0100 Subject: [PATCH 3/3] chore: avoid microtasks when flushing sync --- packages/svelte/src/internal/client/runtime.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 6279c6bddad6..87a69cb851e0 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -832,15 +832,15 @@ export function flushSync(fn) { flush_queued_root_effects(); result = fn(); } - + flush_tasks(); - + while (queued_root_effects.length > 0) { is_flushing = true; flush_queued_root_effects(); flush_tasks(); } - + return /** @type {T} */ (result); } finally { is_flushing_sync = previously_flushing_sync;