#!/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 # # ⚠ 2026-09-08: este arnés apaga LOS CINCO sandboxes de Gecko, no sólo el de contenido. Antes dejaba # 2 ayudantes 'Sandbox Forked' muertos de SIGSEGV en CADA corrida —el sandbox de Firefox no puede # montar su user-namespace dentro del de bwrap y muere en la salida de error—. Acá no se pierde # nada de seguridad: bwrap YA es la jaula. Ver scripts/diagnostico/cazar-cuelgue-headless.sh. # # Y CAMBIA LAS CONDICIONES DE MEDICIÓN: las cifras publicadas en docs/26 se tomaron con el arnés # viejo, o sea con esos 2 procesos reventando por corrida. Los porcentajes del PGO comparan dos # firefox bajo el MISMO arnés, así que el cociente debería aguantar; el nivel absoluto de la línea # base de arranque (~16 s) no tiene por qué. Si se vuelve a publicar un número, re-medir la línea # base con este arnés y no reutilizar la vieja. # set -u RAIZ=/mnt/vvv/takana; 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 LIBGL_ALWAYS_SOFTWARE=1 MOZ_DISABLE_CONTENT_SANDBOX=1 MOZ_DISABLE_GMP_SANDBOX=1 MOZ_DISABLE_RDD_SANDBOX=1 MOZ_DISABLE_SOCKET_PROCESS_SANDBOX=1 MOZ_DISABLE_UTILITY_SANDBOX=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