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.
31 lines
1.6 KiB
HTML
31 lines
1.6 KiB
HTML
<!doctype html><meta charset=utf-8><title>texto</title><style>
|
|
body{margin:0;font:15px/1.5 serif}
|
|
.cols{column-count:4;column-gap:14px;column-rule:1px solid #ccc;padding:6px}
|
|
h2{font:bold 22px sans-serif;margin:.4em 0}
|
|
.g{font-size:26px;font-weight:700;letter-spacing:.4px;text-shadow:1px 1px 2px #999}
|
|
.p{font-size:11px;color:#555}
|
|
em{font-style:italic}strong{font-weight:800}
|
|
</style><div id=r></div><script>
|
|
function lcg(s){return function(){s=(s*1103515245+12345)&0x7fffffff;return s/0x7fffffff}}
|
|
var r=lcg(31);
|
|
// Shaping de texto, saltos de línea y columnas: camino de layout inline, que es el más
|
|
// distinto del de bloque y el que SunSpider no toca en absoluto.
|
|
var voc=("la reproducibilidad no es una propiedad del binario sino del proceso que lo produce "+
|
|
"y por eso el store se direcciona por contenido mientras el grafo se direcciona por entradas "+
|
|
"cada guardián que no falla nunca es indistinguible de uno que no mira nada en absoluto").split(" ");
|
|
function parrafo(n){var s=[];for(var i=0;i<n;i++){var w=voc[(r()*voc.length)|0];
|
|
if(r()<0.06) w="<em>"+w+"</em>"; else if(r()<0.04) w="<strong>"+w+"</strong>";
|
|
s.push(w);} return s.join(" ");}
|
|
var h=[];
|
|
for(var k=0;k<26;k++){
|
|
h.push("<h2>"+parrafo(4)+"</h2>");
|
|
h.push("<div class=cols>");
|
|
for(var p=0;p<5;p++) h.push("<p class='"+(r()<0.3?"g":(r()<0.4?"p":""))+"'>"+parrafo(60+((r()*90)|0))+"</p>");
|
|
h.push("</div>");
|
|
}
|
|
document.getElementById('r').innerHTML=h.join("");
|
|
var t=0; for(var i=0;i<90;i++){ t+=document.body.getBoundingClientRect().height;
|
|
document.body.style.width=(650+i%9*40)+"px"; }
|
|
document.title="texto-"+(t|0);
|
|
</script>
|