Journal section for #3389 (2026-09-12 → 2026-09-28):
instruments (yak-bench, browser CPU attribution), the thirteen
experiments with their PRs and numbers, the rc.10 client profile that
closed the hydration item, the two 2026-09-28 client probes (spread
walk classify-once: ±1%; plain-only view materialization: +12–14% on
chains) and the rulings that fall out — server views / client copies,
walk and representation are not the client lever, cold tier, perf vs
size — plus the open targets in order, first among them per-row node
count in the reactive core. benchmarking-strategy lists yak-bench under
Tier 2.
Co-authored-by: Claude via Cursor <noreply@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Closes out #3389 into the performance journal, per the maintainer's call to keep future performance considerations in
documentation/rather than on the tracker.What's added
documentation/performance-experiments.md— a new lane, Props Composition Lane (2026-09-12 → 2026-09-28): the yak tracker, in the same hand-off shape as the Octane board section:TAG/SOLID_DIRA/Bs, the verify gate, browser bench), the browser CPU attribution method (unminified lane, CDP profiler, sourcemapped, windowed to the hydrate/mount call), the in-repo tier-1 benches.spread()one effect (perf(web): spread() creates fewer reactive nodes and accepts a sources array #3419),dynamic(…, { static })/isStatic(perf(signals,web): dynamic(source, { static }) and isStatic(o, key) #3471), lazy views (perf(signals,web,universal,html): merge/omit are always lazy views; consumers read the leaves #3454/chore(solid,web,universal): the runtimes' seams move behind solid-js/internal #3470/perf(signals,web): views build their key table on enumeration or after 16 reads; ssrElement walks a view's entries #3475/perf(signals,web): omit over a merge holds the merge record — one record per layer, one-pass owners walk for ssrElement #3497, perf(signals): omit() copies folded filters by exact concat while short, chains them past 8 keys #3487 closed),ssrElementsources + attrs (feat(web): ssrElement accepts an array of prop sources and a skip predicate #3418/perf(web): ssrElement joins plain children in place and walks uniform sources without resolved lists #3486/perf(ssr): spread-element tails as markup, hoisted spread sources, ssrElement/merge at the writer floor #3562), hydration trims (perf(web,signals): trim per-node work on the hydration claim path #3513), the props literal (Compiler: props literals with accessors are the largest SSR self-time bucket on composition cases (computed keys + closure-per-getter) #3511/perf(compilers): emit getter keys as string literals, never computed #3514/perf(compiler): SSR props literals with getters compile to hoisted constructors (hoistProps) #3550), theme merge parity, the rc.10 re-run and per-primitive swaps, the rc.10 client profile that closed the hydration item, thebtn-variantclient parity fix, and the two 2026-09-28 client probes —spread()array-form classify-once (±1% in the browser) and client materialization of plain-only views (+12–14% on chains, −5–7% on a single layer;#3448holds on the client) — with thepolymorphic-chainclient mount attribution.merge()'s function-source memo takes a hydration id; the CodSpeed rule.perf/spread-walk, the yak-side watch.documentation/benchmarking-strategy.md— yak-bench listed under Tier 2 with a link to the lane.Public API changes
None — documentation only. No changeset (no
packages/source touched).Co-authored-by: Claude via Cursor
Made with Cursor