summarize-backends.mjs (2082B)
1 import {readFile} from 'node:fs/promises'; 2 const input=JSON.parse(await readFile(process.argv[2],'utf8')); 3 const median=xs=>{xs=[...xs].sort((a,b)=>a-b);const n=xs.length;return n%2?xs[(n-1)/2]:(xs[n/2-1]+xs[n/2])/2;}; 4 const mib=n=>Math.round(n/1048576*100)/100,ms=n=>Math.round(n*100)/100; 5 const summary={memoryOnly:input.memoryOnly??false,browsers:{}}; 6 for(const browser of new Set(input.reports.map(r=>r.browser))){ 7 const result=summary.browsers[browser]={}; 8 for(const backend of ['zig-wasm','haskell-wasm']){ 9 const reports=input.reports.filter(r=>r.browser===browser&&r.backend===backend); 10 if(!reports.length)continue; 11 const samples=reports.flatMap(r=>r.browserMemory.samples); 12 const phases=[...new Set(samples.map(s=>s.phase).filter(Boolean))]; 13 result[backend]={ 14 freshProfilePackageReadyMs:ms(median(reports.map(r=>r.packages[0].readyMs))), 15 packageLinearMiB:[Math.min(...reports.flatMap(r=>r.packages.map(p=>p.linearBytes))),Math.max(...reports.flatMap(r=>r.packages.map(p=>p.linearBytes)))].map(mib), 16 compiledLinearMiB:[Math.min(...reports.flatMap(r=>r.compilations.map(c=>c.compileLinearBytes))),Math.max(...reports.flatMap(r=>r.compilations.flatMap(c=>c.runs.map(x=>x.linearBytes))))].map(mib), 17 maximumRetainedRunGrowthMiB:mib(Math.max(...reports.flatMap(r=>r.compilations.map(c=>c.runs.at(-1).linearBytes-c.runs[0].linearBytes)))), 18 demos:reports[0].compilations.map(({name})=>{ 19 const cs=reports.map(r=>r.compilations.find(c=>c.name===name)); 20 return {name,compileReadyMs:ms(median(cs.map(c=>c.readyMs))),firstRunMs:ms(median(cs.map(c=>c.runs[0].ms))),warmRunMs:ms(median(cs.flatMap(c=>c.runs.slice(1).map(x=>x.ms)))),publishedRunMs:ms(median(reports.map(r=>r.packages.find(p=>p.name===name).runMs)))}; 21 }), 22 heldMemory:phases.flatMap(phase=>{ 23 const vs=samples.filter(s=>s.phase===phase&&s.pssBytes!==null&&s.pssBytes!==undefined);if(!vs.length)return []; 24 return [{phase,pssMiB:mib(median(vs.map(x=>x.pssBytes))),privateMiB:mib(median(vs.map(x=>x.privateBytes)))}]; 25 }), 26 }; 27 } 28 } 29 console.log(JSON.stringify(summary,null,2));