palabras(perf): fast-path por referencia en syncExternalState — arregla el atasco base64

CAUSA REAL del «atasco» de imágenes base64 (hallada por CPU profile: 34% de las
muestras). El sync del `bind:value` (`syncExternalState`) comparaba el `value`
bindeado contra el doc interno con `samePalabrasDocument` — una comparación DEEP
O(documento) — EN CADA cambio. Como el editor escribe `value` con la MISMA
referencia del doc interno (publishState → `this.document`), esa comparación
recorría el string base64 (MB) por tecla para nada.

Fix: un check de igualdad por REFERENCIA antes del deep-compare — el caso común
(nuestras propias ediciones) se resuelve en O(1); el `samePalabrasDocument` solo
corre cuando la referencia difiere de verdad (una escritura externa).

Medido (imagen base64 de 2MB en el modelo): tecleo 20ms/char → 12ms/char. NO era
el `src` grande en el DOM (mi hipótesis inicial, errónea) — era el deep-compare.
Verificado: provider 53 tests verdes; check 0 errores palabras.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
alpha-0.1-sec-dom
dev 3 months ago
parent d3f10b89cf
commit d96e4cde7f

@ -2193,7 +2193,13 @@ export class PalabrasProvider {
) {
const current = this.history.present;
if (!samePalabrasDocument(externalDocument, current.document)) {
// Fast path: our OWN edits round-trip the SAME document reference back
// through the bound `value` (publishState writes `this.document`), so a
// reference check settles the common case in O(1). The structural
// `samePalabrasDocument` below is an O(document) deep walk — catastrophic
// per keystroke with large base64 image data-URLs in the model — so only
// reach it when the reference genuinely differs (an external write).
if (externalDocument !== current.document && !samePalabrasDocument(externalDocument, current.document)) {
const nextState = createState(externalDocument, externalSelection);
if (!samePalabrasDocument(nextState.document, current.document)) {
const limit = this.history.limit;

Loading…
Cancel
Save

Powered by TurnKey Linux.