Files
takana/scripts/diagnostico/banco-pgo-final.sh
T
SergioandClaude Opus 5 8ff6ae7b3a pgo: el control que faltaba — el arranque eran 16 s y diluía todos los porcentajes
El banco medía el ciclo COMPLETO del proceso (arrancar → renderizar → capturar → salir)
y nunca se midió cuánto de eso era arranque. Con una página vacía como control, y las 4
cargas × 2 variantes en UNA sola sesión intercalada (restar entre corridas de días
distintos no vale: la misma variante deriva ~1%):

  maquetación   trabajo 7281 → 4744 ms   -34,8%   (publicado: -10,9%)
  carga ajena   trabajo 4550 → 4634 ms    +1,8%   = cero, y es buena señal
  SunSpider     trabajo  -34 →   -6 ms   bajo el ruido

Dos correcciones al documento:

1. El -10,9% es correcto para el ciclo completo pero se leía como 'firefox 11% más
   rápido'. Sobre el trabajo de la página el PGO rinde -34,8%: tres veces más. El error
   subestimaba el propio resultado.

2. La explicación que di del SunSpider era aire. Su trabajo mide -34 ms, NEGATIVO: la
   página con el benchmark tardó menos que la vacía. No había nada que medir, y yo le
   colgué encima una teoría sobre el JIT. La teoría puede ser cierta; esta medición
   nunca la probó.

Las tablas viejas se dejan sin retocar, con un aviso arriba: el error de método enseña
más que el número corregido. Todo el rigor estadístico estaba puesto sobre una cantidad
que no era la que yo creía medir, y ninguna repetición lo habría revelado — sólo un
control, que costó siete corridas de una página vacía.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 14:57:26 +00:00

46 lines
2.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Banco DEFINITIVO: las cuatro cargas y las dos variantes en UNA SOLA sesión intercalada, para que
# la resta «total arranque» sea válida. Las restas entre corridas de días distintos no lo son:
# el arranque medido hoy no es necesariamente el de ayer.
# vacia → ARRANQUE PURO. Sin este control todos los porcentajes están diluidos por
# una constante que resultó ser ~16 s, o sea la mayor parte de la medición.
# fuera-del-corpus → DOM/layout: parentesco con lo que entrena el corpus
# del-corpus → SunSpider 3d-raytrace: JIT-bound
# ajena → imágenes, canvas, JSON, DOM por API: SIN parentesco
set -u
RAIZ=/mnt/vvv/hammer; R=$RAIZ/store/.rootfs/sway-v2
AQUI=$(cd "$(dirname "$0")" && pwd) # las 4 páginas viven junto a este script
SAL=$(mktemp -d)
A=$(ls -d $RAIZ/store/8116bdec*-firefox|head -1); B=$(ls -d $RAIZ/store/3d199174*-firefox|head -1)
N=${N:-7}
corre(){ local ini fin
ini=$(date +%s%N)
timeout 300 bwrap --ro-bind "$R" / --ro-bind /usr/lib/musl/lib/libc.so /lib/ld-musl-x86_64.so.1 \
--ro-bind "$1/usr/lib/firefox" /usr/lib/firefox --dev /dev --proc /proc --tmpfs /run --tmpfs /tmp \
--unshare-pid --ro-bind "$AQUI" /bench --bind "$SAL" /salida --unshare-user --uid 0 --gid 0 \
--setenv PATH /usr/bin:/bin \
/bin/sh -c 'export HOME=/tmp/h MOZ_HEADLESS=1 MOZ_DISABLE_CONTENT_SANDBOX=1 LIBGL_ALWAYS_SOFTWARE=1 LANG=C.UTF-8; mkdir -p $HOME
LD_LIBRARY_PATH=/usr/lib/firefox /usr/lib/firefox/firefox --headless --screenshot /salida/b.png file:///bench/'"$2" \
>/dev/null 2>&1
fin=$(date +%s%N); echo $(( (fin-ini)/1000000 )); }
med(){ printf '%s\n' "$@"|sort -n|awk '{v[NR]=$1}END{print (NR%2)?v[(NR+1)/2]:int((v[NR/2]+v[NR/2+1])/2)}'; }
declare -A MA MB
for p in vacia.html fuera-del-corpus.html del-corpus.html ajena.html; do
corre "$A" "$p" >/dev/null; corre "$B" "$p" >/dev/null
sa=(); sb=()
for i in $(seq 1 $N); do sa+=( "$(corre "$A" "$p")" ); sb+=( "$(corre "$B" "$p")" ); done
MA[$p]=$(med "${sa[@]}"); MB[$p]=$(med "${sb[@]}")
echo "== $p"; echo " sin: ${sa[*]}"; echo " pgo: ${sb[*]}"
echo " medianas sin=${MA[$p]} pgo=${MB[$p]} ($(awk -v a=${MA[$p]} -v b=${MB[$p]} 'BEGIN{printf "%+.1f%%",(b-a)*100.0/a}'))"
done
echo ""
echo "== TRABAJO REAL (total arranque), que es lo comparable entre cargas"
ba=${MA[vacia.html]}; bb=${MB[vacia.html]}
printf " %-22s %-22s %s\n" "carga" "trabajo sin / con pgo" "mejora del trabajo"
for p in fuera-del-corpus.html del-corpus.html ajena.html; do
awk -v p="$p" -v a=${MA[$p]} -v b=${MB[$p]} -v ba=$ba -v bb=$bb 'BEGIN{
ta=a-ba; tb=b-bb;
if (ta<=50) printf " %-22s %-22s %s\n", p, ta" / "tb" ms", "(trabajo ~0: bajo el ruido)";
else printf " %-22s %-22s %+.1f%%\n", p, ta" / "tb" ms", (tb-ta)*100.0/ta }'
done