diff --git a/packages/compiler/bench/tachometer/bench-compiler-micros.js b/packages/compiler/bench/tachometer/bench-compiler-micros.js index 84ac4b560..22c00b820 100644 --- a/packages/compiler/bench/tachometer/bench-compiler-micros.js +++ b/packages/compiler/bench/tachometer/bench-compiler-micros.js @@ -151,12 +151,12 @@ const kitchenSinkTemplate = `
{ const astWalkAST = new TemplateCompiler(kitchenSinkTemplate).compile(); - // purpose: Walks a kitchen-sink AST through optimizeAST 5000 times. Merge, hoist, and recurse pass. - performance.mark(startMark('ast-walk-5k')); - for (let i = 0; i < 5_000; i++) { + // purpose: Walks a kitchen-sink AST through optimizeAST 15000 times. Merge, hoist, and recurse pass. + performance.mark(startMark('ast-walk-15k')); + for (let i = 0; i < 15_000; i++) { TemplateCompiler.optimizeAST(astWalkAST); } - performance.measure('ast-walk-5k', startMark('ast-walk-5k')); + performance.measure('ast-walk-15k', startMark('ast-walk-15k')); } /******************************* diff --git a/packages/compiler/bench/tachometer/tachometer-ci-compiler-micros.json b/packages/compiler/bench/tachometer/tachometer-ci-compiler-micros.json index f905ae73a..492004aaa 100644 --- a/packages/compiler/bench/tachometer/tachometer-ci-compiler-micros.json +++ b/packages/compiler/bench/tachometer/tachometer-ci-compiler-micros.json @@ -12,7 +12,7 @@ "measurement": [ { "mode": "performance", "entryName": "parse-cold-normal-500" }, { "mode": "performance", "entryName": "parse-cold-complex-200" }, - { "mode": "performance", "entryName": "ast-walk-5k" }, + { "mode": "performance", "entryName": "ast-walk-15k" }, { "mode": "performance", "entryName": "snippet-args-5k" } ] }, @@ -23,7 +23,7 @@ "measurement": [ { "mode": "performance", "entryName": "parse-cold-normal-500" }, { "mode": "performance", "entryName": "parse-cold-complex-200" }, - { "mode": "performance", "entryName": "ast-walk-5k" }, + { "mode": "performance", "entryName": "ast-walk-15k" }, { "mode": "performance", "entryName": "snippet-args-5k" } ] } diff --git a/packages/component/bench/tachometer/bench-hydrate.js b/packages/component/bench/tachometer/bench-hydrate.js index 44d6c25c7..afe783251 100644 --- a/packages/component/bench/tachometer/bench-hydrate.js +++ b/packages/component/bench/tachometer/bench-hydrate.js @@ -31,7 +31,7 @@ defineComponent({ `, defaultState: { - items: { value: [], options: { allowClone: false, safety: 'reference' } }, + items: [], }, createComponent({ state }) { return { @@ -146,8 +146,8 @@ defineComponent({ `, defaultState: { - activeID: { value: null, options: { allowClone: false, safety: 'reference' } }, - items: { value: [], options: { allowClone: false, safety: 'reference' } }, + activeID: null, + items: [], }, createComponent({ self, state }) { return { @@ -201,14 +201,15 @@ const elHelper = container.firstElementChild; // Mutating a state signal that per-item helpers close over fires // helper invocations + setAttribute calls. Confirms per-item Reactions // wired at hydrate are reactive to external state, not just to -// itemSignal mutations. 10 cycles amplifies the work above the σ-floor. -// purpose: Cycles the shared activeID through 10 different items in a hydrated 1000-item list so two items repaint per cycle. -performance.mark(startMark('helper-100-state-change')); -for (let i = 0; i < 10; i++) { - elHelper.component.setActive(`id-${i * 100}`); +// itemSignal mutations. 1000 cycles walking every item once so the +// per-cycle two-item repaint pattern accumulates measurable work. +// purpose: Walks the shared activeID across every item in a hydrated 1000-item list so two items repaint per cycle. +performance.mark(startMark('helper-100-state-change-1k')); +for (let i = 0; i < 1000; i++) { + elHelper.component.setActive(`id-${i}`); flushWork(); } -performance.measure('helper-100-state-change', startMark('helper-100-state-change')); +performance.measure('helper-100-state-change-1k', startMark('helper-100-state-change-1k')); container.innerHTML = ''; /******************************* diff --git a/packages/component/bench/tachometer/bench-krausest.js b/packages/component/bench/tachometer/bench-krausest.js index 026da20da..322306095 100644 --- a/packages/component/bench/tachometer/bench-krausest.js +++ b/packages/component/bench/tachometer/bench-krausest.js @@ -268,13 +268,13 @@ destroy(); const el5 = await mount(); el5.component.run(1000); await flush(); -// purpose: Updates the label on every tenth row of a 1000-row table, looped ten times to lift the work above noise. -performance.mark(startMark('update-10th-10')); -for (let i = 0; i < 10; i++) { +// purpose: Updates the label on every tenth row of a 1000-row table, looped 50 times to lift the work above noise. +performance.mark(startMark('update-10th-50')); +for (let i = 0; i < 50; i++) { el5.component.update(); flushWork(); } -performance.measure('update-10th-10', startMark('update-10th-10')); +performance.measure('update-10th-50', startMark('update-10th-50')); destroy(); /******************************* @@ -355,14 +355,14 @@ destroy(); const el10 = await mount(); el10.component.run(1000); await flush(); -// purpose: Removes the last row 10 times from a 1000-row table, with no other rows needing to move. -performance.mark(startMark('remove-row-back-10')); -for (let i = 0; i < 10; i++) { +// purpose: Removes the last row 100 times from a 1000-row table, with no other rows needing to move. +performance.mark(startMark('remove-row-back-100')); +for (let i = 0; i < 100; i++) { const rows = getRows(el10); el10.component.removeRow(rows[rows.length - 1].id); flushWork(); } -performance.measure('remove-row-back-10', startMark('remove-row-back-10')); +performance.measure('remove-row-back-100', startMark('remove-row-back-100')); destroy(); /******************************* diff --git a/packages/component/bench/tachometer/bench-template.js b/packages/component/bench/tachometer/bench-template.js index ec1d44889..ce9d37a71 100644 --- a/packages/component/bench/tachometer/bench-template.js +++ b/packages/component/bench/tachometer/bench-template.js @@ -438,13 +438,13 @@ destroy(); *******************************/ const el8 = await mount('bench-snippet-in-subtemplate'); -// purpose: Mutates one subtemplate prop's source across 25 cards each invoking 4 inner snippets. Snippet bodies should stay quiet. -performance.mark(startMark('snippet-in-subtemplate-100')); -for (let i = 0; i < 50; i++) { +// purpose: Mutates one subtemplate prop's source across 25 cards each invoking 4 inner snippets, 1000 cycles. Snippet bodies should stay quiet. +performance.mark(startMark('snippet-in-subtemplate-100x1k')); +for (let i = 0; i < 1000; i++) { el8.template.state.titleVal.set(`v${i}`); flushWork(); } -performance.measure('snippet-in-subtemplate-100', startMark('snippet-in-subtemplate-100')); +performance.measure('snippet-in-subtemplate-100x1k', startMark('snippet-in-subtemplate-100x1k')); destroy(); /******************************* diff --git a/packages/component/bench/tachometer/bench-todo.js b/packages/component/bench/tachometer/bench-todo.js index 89db074a4..3a34959fe 100644 --- a/packages/component/bench/tachometer/bench-todo.js +++ b/packages/component/bench/tachometer/bench-todo.js @@ -63,14 +63,7 @@ defineComponent({ `, subTemplates: { todoItem }, defaultState: { - // Pinned to safety: 'reference' so the bench tracks the reference fast - // path regardless of Signal.defaultSafety. Dual-key shape (allowClone + - // safety) keeps the in-flight signal-API refactor compatible without - // touching the bench. Mutations use the SUI-canonical helpers below - // (push/replaceItem/removeItem/setProperty/filter/setArrayProperty), - // which bypass equality or produce new refs — no equalityFunction - // override needed. - todos: { value: [], options: { allowClone: false, safety: 'reference' } }, + todos: [], filter: 'all', editingId: null, }, @@ -237,39 +230,39 @@ destroy(); (one user click) *******************************/ -// 10× loop per index; same id every iter so signal alternates true/false. -// Metric averages toggle-on + toggle-off cost — if those diverge (class -// adds vs removes may do different DOM work), the number mixes two -// workloads. Both legs run every iter so regression detection is sound, -// but this is not a pure "single toggle" measurement. +// Same id every iter so the signal alternates true/false; metric averages +// toggle-on + toggle-off cost — if those diverge (class adds vs removes +// may do different DOM work), the number mixes two workloads. Both legs +// run every iter so regression detection is sound, but this is not a +// pure "single toggle" measurement. const el4 = await setup(100); -// purpose: Toggles the first item in a 100-item list ten times, alternating completed on and off. -performance.mark(startMark('toggle-first-10')); -for (let i = 0; i < 10; i++) { +// purpose: Toggles the first item in a 100-item list 100 times, alternating completed on and off. +performance.mark(startMark('toggle-first-100')); +for (let i = 0; i < 100; i++) { el4.component.toggleTodo(getTodos(el4)[0].id); flushWork(); } -performance.measure('toggle-first-10', startMark('toggle-first-10')); +performance.measure('toggle-first-100', startMark('toggle-first-100')); destroy(); const el5 = await setup(100); -// purpose: Toggles the last item in a 100-item list ten times, alternating completed on and off. -performance.mark(startMark('toggle-last-10')); -for (let i = 0; i < 10; i++) { +// purpose: Toggles the last item in a 100-item list 100 times, alternating completed on and off. +performance.mark(startMark('toggle-last-100')); +for (let i = 0; i < 100; i++) { el5.component.toggleTodo(getTodos(el5)[99].id); flushWork(); } -performance.measure('toggle-last-10', startMark('toggle-last-10')); +performance.measure('toggle-last-100', startMark('toggle-last-100')); destroy(); const el6 = await setup(100); -// purpose: Toggles a middle item in a 100-item list ten times, alternating completed on and off. -performance.mark(startMark('toggle-middle-10')); -for (let i = 0; i < 10; i++) { +// purpose: Toggles a middle item in a 100-item list 100 times, alternating completed on and off. +performance.mark(startMark('toggle-middle-100')); +for (let i = 0; i < 100; i++) { el6.component.toggleTodo(getTodos(el6)[49].id); flushWork(); } -performance.measure('toggle-middle-10', startMark('toggle-middle-10')); +performance.measure('toggle-middle-100', startMark('toggle-middle-100')); destroy(); /******************************* @@ -278,13 +271,13 @@ destroy(); *******************************/ const el7 = await setup(100); -// purpose: Checks off the first 10 items one by one, like a user working down a list. -performance.mark(startMark('toggle-10')); -for (let i = 0; i < 10; i++) { - el7.component.toggleTodo(getTodos(el7)[i].id); +// purpose: Cycles through the first 10 items 10 times each, like a user toggling items repeatedly down a list. +performance.mark(startMark('toggle-100')); +for (let i = 0; i < 100; i++) { + el7.component.toggleTodo(getTodos(el7)[i % 10].id); flushWork(); } -performance.measure('toggle-10', startMark('toggle-10')); +performance.measure('toggle-100', startMark('toggle-100')); destroy(); /******************************* @@ -292,54 +285,56 @@ destroy(); (one user action, all items) *******************************/ -// 20 alternating toggle-all invocations on a 100-item list — amplified -// so the measurement clears the σ≈2ms per-sample noise floor on CI. +// 200 alternating toggle-all invocations on a 100-item list. Each call +// touches every item, so the 200× sustains a measurable workload above +// the σ≈2ms per-sample noise floor on CI. const el8 = await setup(100); -// purpose: Toggles all 100 items completed and back across 20 cycles via the master checkbox. -performance.mark(startMark('toggle-all-20')); -for (let i = 0; i < 20; i++) { +// purpose: Toggles all 100 items completed and back across 200 cycles via the master checkbox. +performance.mark(startMark('toggle-all-200')); +for (let i = 0; i < 200; i++) { el8.component.toggleAll(); flushWork(); } -performance.measure('toggle-all-20', startMark('toggle-all-20')); +performance.measure('toggle-all-200', startMark('toggle-all-200')); destroy(); /******************************* Single Removal *******************************/ -// 10× loop per position; re-fetch each iter since the list shrinks. -// Each position's ~10ms per-delete workload clears the σ≈2ms floor. -const el9 = await setup(100); -// purpose: Deletes the first item 10 times from a 100-item list, with remaining items moving up each time. -performance.mark(startMark('remove-first-10')); -for (let i = 0; i < 10; i++) { +// 100× loop per position on a 200-item list — re-fetch each iter since +// the list shrinks. Setup of 200 leaves comfortable headroom past the +// 100-iter loop (list ends at 100 items, never empty). +const el9 = await setup(200); +// purpose: Deletes the first item 100 times from a 200-item list, with remaining items moving up each time. +performance.mark(startMark('remove-first-100')); +for (let i = 0; i < 100; i++) { el9.component.deleteTodo(getTodos(el9)[0].id); flushWork(); } -performance.measure('remove-first-10', startMark('remove-first-10')); +performance.measure('remove-first-100', startMark('remove-first-100')); destroy(); -const el10 = await setup(100); -// purpose: Deletes the middle item 10 times from a 100-item list, walking halfway through to find each target. -performance.mark(startMark('remove-middle-10')); -for (let i = 0; i < 10; i++) { +const el10 = await setup(200); +// purpose: Deletes the middle item 100 times from a 200-item list, walking halfway through to find each target. +performance.mark(startMark('remove-middle-100')); +for (let i = 0; i < 100; i++) { const todos = getTodos(el10); el10.component.deleteTodo(todos[Math.floor(todos.length / 2)].id); flushWork(); } -performance.measure('remove-middle-10', startMark('remove-middle-10')); +performance.measure('remove-middle-100', startMark('remove-middle-100')); destroy(); -const el10b = await setup(100); -// purpose: Deletes the last item 10 times from a 100-item list, with no other items needing to move. -performance.mark(startMark('remove-last-10')); -for (let i = 0; i < 10; i++) { +const el10b = await setup(200); +// purpose: Deletes the last item 100 times from a 200-item list, with no other items needing to move. +performance.mark(startMark('remove-last-100')); +for (let i = 0; i < 100; i++) { const todos = getTodos(el10b); el10b.component.deleteTodo(todos[todos.length - 1].id); flushWork(); } -performance.measure('remove-last-10', startMark('remove-last-10')); +performance.measure('remove-last-100', startMark('remove-last-100')); destroy(); /******************************* @@ -347,38 +342,35 @@ destroy(); *******************************/ const el11 = await setup(100); -// purpose: Deletes 5 items from the front of a 100-item list, one click at a time. -performance.mark(startMark('remove-5-front')); -for (let i = 0; i < 5; i++) { +// purpose: Deletes 50 items from the front of a 100-item list, one click at a time. +performance.mark(startMark('remove-50-front')); +for (let i = 0; i < 50; i++) { el11.component.deleteTodo(getTodos(el11)[0].id); flushWork(); } -performance.measure('remove-5-front', startMark('remove-5-front')); +performance.measure('remove-50-front', startMark('remove-50-front')); destroy(); -// 10× loop (vs 5× for the front/back variants) — middle removal's -// O(N/2) scan has wider per-sample variance, so 5× landed at ~74ms -// with observed CI straddling ±2%. 10× brings it to ~148ms / ±1%. const el11b = await setup(100); -// purpose: Deletes 10 items from the middle of a 100-item list, one click at a time. -performance.mark(startMark('remove-10-middle')); -for (let i = 0; i < 10; i++) { +// purpose: Deletes 50 items from the middle of a 100-item list, one click at a time. +performance.mark(startMark('remove-50-middle')); +for (let i = 0; i < 50; i++) { const todos = getTodos(el11b); el11b.component.deleteTodo(todos[Math.floor(todos.length / 2)].id); flushWork(); } -performance.measure('remove-10-middle', startMark('remove-10-middle')); +performance.measure('remove-50-middle', startMark('remove-50-middle')); destroy(); const el11c = await setup(100); -// purpose: Deletes 5 items from the end of a 100-item list, one click at a time. -performance.mark(startMark('remove-5-back')); -for (let i = 0; i < 5; i++) { +// purpose: Deletes 50 items from the end of a 100-item list, one click at a time. +performance.mark(startMark('remove-50-back')); +for (let i = 0; i < 50; i++) { const todos = getTodos(el11c); el11c.component.deleteTodo(todos[todos.length - 1].id); flushWork(); } -performance.measure('remove-5-back', startMark('remove-5-back')); +performance.measure('remove-50-back', startMark('remove-50-back')); destroy(); /******************************* @@ -462,14 +454,14 @@ destroy(); // `toggle-*` (which uses replaceItem) and `edit-cycle-5` (which mixes // in an editingId flip per cycle). const el16 = await setup(100); -// purpose: Renames 50 different items in a 100-item list via single-field setProperty without editingId co-fires. -performance.mark(startMark('rename-50')); -for (let i = 0; i < 50; i++) { +// purpose: Renames items in a 100-item list 500 times via single-field setProperty without editingId co-fires. +performance.mark(startMark('rename-500')); +for (let i = 0; i < 500; i++) { const todos = getTodos(el16); el16.component.renameTodo(todos[i % todos.length].id, `Renamed ${i}`); flushWork(); } -performance.measure('rename-50', startMark('rename-50')); +performance.measure('rename-500', startMark('rename-500')); destroy(); /******************************* diff --git a/packages/component/bench/tachometer/tachometer-ci-hydrate.json b/packages/component/bench/tachometer/tachometer-ci-hydrate.json index 974d5e2b0..aea7e7d55 100644 --- a/packages/component/bench/tachometer/tachometer-ci-hydrate.json +++ b/packages/component/bench/tachometer/tachometer-ci-hydrate.json @@ -13,7 +13,7 @@ { "mode": "performance", "entryName": "each-100-mount" }, { "mode": "performance", "entryName": "each-100" }, { "mode": "performance", "entryName": "helper-100-mount" }, - { "mode": "performance", "entryName": "helper-100-state-change" } + { "mode": "performance", "entryName": "helper-100-state-change-1k" } ] }, { @@ -24,7 +24,7 @@ { "mode": "performance", "entryName": "each-100-mount" }, { "mode": "performance", "entryName": "each-100" }, { "mode": "performance", "entryName": "helper-100-mount" }, - { "mode": "performance", "entryName": "helper-100-state-change" } + { "mode": "performance", "entryName": "helper-100-state-change-1k" } ] } ] diff --git a/packages/component/bench/tachometer/tachometer-ci-krausest.json b/packages/component/bench/tachometer/tachometer-ci-krausest.json index efe8b5f8f..1831aa38e 100644 --- a/packages/component/bench/tachometer/tachometer-ci-krausest.json +++ b/packages/component/bench/tachometer/tachometer-ci-krausest.json @@ -14,12 +14,12 @@ { "mode": "performance", "entryName": "create-10k" }, { "mode": "performance", "entryName": "replace-1k" }, { "mode": "performance", "entryName": "append-1k" }, - { "mode": "performance", "entryName": "update-10th-10" }, + { "mode": "performance", "entryName": "update-10th-50" }, { "mode": "performance", "entryName": "select-40" }, { "mode": "performance", "entryName": "swap-rows-20" }, { "mode": "performance", "entryName": "remove-row-front-20" }, { "mode": "performance", "entryName": "remove-row-middle-20" }, - { "mode": "performance", "entryName": "remove-row-back-10" }, + { "mode": "performance", "entryName": "remove-row-back-100" }, { "mode": "performance", "entryName": "clear-10k" } ] }, @@ -32,12 +32,12 @@ { "mode": "performance", "entryName": "create-10k" }, { "mode": "performance", "entryName": "replace-1k" }, { "mode": "performance", "entryName": "append-1k" }, - { "mode": "performance", "entryName": "update-10th-10" }, + { "mode": "performance", "entryName": "update-10th-50" }, { "mode": "performance", "entryName": "select-40" }, { "mode": "performance", "entryName": "swap-rows-20" }, { "mode": "performance", "entryName": "remove-row-front-20" }, { "mode": "performance", "entryName": "remove-row-middle-20" }, - { "mode": "performance", "entryName": "remove-row-back-10" }, + { "mode": "performance", "entryName": "remove-row-back-100" }, { "mode": "performance", "entryName": "clear-10k" } ] } diff --git a/packages/component/bench/tachometer/tachometer-ci-template.json b/packages/component/bench/tachometer/tachometer-ci-template.json index 458712381..f6aa8dbf4 100644 --- a/packages/component/bench/tachometer/tachometer-ci-template.json +++ b/packages/component/bench/tachometer/tachometer-ci-template.json @@ -16,7 +16,7 @@ { "mode": "performance", "entryName": "active-indicator-200" }, { "mode": "performance", "entryName": "stable-ref-mutate-500" }, { "mode": "performance", "entryName": "subtemplate-data-blob-100" }, - { "mode": "performance", "entryName": "snippet-in-subtemplate-100" }, + { "mode": "performance", "entryName": "snippet-in-subtemplate-100x1k" }, { "mode": "performance", "entryName": "active-indicator-nested-200" }, { "mode": "performance", "entryName": "subtemplate-helpers-light-100" }, { "mode": "performance", "entryName": "subtemplate-helpers-heavy-100" }, @@ -34,7 +34,7 @@ { "mode": "performance", "entryName": "active-indicator-200" }, { "mode": "performance", "entryName": "stable-ref-mutate-500" }, { "mode": "performance", "entryName": "subtemplate-data-blob-100" }, - { "mode": "performance", "entryName": "snippet-in-subtemplate-100" }, + { "mode": "performance", "entryName": "snippet-in-subtemplate-100x1k" }, { "mode": "performance", "entryName": "active-indicator-nested-200" }, { "mode": "performance", "entryName": "subtemplate-helpers-light-100" }, { "mode": "performance", "entryName": "subtemplate-helpers-heavy-100" }, diff --git a/packages/component/bench/tachometer/tachometer-ci-todo-micro.json b/packages/component/bench/tachometer/tachometer-ci-todo-micro.json index bb779e0bf..2769c3d23 100644 --- a/packages/component/bench/tachometer/tachometer-ci-todo-micro.json +++ b/packages/component/bench/tachometer/tachometer-ci-todo-micro.json @@ -10,16 +10,16 @@ "url": "ci-current-todo.html", "browser": { "name": "chrome", "headless": true }, "measurement": [ - { "mode": "performance", "entryName": "toggle-first-10" }, - { "mode": "performance", "entryName": "toggle-middle-10" }, - { "mode": "performance", "entryName": "toggle-last-10" }, - { "mode": "performance", "entryName": "remove-first-10" }, - { "mode": "performance", "entryName": "remove-middle-10" }, - { "mode": "performance", "entryName": "remove-last-10" }, + { "mode": "performance", "entryName": "toggle-first-100" }, + { "mode": "performance", "entryName": "toggle-middle-100" }, + { "mode": "performance", "entryName": "toggle-last-100" }, + { "mode": "performance", "entryName": "remove-first-100" }, + { "mode": "performance", "entryName": "remove-middle-100" }, + { "mode": "performance", "entryName": "remove-last-100" }, { "mode": "performance", "entryName": "filter-cycle-20" }, { "mode": "performance", "entryName": "edit-start-10" }, { "mode": "performance", "entryName": "edit-cycle-5" }, - { "mode": "performance", "entryName": "rename-50" } + { "mode": "performance", "entryName": "rename-500" } ] }, { @@ -27,16 +27,16 @@ "url": "ci-baseline-todo.html", "browser": { "name": "chrome", "headless": true }, "measurement": [ - { "mode": "performance", "entryName": "toggle-first-10" }, - { "mode": "performance", "entryName": "toggle-middle-10" }, - { "mode": "performance", "entryName": "toggle-last-10" }, - { "mode": "performance", "entryName": "remove-first-10" }, - { "mode": "performance", "entryName": "remove-middle-10" }, - { "mode": "performance", "entryName": "remove-last-10" }, + { "mode": "performance", "entryName": "toggle-first-100" }, + { "mode": "performance", "entryName": "toggle-middle-100" }, + { "mode": "performance", "entryName": "toggle-last-100" }, + { "mode": "performance", "entryName": "remove-first-100" }, + { "mode": "performance", "entryName": "remove-middle-100" }, + { "mode": "performance", "entryName": "remove-last-100" }, { "mode": "performance", "entryName": "filter-cycle-20" }, { "mode": "performance", "entryName": "edit-start-10" }, { "mode": "performance", "entryName": "edit-cycle-5" }, - { "mode": "performance", "entryName": "rename-50" } + { "mode": "performance", "entryName": "rename-500" } ] } ] diff --git a/packages/component/bench/tachometer/tachometer-ci-todo.json b/packages/component/bench/tachometer/tachometer-ci-todo.json index 4176dd030..5a75e979a 100644 --- a/packages/component/bench/tachometer/tachometer-ci-todo.json +++ b/packages/component/bench/tachometer/tachometer-ci-todo.json @@ -12,11 +12,11 @@ "measurement": [ { "mode": "performance", "entryName": "bulk-add-500" }, { "mode": "performance", "entryName": "add-20" }, - { "mode": "performance", "entryName": "toggle-10" }, - { "mode": "performance", "entryName": "toggle-all-20" }, - { "mode": "performance", "entryName": "remove-5-front" }, - { "mode": "performance", "entryName": "remove-10-middle" }, - { "mode": "performance", "entryName": "remove-5-back" }, + { "mode": "performance", "entryName": "toggle-100" }, + { "mode": "performance", "entryName": "toggle-all-200" }, + { "mode": "performance", "entryName": "remove-50-front" }, + { "mode": "performance", "entryName": "remove-50-middle" }, + { "mode": "performance", "entryName": "remove-50-back" }, { "mode": "performance", "entryName": "clear-completed-250" } ] }, @@ -27,11 +27,11 @@ "measurement": [ { "mode": "performance", "entryName": "bulk-add-500" }, { "mode": "performance", "entryName": "add-20" }, - { "mode": "performance", "entryName": "toggle-10" }, - { "mode": "performance", "entryName": "toggle-all-20" }, - { "mode": "performance", "entryName": "remove-5-front" }, - { "mode": "performance", "entryName": "remove-10-middle" }, - { "mode": "performance", "entryName": "remove-5-back" }, + { "mode": "performance", "entryName": "toggle-100" }, + { "mode": "performance", "entryName": "toggle-all-200" }, + { "mode": "performance", "entryName": "remove-50-front" }, + { "mode": "performance", "entryName": "remove-50-middle" }, + { "mode": "performance", "entryName": "remove-50-back" }, { "mode": "performance", "entryName": "clear-completed-250" } ] } diff --git a/packages/component/bench/tachometer/tachometer-krausest.json b/packages/component/bench/tachometer/tachometer-krausest.json index a6baaa3fe..298703189 100644 --- a/packages/component/bench/tachometer/tachometer-krausest.json +++ b/packages/component/bench/tachometer/tachometer-krausest.json @@ -14,12 +14,12 @@ { "mode": "performance", "entryName": "create-10k" }, { "mode": "performance", "entryName": "replace-1k" }, { "mode": "performance", "entryName": "append-1k" }, - { "mode": "performance", "entryName": "update-10th-10" }, + { "mode": "performance", "entryName": "update-10th-50" }, { "mode": "performance", "entryName": "select-40" }, { "mode": "performance", "entryName": "swap-rows-20" }, { "mode": "performance", "entryName": "remove-row-front-20" }, { "mode": "performance", "entryName": "remove-row-middle-20" }, - { "mode": "performance", "entryName": "remove-row-back-10" }, + { "mode": "performance", "entryName": "remove-row-back-100" }, { "mode": "performance", "entryName": "clear-10k" } ] } diff --git a/packages/component/bench/tachometer/tachometer-todo-micro.json b/packages/component/bench/tachometer/tachometer-todo-micro.json index 7acbafe9e..456d8bb4f 100644 --- a/packages/component/bench/tachometer/tachometer-todo-micro.json +++ b/packages/component/bench/tachometer/tachometer-todo-micro.json @@ -10,12 +10,12 @@ "url": "todo.html", "browser": { "name": "chrome", "headless": true }, "measurement": [ - { "mode": "performance", "entryName": "toggle-first-10" }, - { "mode": "performance", "entryName": "toggle-last-10" }, - { "mode": "performance", "entryName": "toggle-middle-10" }, - { "mode": "performance", "entryName": "remove-first-10" }, - { "mode": "performance", "entryName": "remove-middle-10" }, - { "mode": "performance", "entryName": "remove-last-10" }, + { "mode": "performance", "entryName": "toggle-first-100" }, + { "mode": "performance", "entryName": "toggle-last-100" }, + { "mode": "performance", "entryName": "toggle-middle-100" }, + { "mode": "performance", "entryName": "remove-first-100" }, + { "mode": "performance", "entryName": "remove-middle-100" }, + { "mode": "performance", "entryName": "remove-last-100" }, { "mode": "performance", "entryName": "filter-cycle-20" }, { "mode": "performance", "entryName": "edit-start-10" }, { "mode": "performance", "entryName": "edit-cycle-5" } diff --git a/packages/component/bench/tachometer/tachometer-todo.json b/packages/component/bench/tachometer/tachometer-todo.json index 4beae2eee..b820da18d 100644 --- a/packages/component/bench/tachometer/tachometer-todo.json +++ b/packages/component/bench/tachometer/tachometer-todo.json @@ -13,11 +13,11 @@ { "mode": "performance", "entryName": "bulk-add-500" }, { "mode": "performance", "entryName": "bulk-add-200" }, { "mode": "performance", "entryName": "add-20" }, - { "mode": "performance", "entryName": "toggle-10" }, - { "mode": "performance", "entryName": "toggle-all-20" }, - { "mode": "performance", "entryName": "remove-5-front" }, - { "mode": "performance", "entryName": "remove-10-middle" }, - { "mode": "performance", "entryName": "remove-5-back" }, + { "mode": "performance", "entryName": "toggle-100" }, + { "mode": "performance", "entryName": "toggle-all-200" }, + { "mode": "performance", "entryName": "remove-50-front" }, + { "mode": "performance", "entryName": "remove-50-middle" }, + { "mode": "performance", "entryName": "remove-50-back" }, { "mode": "performance", "entryName": "clear-completed-250" } ] } diff --git a/packages/reactivity/bench/tachometer/bench-signal.js b/packages/reactivity/bench/tachometer/bench-signal.js index 6287270ad..64837a88e 100644 --- a/packages/reactivity/bench/tachometer/bench-signal.js +++ b/packages/reactivity/bench/tachometer/bench-signal.js @@ -278,7 +278,7 @@ let sink = null; performance.measure('reaction-flush-noop-5m', startMark('reaction-flush-noop-5m')); } -// reaction-coalesce-200x100 — 200 bursts, each setting the signal 100 +// reaction-coalesce-400x100 — 400 bursts, each setting the signal 100 // times before one flush. With coalescing, all 100 subscribers wake once // per burst regardless of set count. Without coalescing, each subscriber // wakes 100 times per burst — wall-clock balloons proportionally. @@ -290,23 +290,23 @@ let sink = null; sink = sig.get(); }); } - // purpose: Sets one signal 100 times then flushes once across 200 bursts so 100 subscribers wake one time per burst. - performance.mark(startMark('reaction-coalesce-200x100')); - for (let burst = 0; burst < 200; burst++) { + // purpose: Sets one signal 100 times then flushes once across 400 bursts so 100 subscribers wake one time per burst. + performance.mark(startMark('reaction-coalesce-400x100')); + for (let burst = 0; burst < 400; burst++) { for (let setN = 0; setN < 100; setN++) { sig.set(burst * 100 + setN + 1); } Reaction.flush(); } - performance.measure('reaction-coalesce-200x100', startMark('reaction-coalesce-200x100')); + performance.measure('reaction-coalesce-400x100', startMark('reaction-coalesce-400x100')); for (let i = 0; i < 100; i++) { subs[i].stop(); } } -// reaction-dep-diff-30k — a subscriber that reads a different signal +// reaction-dep-diff-45k — a subscriber that reads a different signal // depending on a toggle. Each cycle flips the toggle, so the reaction's // dependency set changes (drops one signal, picks up another). Exercises // the per-run dep-set diffing path that fires on every reactive -// expression's re-run in real components. 30k cycles to comfortably clear +// expression's re-run in real components. 45k cycles to comfortably clear // the σ-floor at ~1µs/cycle. { const sigA = new Signal('a'); @@ -315,13 +315,13 @@ let sink = null; const r = Reaction.create(() => { sink = toggle.get() ? sigA.get() : sigB.get(); }); - // purpose: Toggles which of two signals a subscriber reads across 30000 cycles. Per-run dep-set diffing. - performance.mark(startMark('reaction-dep-diff-30k')); - for (let i = 0; i < 30_000; i++) { + // purpose: Toggles which of two signals a subscriber reads across 45000 cycles. Per-run dep-set diffing. + performance.mark(startMark('reaction-dep-diff-45k')); + for (let i = 0; i < 45_000; i++) { toggle.set(i % 2 === 0); Reaction.flush(); } - performance.measure('reaction-dep-diff-30k', startMark('reaction-dep-diff-30k')); + performance.measure('reaction-dep-diff-45k', startMark('reaction-dep-diff-45k')); r.stop(); } diff --git a/packages/reactivity/bench/tachometer/tachometer-ci-signal.json b/packages/reactivity/bench/tachometer/tachometer-ci-signal.json index 62045e893..9f930512e 100644 --- a/packages/reactivity/bench/tachometer/tachometer-ci-signal.json +++ b/packages/reactivity/bench/tachometer/tachometer-ci-signal.json @@ -21,8 +21,8 @@ { "mode": "performance", "entryName": "set-same-10m" }, { "mode": "performance", "entryName": "sub-unsub-100k" }, { "mode": "performance", "entryName": "reaction-flush-noop-5m" }, - { "mode": "performance", "entryName": "reaction-coalesce-200x100" }, - { "mode": "performance", "entryName": "reaction-dep-diff-30k" } + { "mode": "performance", "entryName": "reaction-coalesce-400x100" }, + { "mode": "performance", "entryName": "reaction-dep-diff-45k" } ] }, { @@ -41,8 +41,8 @@ { "mode": "performance", "entryName": "set-same-10m" }, { "mode": "performance", "entryName": "sub-unsub-100k" }, { "mode": "performance", "entryName": "reaction-flush-noop-5m" }, - { "mode": "performance", "entryName": "reaction-coalesce-200x100" }, - { "mode": "performance", "entryName": "reaction-dep-diff-30k" } + { "mode": "performance", "entryName": "reaction-coalesce-400x100" }, + { "mode": "performance", "entryName": "reaction-dep-diff-45k" } ] } ]