summarize.mjs 1.7 KB

123456789101112131415
  1. import fs from 'node:fs';
  2. const root='tmp/admin-speed-2026-11-10';
  3. const main=JSON.parse(fs.readFileSync(root+'/browser-paired-final.json'));
  4. const supplemental=JSON.parse(fs.readFileSync(root+'/browser-paired-supplemental.json'));
  5. const replaced=new Set(supplemental.results.map(r=>r.page));
  6. const rows=[...main.results.filter(r=>!replaced.has(r.page)),...supplemental.results];
  7. const q=(values,p)=>[...values].sort((a,b)=>a-b)[Math.ceil(values.length*p)-1];
  8. const pages=[...new Set(rows.map(r=>r.page))].map(page=>{
  9. const data=rows.filter(r=>r.page===page);const variants=Object.fromEntries(['before','after'].map(variant=>{const a=data.filter(r=>r.variant===variant);const returns=a.map(r=>r.menuReturn).filter(Boolean);return [variant,{runs:a.length,p50:q(a.map(r=>r.readyMs),.5),p75:q(a.map(r=>r.readyMs),.75),p95:q(a.map(r=>r.readyMs),.95),completeP75:q(a.map(r=>r.completeMs),.75),requests:a[0].primaryRequests,menuReturn:returns.length?{p75:q(returns.map(r=>r.ms),.75),maxRequests:Math.max(...returns.map(r=>r.requests))}:undefined}];}));
  10. const equality=data.filter(r=>r.variant==='before').every(a=>a.hash===data.find(b=>b.variant==='after'&&b.round===a.round)?.hash);
  11. return{page,...variants,improvementPercent:Math.round((1-variants.after.p75/variants.before.p75)*1000)/10,businessEqual:equality};
  12. });
  13. const result={scope:'Actual production data through isolated operator-bound read gateways; production Angular builds; independent browser contexts; gzip static/API responses; 20ms/4Mbps/3Mbps; A/B order alternates by round; no deployment or real-user claim',completedAt:supplemental.at,pages};
  14. fs.writeFileSync(new URL('./browser-summary.json',import.meta.url),JSON.stringify(result,null,2));
  15. console.log(JSON.stringify(result,null,2));