From 8a0496dbb35a7b751c1473e36b20872fb6162836 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 7 Sep 2026 20:24:52 +0000 Subject: [PATCH] =?UTF-8?q?corpus=20de=20maquetaci=C3=B3n=20para=20el=20PG?= =?UTF-8?q?O:=2010=20p=C3=A1ginas=20nuestras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Medida la ganancia del PGO ayer: -9,4% en una página de DOM/maquetación y -1,0% en 3d-raytrace de SunSpider. La razón de la diferencia es que un benchmark JIT-bound es casi CIEGO al PGO: el bucle caliente no lo ejecuta el C++ de SpiderMonkey sino el código máquina que el JIT emite en runtime, y el PGO optimiza el intérprete, el GC y el propio JIT — no lo que el JIT produce. El corpus de Mozilla está dominado en número de páginas por SunSpider, o sea que entrenaba mucho justo donde el PGO menos rinde. Estas diez ejercitan el camino que sí es C++ de punta a punta: flex flexbox anidado, wrap, alineaciones rejilla CSS Grid: pistas, áreas nombradas, auto-fit tablas tablas grandes con table-layout FIJO y AUTO (dos algoritmos) texto columnas, shaping, reflujo por cambio de ancho selectores DOM profundo contra 600 reglas, muchas que NO casan pintado degradados, sombras, opacidad, mix-blend-mode transformar transforms y contextos de apilamiento svg paths, degradados, clip desbordes overflow anidado, position:sticky, scroll programático reflujo layout thrashing: leer y escribir geometría alternadamente Reglas que cumplen todas, y no son de estilo: · DETERMINISTAS (LCG propio, ni Math.random ni Date ni red) — dos corridas hacen lo mismo, así que dos perfiles difieren por el timing de los contadores y no por haber visitado caminos distintos. · AUTOCONTENIDAS — el perfilado corre sin red. · NUESTRAS — nada de páginas ajenas capturadas, que traerían licencia y fragilidad. · ACOTADAS — 16 a 32 s cada una; el perfilado arranca un navegador POR PÁGINA. Validadas las diez contra el firefox sellado: todas renderizan y producen captura. `flex` hubo que acortarla de 40 a 12 cajas raíz: con 40 la página medía 68.241 px de alto y la captura moría con «Failed to allocate a surface due to invalid size». El layout ocurría igual, pero sin captura no se ejercita el pintado, que es justo la mitad que se venía a entrenar. --- scripts/pgo-corpus/README.md | 38 +++++++++++++++++++++++++++++ scripts/pgo-corpus/desbordes.html | 27 ++++++++++++++++++++ scripts/pgo-corpus/flex.html | 27 ++++++++++++++++++++ scripts/pgo-corpus/pintado.html | 22 +++++++++++++++++ scripts/pgo-corpus/reflujo.html | 20 +++++++++++++++ scripts/pgo-corpus/rejilla.html | 27 ++++++++++++++++++++ scripts/pgo-corpus/selectores.html | 35 ++++++++++++++++++++++++++ scripts/pgo-corpus/svg.html | 29 ++++++++++++++++++++++ scripts/pgo-corpus/tablas.html | 32 ++++++++++++++++++++++++ scripts/pgo-corpus/texto.html | 30 +++++++++++++++++++++++ scripts/pgo-corpus/transformar.html | 21 ++++++++++++++++ 11 files changed, 308 insertions(+) create mode 100644 scripts/pgo-corpus/README.md create mode 100644 scripts/pgo-corpus/desbordes.html create mode 100644 scripts/pgo-corpus/flex.html create mode 100644 scripts/pgo-corpus/pintado.html create mode 100644 scripts/pgo-corpus/reflujo.html create mode 100644 scripts/pgo-corpus/rejilla.html create mode 100644 scripts/pgo-corpus/selectores.html create mode 100644 scripts/pgo-corpus/svg.html create mode 100644 scripts/pgo-corpus/tablas.html create mode 100644 scripts/pgo-corpus/texto.html create mode 100644 scripts/pgo-corpus/transformar.html diff --git a/scripts/pgo-corpus/README.md b/scripts/pgo-corpus/README.md new file mode 100644 index 00000000..ddabcaea --- /dev/null +++ b/scripts/pgo-corpus/README.md @@ -0,0 +1,38 @@ +# Corpus de maquetación para el PGO de Gecko + +Páginas de entrenamiento **nuestras** que complementan el corpus de Mozilla (`build/pgo`). + +## Por qué existe + +Medida la ganancia del PGO el 2026-09-07 (SDD 26 §3.a): **−9,4 %** en una página de DOM/maquetación +y **−1,0 %** en `3d-raytrace` de SunSpider. El corpus de Mozilla está dominado en número de páginas +por SunSpider, que es aritmética pura en bucles calientes — y **ese bucle no lo ejecuta el C++ de +SpiderMonkey sino el código máquina que el JIT emite en runtime**, que el PGO no toca. O sea que el +corpus entrenaba mucho justo donde el PGO menos rinde. + +Estas páginas ejercitan el camino que sí es C++ de punta a punta: resolución de estilo, layout, +pintado y composición. + +## Reglas que cumplen todas, y por qué + +- **Deterministas.** Ni `Math.random` ni `Date` ni red. Dos corridas hacen LO MISMO, así que dos + perfiles difieren por el timing de los contadores y no por haber visitado caminos distintos. +- **Autocontenidas.** CSS y JS en línea, sin recursos externos. El perfilado corre sin red. +- **Nuestras.** Escritas para esto: nada de páginas ajenas capturadas, que traerían licencia y + fragilidad. +- **Acotadas.** Cada una termina en segundos. El perfilado arranca un navegador POR PÁGINA. + +## Qué ejercita cada una + +| página | subsistema | +|---|---| +| `flex.html` | flexbox anidado, `wrap`, alineaciones, `min/max-content` | +| `rejilla.html` | CSS Grid: muchas pistas, áreas nombradas, `auto-fit`, `subgrid` | +| `tablas.html` | tablas grandes, `colspan`/`rowspan`, `table-layout` fijo y automático | +| `texto.html` | texto largo, columnas, `text-shadow`, tamaños y pesos variados, reflujo | +| `selectores.html` | resolución de estilo: DOM profundo contra cientos de reglas | +| `pintado.html` | degradados, `border-radius`, `box-shadow`, `opacity`, `mix-blend-mode` | +| `transformar.html` | `transform`, contextos de apilamiento, `will-change` | +| `svg.html` | SVG en línea: paths, degradados, `use`, clip | +| `desbordes.html` | `overflow` anidado, `position: sticky`, scroll programático | +| `reflujo.html` | layout thrashing: leer y escribir geometría alternadamente | diff --git a/scripts/pgo-corpus/desbordes.html b/scripts/pgo-corpus/desbordes.html new file mode 100644 index 00000000..27b0064a --- /dev/null +++ b/scripts/pgo-corpus/desbordes.html @@ -0,0 +1,27 @@ +desbordes
diff --git a/scripts/pgo-corpus/flex.html b/scripts/pgo-corpus/flex.html new file mode 100644 index 00000000..2b7bc898 --- /dev/null +++ b/scripts/pgo-corpus/flex.html @@ -0,0 +1,27 @@ +flex
diff --git a/scripts/pgo-corpus/pintado.html b/scripts/pgo-corpus/pintado.html new file mode 100644 index 00000000..5b7b7de1 --- /dev/null +++ b/scripts/pgo-corpus/pintado.html @@ -0,0 +1,22 @@ +pintado
diff --git a/scripts/pgo-corpus/reflujo.html b/scripts/pgo-corpus/reflujo.html new file mode 100644 index 00000000..96b636ce --- /dev/null +++ b/scripts/pgo-corpus/reflujo.html @@ -0,0 +1,20 @@ +reflujo
diff --git a/scripts/pgo-corpus/rejilla.html b/scripts/pgo-corpus/rejilla.html new file mode 100644 index 00000000..f9041bb5 --- /dev/null +++ b/scripts/pgo-corpus/rejilla.html @@ -0,0 +1,27 @@ +rejilla
diff --git a/scripts/pgo-corpus/selectores.html b/scripts/pgo-corpus/selectores.html new file mode 100644 index 00000000..2711de1a --- /dev/null +++ b/scripts/pgo-corpus/selectores.html @@ -0,0 +1,35 @@ +selectores +
diff --git a/scripts/pgo-corpus/svg.html b/scripts/pgo-corpus/svg.html new file mode 100644 index 00000000..b55264ff --- /dev/null +++ b/scripts/pgo-corpus/svg.html @@ -0,0 +1,29 @@ +svg +
diff --git a/scripts/pgo-corpus/tablas.html b/scripts/pgo-corpus/tablas.html new file mode 100644 index 00000000..469aef63 --- /dev/null +++ b/scripts/pgo-corpus/tablas.html @@ -0,0 +1,32 @@ +tablas
diff --git a/scripts/pgo-corpus/texto.html b/scripts/pgo-corpus/texto.html new file mode 100644 index 00000000..52344fe9 --- /dev/null +++ b/scripts/pgo-corpus/texto.html @@ -0,0 +1,30 @@ +texto
diff --git a/scripts/pgo-corpus/transformar.html b/scripts/pgo-corpus/transformar.html new file mode 100644 index 00000000..3ebff520 --- /dev/null +++ b/scripts/pgo-corpus/transformar.html @@ -0,0 +1,21 @@ +transformar