tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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));