RUNDE YTDOM3 -- WARUM ytd-app NIE REGISTRIERT WIRD. Gemessen 12.09.2026. main 93d452a (gepusht), vier Sach-Commits ab 46cd7f5 Firn-Pin 7893ea2c + fuenf Flicken, Uebersetzer selbst gebaut =================== 1. YTDOM2 NACH MAIN -- ERLEDIGT ===================== Zusammengefuehrt und gepusht (46cd7f5). Keine einzige Datei ueberschnitt sich mit der fUi-Umstellung: diese Arbeit fasst nur lib/js und lib/browser/{domjs,netjs,web1_main}.fi an, die fUi-Runde lib/widget, chrome.fi, certus_app.fi, lib/android und lib/font. Nachgesehen mit `comm` ueber beide Dateilisten, nicht angenommen. lib/browser/skript.fi ist und bleibt GELOESCHT. ========================= VORHER / NACHHER ============================== SEITE ELEMENTE KNOTEN SKRIPTE/FEHLER SEKUNDEN youtube.com 427 493 43 / 1 497 m.youtube.com 427 493 43 / 1 (wie oben) xoffi.ai 1131 1422 19 / 0 ~19 Gegen main VOR dieser Runde (46cd7f5) sind die DOM-Zahlen UNVERAENDERT. Das wird hier nicht schoengeredet: die zwei Funde dieser Runde sind ein Tempo-Fund und ein Ursachen-Fund, und KEINER von beiden hat die Knotenzahl bewegt. Der Grund steht in Abschnitt 4 -- die Stelle, an der das Buendel stirbt, ist jetzt behoben, aber der Lauf danach war bis Sitzungsende nicht fertig zu messen. ============== 2. DER TEMPO-FUND: join WAR QUADRATISCH ================== Drei gdb-Stichproben an einem haengenden youtube.com-Lauf standen ALLE an derselben Stelle: __gc_mark <- str_push <- val.str_concat <- builtin.fi:2022 Zeile 2022 ist `Array.prototype.join`. Dort stand zweimal `out = str_concat(r, out, ...)`, und `str_concat` legt JEDES MAL einen neuen String an und kopiert den ganzen bisherigen Zwischenstand mit hinein: ueber n Stuecke 1+2+3+...+n Zeichen. Jeder dieser Strings ist Abfall -- deshalb zeigte die Stichprobe den SAMMLER und nicht den Zeichenkopierer. GEMESSEN an `Array(N).concat("y").join(",")`: N VORHER NACHHER 500 269 ms 189 ms 1 000 667 ms 184 ms 2 000 4 750 ms 187 ms 4 000 16 967 ms 226 ms (75x) 20 000 nicht messbar 205 ms Vorher vervierfachte eine Verdopplung von N die Zeit -- die Signatur von O(n^2). Nachher ist die Zeit FLACH: N=20000 kostet so viel wie N=500. GEBAUT: `val.str_append(akk, b)` haengt an den VORHANDENEN Puffer an. Das darf nur fuer einen Akkumulator gelten, den ausser dem Aufrufer niemand haelt -- ein JavaScript-String ist unveraenderlich. `join` und `String.prototype.concat` legen sich deshalb einen eigenen Puffer an und geben ihn erst am Ende heraus; `str_concat` bleibt fuer `a + b` unveraendert. GEGEN node.js GEPRUEFT, 14 Faelle, Zeichen fuer Zeichen gleich -- darunter die, die leicht kaputtgehen: [null,undefined,1].join(",") ,,1 Luecken bleiben leer Array(3).join("-") -- [1,[2,3],4].join(",") 1,2,3,4 verschachtelt [1,2].join() 1,2 ohne Argument [{},[]].join(",") [object Object], "".concat(1,null,true) 1nulltrue EHRLICH: dieser Fix macht die Seite SCHNELLER, aber er bringt KEINEN einzigen zusaetzlichen DOM-Knoten. Er war nicht die Ursache der leeren Seite. =========== 3. DIE KERNFRAGE: WIRD ytd-app REGISTRIERT? ================= NEIN. Und der Grund ist jetzt gemessen statt vermutet. Dazu wurde ein VORAB-HAKEN gebaut (web1_main, Argument 4): JavaScript, das laeuft, BEVOR das erste Seitenskript laeuft. Ohne ihn zaehlt man nur Truemmer, weil das Buendel `define` laengst gerufen hat oder vorher gestorben ist. DIE FRAGE: ytd-app registriert? NEIN customElements vorhanden ja (aus der Polyfill) define / get / whenDefined / upgrade alle vier function define WIRKLICH gerufen 0 MAL get / whenDefined / upgrade gerufen 0 / 0 / 0 im Baum ja, 14 Kinder .shadowRoot nein Polymer / Polymer.Element function / ja ytcfg object Es ist also KEIN Fehler IN `define` -- der Aufruf kommt nie. Alles steht bereit, und niemand ruft es. SHADOW DOM, gemessen: attachShadow undefined FEHLT GANZ ShadowRoot function nur eine Attrappe slot SLOT da, aber assignedNodes UND assignedElements undefined MODULE: