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.
30 lines
1.7 KiB
HTML
30 lines
1.7 KiB
HTML
<!doctype html><meta charset=utf-8><title>svg</title><body style="margin:0">
|
|
<div id=r></div><script>
|
|
function lcg(x){return function(){x=(x*1103515245+12345)&0x7fffffff;return x/0x7fffffff}}
|
|
var r=lcg(71), h=['<svg width="1100" height="1500" xmlns="http://www.w3.org/2000/svg"><defs>'];
|
|
// SVG: otro árbol de layout y otro pintor dentro del mismo motor. Paths, degradados y clip.
|
|
for(var g=0;g<12;g++)
|
|
h.push('<linearGradient id="g'+g+'"><stop offset="0" stop-color="#'+((r()*0xfff)|0).toString(16)+
|
|
'"/><stop offset="1" stop-color="#'+((r()*0xfff)|0).toString(16)+'"/></linearGradient>');
|
|
h.push('<clipPath id="cp"><circle cx="550" cy="750" r="700"/></clipPath></defs><g clip-path="url(#cp)">');
|
|
for(var i=0;i<1100;i++){
|
|
var t=r();
|
|
if(t<0.4){
|
|
var d="M"+((r()*1100)|0)+","+((r()*1500)|0);
|
|
for(var k=0;k<5;k++) d+=" C"+((r()*1100)|0)+","+((r()*1500)|0)+" "+((r()*1100)|0)+","+((r()*1500)|0)+
|
|
" "+((r()*1100)|0)+","+((r()*1500)|0);
|
|
h.push('<path d="'+d+'" fill="none" stroke="url(#g'+((r()*12)|0)+')" stroke-width="'+(1+((r()*3)|0))+'"/>');
|
|
} else if(t<0.75){
|
|
h.push('<rect x="'+((r()*1050)|0)+'" y="'+((r()*1450)|0)+'" width="'+(5+(r()*60|0))+'" height="'+
|
|
(5+(r()*60|0))+'" rx="3" fill="url(#g'+((r()*12)|0)+')" opacity="'+(0.3+r()*0.7).toFixed(2)+'"/>');
|
|
} else {
|
|
h.push('<circle cx="'+((r()*1100)|0)+'" cy="'+((r()*1500)|0)+'" r="'+(2+(r()*22|0))+
|
|
'" fill="#'+((r()*0xffffff)|0).toString(16)+'"/>');
|
|
}
|
|
}
|
|
h.push('</g></svg>');
|
|
document.getElementById('r').innerHTML=h.join("");
|
|
var t=0; for(var i=0;i<40;i++) t+=document.body.getBoundingClientRect().height;
|
|
document.title="svg-"+(t|0);
|
|
</script>
|