You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PR #657 made the keyed-middle child reconcile correct (fixed the C1 rotation-identity + H1 stale-oracle bugs) via a right-to-left LIS anchor walk. That correctness costs ~+18.5% keyed-reconcile time (~0.77ms/render at 500 rows / 50% reorder) vs the prior left-to-right version — in exchange for #657's −30.9% / −98K B/render keyed alloc win (the shipped deliverable).
We investigated whether the time was recoverable. It is not, in scope — empirically proven:
The +18.5% is intrinsic to correctness. The correct reorder requires the more-expensive R→L moves (avg array-shift 524 vs the buggy L→R's 433). The decisive lr-corr experiment — a correct-oracle, LIS-minimal, cheap-L→R-target algorithm — is still wrong 300/300 ticks, proving no LIS-minimal correct algorithm can use the cheaper short-distance moves. The pre-perf: eliminate per-diff allocations in ChildReconciler + KeyedListDiff #657 speed was a bug artifact (cheap-but-wrong moves every tick).
Rebuild / detach-reappend is +63% (COM-call-bound).
Decision taken: accept the trade (keep the alloc win + correctness; accept the keyed-time cost). #738 (SIMD) closed as correct-but-no-gain.
The one open research lever (intentionally not pursued now)
A reconciler that minimizes total array-shift distance (Σ|from−to|) subject to COM-call overhead, instead of minimizing move count (LIS). The textbook DOM-optimal LIS (Vue3/Inferno) is not optimal for an array-backed collection where Move ≠ O(1). This is a research-grade reconciler redesign with high correctness risk on a surface that already produced two shipped bugs, for ~0.77ms of headroom on a synthetic stress workload — recommended against unless keyed-list reorder throughput becomes a priority.
Note: the keyed-list /perf leg (StressPerf.KeyedList) and the new Flex/Yoga leg (StressPerf.Flex, added in #737) can now measure any such future work.
Filed for the record so this isn't re-investigated; not an action item.
Context (backlog / de-prioritized research note)
PR #657 made the keyed-middle child reconcile correct (fixed the C1 rotation-identity + H1 stale-oracle bugs) via a right-to-left LIS anchor walk. That correctness costs ~+18.5% keyed-reconcile time (~0.77ms/render at 500 rows / 50% reorder) vs the prior left-to-right version — in exchange for #657's −30.9% / −98K B/render keyed alloc win (the shipped deliverable).
We investigated whether the time was recoverable. It is not, in scope — empirically proven:
IChildCollection.Move→UIElementCollection.RemoveAt+Insertis O(|from−to|) native array-shift + COM. TheoldRelToPanelbookkeeping is ~0.4% of reconcile (so the SIMD attempt in perf(reconciler): SIMD-vectorize keyed-middle index shifts — recover #657 keyed-reconcile time, keep −30.9% alloc #738 recovered ~0%, confirmed by /perf; reference-anchor O(1) would be equally null).lr-correxperiment — a correct-oracle, LIS-minimal, cheap-L→R-target algorithm — is still wrong 300/300 ticks, proving no LIS-minimal correct algorithm can use the cheaper short-distance moves. The pre-perf: eliminate per-diff allocations in ChildReconciler + KeyedListDiff #657 speed was a bug artifact (cheap-but-wrong moves every tick).Decision taken: accept the trade (keep the alloc win + correctness; accept the keyed-time cost). #738 (SIMD) closed as correct-but-no-gain.
The one open research lever (intentionally not pursued now)
A reconciler that minimizes total array-shift distance (Σ|from−to|) subject to COM-call overhead, instead of minimizing move count (LIS). The textbook DOM-optimal LIS (Vue3/Inferno) is not optimal for an array-backed collection where
Move≠ O(1). This is a research-grade reconciler redesign with high correctness risk on a surface that already produced two shipped bugs, for ~0.77ms of headroom on a synthetic stress workload — recommended against unless keyed-list reorder throughput becomes a priority.Note: the keyed-list /perf leg (
StressPerf.KeyedList) and the new Flex/Yoga leg (StressPerf.Flex, added in #737) can now measure any such future work.Filed for the record so this isn't re-investigated; not an action item.