ostia 0.2.8 → 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ab-runner.ts +6 -0
- package/chunk-cqy5fzae.js +16 -0
- package/chunk-t6q9jbb6.js +25 -0
- package/cli.js +26 -26
- package/index.js +1 -1
- package/package.json +1 -1
- package/runner.ts +10 -10
- package/chunk-17t12ta6.js +0 -16
- package/chunk-p3342c5c.js +0 -25
package/ab-runner.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
3
|
+
import{g,c,r,s,ge,i,a,te,p,ce,y,L,b,me,x,P}from"./chunk-cqy5fzae.js";var j=15,z=1e7,K=1e6,Q=3;async function J(n,S,T={}){let h=T.rounds??j,d=Bun.nanoseconds(),R=async(e)=>{let u=Bun.nanoseconds(),t=e(),o=p(t),m=o?await t:t;return{isAsync:o,result:m,ns:Math.max(1,Bun.nanoseconds()-u)}},w=await R(n),k=await R(S),_=Bun.deepEquals(w.result,k.result),I=(e,u)=>{let t=ce(u),o=Array(te);return(m)=>t(e,o,m)},B=I(n,w.isAsync),N=I(S,k.isAsync),M=w.ns,F=k.ns;for(let e=1;;e*=2){let u=await B(e),t=await N(e);if(M=Math.max(1,u/e),F=Math.max(1,t/e),u>=K&&t>=K)break}let l=Math.max(1,Math.round(z/Math.max(M,F)));for(let e=0;e<Q;e++)await B(l),await N(l);let O=[],W=[],v=[];for(let e=0;e<h;e++){let u,t;if(e%2===0)u=await B(l),t=await N(l);else t=await N(l),u=await B(l);u=Math.max(1,u),t=Math.max(1,t),O.push(u/l),W.push(t/l),v.push(t/u)}return{rounds:h,batch:l,baseSamples:O,candSamples:W,ratios:v,sameOutput:_,diagnosticWallNs:Bun.nanoseconds()-d}}function G(n,S){let T=Float64Array.from(n).sort(),h=r(T,0.5),d=r(T,0.25),R=r(T,0.75),w=S/100,k=h>1+w&&d>1?"regressed":h<1-w&&R<1?"improved":void 0;return{medianRatio:h,p25:d,p75:R,...k&&{flagged:k}}}function U(n){return`${b(n)}\x00${g(n.params??null)}`}async function H(n){return L(),await import(n),[...y()]}async function V(){let[n,S,T,h]=process.argv.slice(2);if(!n||S===void 0||!T||!h)return process.stderr.write(`ab runner: usage: ab-runner.ts <candSuite> <baseSuite|''> <outputPath> <optsJson>
|
|
4
|
+
`),2;let d=JSON.parse(h);for(let t of d.preload??[])await import(t);let R=S?await H(S):[],w=await H(n);if(w.length===0)return process.stderr.write(`ab runner: ${n} registered no tasks (no task() calls found).
|
|
5
|
+
`),2;let k;try{k=x(w,d.filter,n)}catch(t){return process.stderr.write(`ab runner: ${t.message}
|
|
6
|
+
`),2}let _=d.workloadIds&&new Set(d.workloadIds),I=new Map(R.map((t)=>[U(t),t])),B=new Set(w.map(U)),N=[],M=[],F=[];for(let t of k){let o=P(n,t);if(_&&!_.has(o.id))continue;if(N.push(o),t.skipped)continue;let m=I.get(U(t));if(m&&!m.skipped)M.push({workload:o,base:m,cand:t});else F.push(o.id)}let l=[];if(!_)for(let t of me(R,d.filter)){if(t.skipped||B.has(U(t)))continue;let o=P(n,t);N.push(o),l.push(o.id)}let O=new Map,W=new Map;M.forEach(({cand:t},o)=>{if(t.groupName===void 0)return;if(!O.has(t.groupName))O.set(t.groupName,o);W.set(t.groupName,o)});let v=i({rounds:d.rounds,thresholdPct:d.thresholdPct}),e=[];for(let t=0;t<M.length;t++){let{workload:o,base:m,cand:A}=M[t],D=A.groupName,q=D!==void 0&&O.get(D)===t,Z=D!==void 0&&W.get(D)===t;if(q)await m.groupBefore?.(),await A.groupBefore?.();await m.opts?.before?.(),await A.opts?.before?.();let f=await J(m.fn,A.fn,{rounds:d.rounds}),C=G(f.ratios,d.thresholdPct),E=c(f.candSamples);if(f.batch>1)E.batch=f.batch;if(e.push(ge({workload:o,configFingerprint:v,timing:E,diagnosticWallNs:f.diagnosticWallNs,warnings:[],paired:{rounds:f.rounds,batch:f.batch,baseSamples:f.baseSamples,baseMedianNs:r(Float64Array.from(f.baseSamples).sort(),0.5),ratios:f.ratios,...C,verdict:C.flagged??"unchanged",sameOutput:f.sameOutput}})),await A.opts?.after?.(),await m.opts?.after?.(),Z)await A.groupAfter?.(),await m.groupAfter?.()}let u=s(N,e);return u.unmatched={baseOnly:l,candOnly:F},await a(u,T),0}V().then((n)=>process.exit(n));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
function g(l,d){return JSON.stringify(Ue(l),null,d)}function Ue(l){if(Array.isArray(l)){let d=!1;for(let f=0;f<l.length;f++){let w=l[f];if(w!==null&&typeof w==="object"){d=!0;break}}return d?l.map(Ue):l}if(l!==null&&typeof l==="object"){let d=l,f={};for(let w of Object.keys(d).sort())f[w]=Ue(d[w]);return f}return l}function e(l,...d){let f=Bun.CryptoHasher.hash("sha256",g(d),"hex");return`${l}_${f.slice(0,16)}`}function c(l){if(l.length===0)throw Error("computeTimingStats: samples must be non-empty");let d=l.length,f=gn(l),w=0;for(let U=0;U<d;U++)w+=l[U];let N=w/d,A=r(f,0.5),W=0;for(let U=0;U<d;U++){let V=l[U]-N;W+=V*V}let G=Math.sqrt(W/d),D=f[0],z=f[d-1],J=r(f,0.25),H=r(f,0.75),re=H-J,ae=J-1.5*re,ye=H+1.5*re,oe=J-3*re,le=H+3*re,ke=0,xe=0;for(let U=0;U<d;U++){let V=l[U];if(V<oe||V>le)xe++;else if(V<ae||V>ye)ke++}let Oe=r(f,0.99),Ie=new Float64Array(d);for(let U=0;U<d;U++)Ie[U]=Math.abs(l[U]-A);Ie.sort();let Ne=r(Ie,0.5);return{unit:"ns",samples:l,mean:N,median:A,stddev:G,min:D,max:z,outliers:{mild:ke,severe:xe},p25:J,p75:H,p99:Oe,mad:Ne}}function gn(l){let d=new Float64Array(l.length);return d.set(l),d.sort(),d}function r(l,d){let f=l.length;if(f===1)return l[0];let w=d*(f-1),N=Math.floor(w),A=Math.ceil(w);if(N===A)return l[N];let W=w-N;return l[N]*(1-W)+l[A]*W}var bn=5000000;function X(l,d,f="subprocess",w=[]){let N=[],A=l.samples[0];if(A!==void 0){let D=l.p75-l.p25;if(A>l.median+3*D&&A>2*l.median&&D>0)N.push({code:"slow-first-run",message:`First run took ${n(A)}, much slower than the median ${n(l.median)}. Consider more warmup.`,data:{firstNs:A,medianNs:l.median}})}if(f!=="inprocess"&&l.outliers.mild+l.outliers.severe>0)N.push({code:"outliers-detected",message:`${l.outliers.mild+l.outliers.severe} outlier(s) detected (${l.outliers.severe} severe, ${l.outliers.mild} mild).`,data:l.outliers});if(f==="subprocess"&&l.median<bn)N.push({code:"fast-command",message:`Median run time (${(l.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:l.median}});let W=new Set(w),G=d.filter((D)=>D!==void 0&&D!==0&&!W.has(D));if(G.length>0)N.push({code:"nonzero-exit",message:`${G.length} of ${d.length} trial(s) exited non-zero.`,data:{exitCodes:G}});return N}var F=0.5,kn={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function M(l){let d=Math.abs(l);if(d>=1e9)return"s";if(d>=1e6)return"ms";if(d>=1000)return"\xB5s";return"ns"}function hn(l){let d=Math.floor(Math.log10(Math.max(Math.abs(l),1)))+1;return Math.max(1,3-d)}function n(l,d=M(l)){let f=l/kn[d];return`${f.toFixed(hn(f))} ${d}`}function E(l){return l.samples?.nodeIds.length??l.totals.reduce((d,f)=>d+f.samples,0)}function k(l){if(l<1024)return`${l.toFixed(0)}B`;if(l<1048576)return`${(l/1024).toFixed(2)}KB`;return`${(l/1048576).toFixed(2)}MB`}function q(l){return`${l.cpuModel} \xB7 ${l.cores} cores \xB7 load ${l.loadAvg1.toFixed(1)} \xB7 noise floor ${l.noise.floorPct.toFixed(1)}%`}function v(l){return`${l.sha} (${l.branch}${l.dirty?", dirty":""})`}function t(l){return l?.label??l?.command?.join(" ")??l?.entry?.task??l?.id??"unknown"}function K(l,d){if(l===1)return d?"1.00\xD7 (baseline)":"1.00\xD7";if(l>1)return`${l.toFixed(2)}\xD7 slower`;return`${(1/l).toFixed(2)}\xD7 faster`}function de(l){return l.replace(/\|/g,"\\|").replace(/</g,"<").replace(/>/g,">").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function T(l){let d=l.trials.filter((w)=>!w.timedOut&&!w.timeSourceNoMatch&&w.userNs!==void 0&&w.systemNs!==void 0);if(d.length===0)return;let f=(w)=>r(Float64Array.from(w).sort(),0.5);return{userNs:f(d.map((w)=>w.userNs)),systemNs:f(d.map((w)=>w.systemNs))}}function Y(l){return`${n(l.userNs)}/${n(l.systemNs)}`}class _e extends Error{}function Z(l){if(typeof l.pattern==="string")return;let{flags:d}=l.pattern;if(d.includes("g")||d.includes("y")||d.includes("d"))throw RangeError("timeSource pattern must not use the g or y flag")}function wn(...l){let d=l.filter((f)=>f!==void 0);if(d.length===0)return;if(d.length===1)return d[0];return AbortSignal.any(d)}var yn={ns:1,us:1000,ms:1e6,s:1e9};function B(l,d){let f=l!==void 0?AbortSignal.timeout(l):void 0,w=wn(f,d);return{spawn:w?{signal:w,killSignal:"SIGKILL"}:{},timedOut:()=>f?.aborted??!1}}async function pe(l){let d=l.timeSource!==void 0,f=Bun.nanoseconds(),w=B(l.timeoutMs,l.signal),N=Bun.spawn(l.argv,{cwd:l.cwd,env:l.env,stdout:d?"pipe":"ignore",stderr:d?"pipe":"ignore",stdin:"ignore",...w.spawn}),A=d?Promise.all([new Response(N.stdout).text(),new Response(N.stderr).text()]):void 0,W=await N.exited,G=Bun.nanoseconds(),D=N.resourceUsage?.(),z=w.timedOut(),J={wallNs:G-f,exitCode:z?null:W,userNs:D?Number(D.cpuTime.user)*1000:void 0,systemNs:D?Number(D.cpuTime.system)*1000:void 0,maxRssBytes:D?.maxRSS,...z?{timedOut:!0}:{}};if(A){let[H,re]=await A;if(l.timeSource&&!z)try{J.reportedNs=xn(l.timeSource,H,re,l.argv)}catch(ae){if(!(ae instanceof _e))throw ae;J.timeSourceNoMatch=!0,J.timeSourceMissOutput=Tn(H,re)}}return J}function xn(l,d,f,w=[]){let N=typeof l.pattern==="string"?new RegExp(l.pattern):l.pattern,A=l.group??1,W=N.exec(d)??N.exec(f),G=w.length>0?` for "${w.join(" ")}"`:"";if(!W)throw new _e(`timeSource pattern ${N} did not match the output${G}. Output was:
|
|
3
|
+
${Ke(d,f)}`);let D=W[A];if(D===void 0)throw Error(`timeSource pattern ${N} matched${G} but has no capture group ${A} (matched text: "${W[0]}").`);let z=Number(D);if(!Number.isFinite(z))throw Error(`timeSource pattern ${N} group ${A} captured "${D}"${G}, which is not a number.`);return z*yn[l.unit??"ms"]}function Ke(l,d){let w=(A)=>A.length>800?`${A.slice(0,800)}\u2026(${A.length-800} more)`:A,N=[];if(l.trim())N.push(`--- stdout ---
|
|
4
|
+
${w(l.trimEnd())}`);if(d.trim())N.push(`--- stderr ---
|
|
5
|
+
${w(d.trimEnd())}`);return N.length>0?N.join(`
|
|
6
|
+
`):"(empty)"}var Ce=2048;function Tn(l,d){let f=Ke(l,d);if(Buffer.byteLength(f,"utf8")<=Ce)return f;let w=f.slice(0,Ce);while(Buffer.byteLength(w,"utf8")>Ce)w=w.slice(0,-1);return`${w}\u2026`}var Sn=1048576,Mn=(l)=>`
|
|
7
|
+
\u2026(${l} bytes elided)\u2026
|
|
8
|
+
`;async function vn(l,d=Sn){let f=Math.floor(d/2),w=l.getReader(),N=[],A=0,W=[],G=0,D=0;try{for(;;){let{done:ae,value:ye}=await w.read();if(ae)break;if(!ye||ye.byteLength===0)continue;D+=ye.byteLength;let oe=ye;if(A<f){let le=f-A;if(oe.byteLength<=le){N.push(oe),A+=oe.byteLength;continue}N.push(oe.subarray(0,le)),A+=le,oe=oe.subarray(le)}W.push(oe),G+=oe.byteLength;while(G>f&&W.length>0){let le=W[0],ke=G-f;if(le.byteLength<=ke)W.shift(),G-=le.byteLength;else W[0]=le.subarray(ke),G-=ke}}}finally{w.releaseLock()}let z=new TextDecoder,J=z.decode(Ve(N));if(D<=A+G)return J;let H=z.decode(Ve(W)),re=D-A-G;return`${J}${Mn(re)}${H}`}function Ve(l){let d=l.reduce((N,A)=>N+A.byteLength,0),f=new Uint8Array(d),w=0;for(let N of l)f.set(N,w),w+=N.byteLength;return f}async function Q(l,d,f){if(typeof l==="function"){await l(d);return}let w=Le(l),N=B(f.timeoutMs,f.signal),A=Bun.spawn(w,{cwd:f.cwd,env:f.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...N.spawn}),W=vn(A.stderr).catch(()=>""),G=await A.exited;if(N.timedOut()){let D=(await W).trim();throw Error(`prepare command "${w.join(" ")}" timed out after ${f.timeoutMs}ms before ${d.phase} trial ${d.index}.${D?`
|
|
9
|
+
${D}`:""}`)}if(f.signal?.aborted)return;if(G!==0){let D=(await W).trim();throw Error(`prepare command "${w.join(" ")}" exited with code ${G} before ${d.phase} trial ${d.index}.${D?`
|
|
10
|
+
${D}`:""}`)}}function Le(l){if(l===void 0||typeof l==="function")return;return Array.isArray(l)?l:R(l)}function ze(l){if(l===void 0)return;return{pattern:typeof l.pattern==="string"?l.pattern:l.pattern.source,...l.group!==void 0&&{group:l.group},...l.unit!==void 0&&{unit:l.unit}}}function R(l){return l.trim().split(/\s+/).filter(Boolean)}import{renameSync as Nn}from"fs";import{isAbsolute as In,relative as Pn}from"path";var qe={name:"ostia",version:"0.2.9",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"src/cli/main.ts"},scripts:{build:"bun scripts/build.ts","smoke:package":"bun scripts/smoke-package.ts",test:"bun test",typecheck:"tsc6","typecheck:package":"tsc6 -p tests/types",lint:"biome check .","lint:fix":"biome check --write . --unsafe","lint:changed":"biome check --changed --no-errors-on-unmatched .","lint:fix:changed":"biome check --write --unsafe --changed --no-errors-on-unmatched .",knip:"knip-bun",bench:"bun src/cli/main.ts bench bench/*.ts","bench:baseline":"bun src/cli/main.ts bench bench/*.ts --budget 3000 --min-samples 30 --export-json .ostia/baselines/bench-main.json",baseline:"bun src/cli/main.ts baseline save",dogfood:"bun test && bun src/cli/main.ts ci",examples:"bun scripts/run-examples.ts"},devDependencies:{"@biomejs/biome":"2.5.14","@types/bun":"^1.4.2",knip:"^6.38.0",typescript:"npm:@typescript/typescript6@^6.0.2"},repository:{type:"git",url:"git+https://github.com/metonym/ostia.git"}};var S=qe.version;var Fe,Ye=!1;function We(l){let d=Bun.spawnSync(["git",...l],{timeout:200,stdout:"pipe",stderr:"ignore"});return d.success?d.stdout.toString().trim():void 0}function Ze(){if(Ye)return Fe;Ye=!0;try{let l=We(["rev-parse","--short","HEAD"]);if(l===void 0)Fe=void 0;else{let d=We(["rev-parse","--abbrev-ref","HEAD"]),f=We(["status","--porcelain"]);Fe={sha:l,branch:d??"HEAD",dirty:(f?.length??0)>0}}}catch{Fe=void 0}return Fe}function s(l,d,f){let w=Ze();return{schemaVersion:2,toolVersion:S,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:l,measurements:d,...f!==void 0&&{environment:f},...w!==void 0&&{git:w}}}function _(l,d,f={}){if(f.timeSource)Z(f.timeSource);let w=Le(f.prepare),N=ze(f.timeSource),A=typeof f.prepare==="function"?f.prepare.toString():w;return{id:e("wl","subprocess",l,...A!==void 0||N!==void 0?[A??null,N??null]:[]),kind:"subprocess",command:l,label:d,...w!==void 0&&{prepare:w},...N!==void 0&&{timeSource:N}}}function fe(l,d){return{id:e("wl","inprocess",l.name,l.toString()),kind:"inprocess",label:d}}function Xe(l,d,f={}){let w=In(l)?Pn(process.cwd(),l):l;return{id:f.params!==void 0?e("wl","inprocess-entry",w,d,f.params):e("wl","inprocess-entry",w,d),kind:"inprocess",entry:{file:l,task:d,...f.group!==void 0&&{group:f.group}},...f.label!==void 0&&{label:f.label},...f.baseline!==void 0&&{baseline:f.baseline},...f.description!==void 0&&{description:f.description},...f.groupDescription!==void 0&&{groupDescription:f.groupDescription},...f.isolated!==void 0&&{isolated:f.isolated},...f.params!==void 0&&{params:f.params},...f.skipped!==void 0&&{skipped:f.skipped}}}function C(l){return{id:e("run",l.workload.id,"timing",l.configFingerprint,Bun.version,S),workloadId:l.workload.id,phase:"timing",instrumented:!1,configFingerprint:l.configFingerprint,trials:l.trials,timing:l.timing,warnings:l.warnings,artifacts:[],memory:An(l.trials),...l.interleaved!==void 0&&{interleaved:l.interleaved}}}function An(l){let d=l.map((f)=>f.maxRssBytes).filter((f)=>f!==void 0);if(d.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...d)}}function h(l){return{id:e("run",l.workload.id,l.phase,l.configFingerprint,Bun.version,S),workloadId:l.workload.id,phase:l.phase,instrumented:!0,configFingerprint:l.configFingerprint,trials:[{i:0,wallNs:l.diagnosticWallNs,exitCode:l.exitCode}],diagnosticWallNs:l.diagnosticWallNs,cpu:l.cpu,heap:l.heap,memory:l.memory,jit:l.jit,warnings:l.warnings,artifacts:l.artifacts}}function ge(l){return{id:e("run",l.workload.id,"paired",l.configFingerprint,Bun.version,S),workloadId:l.workload.id,phase:"paired",instrumented:!1,configFingerprint:l.configFingerprint,trials:[],timing:l.timing,diagnosticWallNs:l.diagnosticWallNs,paired:l.paired,warnings:l.warnings,artifacts:[]}}async function he(l,d,f){let N=await Bun.file(f).arrayBuffer(),A=new Bun.CryptoHasher("sha256");return A.update(N),{id:e("art",l,d,f),kind:d,path:f,sha256:A.digest("hex"),bytes:N.byteLength}}function i(l){return e("cfg",l)}function I(l){return`${g(l,2)}
|
|
11
|
+
`}async function ee(l,d){let f=`${d}.tmp-${process.pid}`;await Bun.write(f,l),Nn(f,d)}async function a(l,d){await ee(I(l),d)}class O extends Error{code;path;schemaVersion;constructor(l,d,f={}){super(d);this.name="OstiaDocumentError",this.code=l,this.path=f.path,this.schemaVersion=f.schemaVersion}}async function o(l){let d=await Bun.file(l).text(),f;try{f=JSON.parse(d)}catch(N){let A=N instanceof Error?N.message:String(N);throw new O("invalid-json",`${l}: invalid JSON (${A})`,{path:l})}let w=f!==null&&typeof f==="object"?f.schemaVersion:void 0;if(typeof w!=="number")throw new O("not-a-document",`${l}: not a ProfileDocument (missing schemaVersion)`,{path:l});if(w!==2)throw new O("unsupported-schema",`${l}: unsupported ProfileDocument schemaVersion ${w} (this ostia reads 2)`,{path:l,schemaVersion:w});return En(f)}function En(l){for(let d of l.measurements){let f=d.timing;if(!f||f.mad!==void 0||f.samples.length===0)continue;d.timing={...c(f.samples),...f.batch!==void 0&&{batch:f.batch}}}return l}import De from"os";var On=200,Qe=64,Fn=(()=>{let l=new Uint8Array(4096);for(let d=0;d<l.length;d++)l[d]=d*2654435761&255;return l})();function Bn(l,d){let f=d;for(let w=0;w<l.length;w++)f^=l[w],f=Math.imul(f,16777619);return f>>>0}function Un(l){let d=c(l);return{floorPct:d.median===0?0:d.mad/d.median*100,referenceMedianNs:d.median,samples:l.length}}function en(l=On){let d=l*1e6,f=[],w=0,N=Bun.nanoseconds(),A=0;while(A<d){let W=Bun.nanoseconds();for(let D=0;D<Qe;D++)w^=Bn(Fn,D);let G=Bun.nanoseconds();f.push((G-W)/Qe),A=Bun.nanoseconds()-N}return Un(f)}var $n=0.75;function u(){let[l=0,d=0]=De.loadavg();return{cpuModel:De.cpus()[0]?.model??"unknown",cores:De.availableParallelism(),loadAvg1:l,loadAvg5:d,noise:en()}}function m(l){if(l.loadAvg1<=l.cores*$n)return;return{code:"noisy-machine",message:`Load average ${l.loadAvg1.toFixed(2)} exceeds 75% of ${l.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:l.loadAvg1,cores:l.cores}}}import{profile as _n}from"bun:jsc";var Cn=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),nn=4294967295;function tn(l,d){let f=d??l.interval*1e6,w=new Map,N=[];function A(U,V,ie,Me){let se=w.get(U);if(se===void 0)se=new Map,w.set(U,se);let Re=V??"",Pe=se.get(Re);if(Pe===void 0)Pe=N.length,se.set(Re,Pe),N.push({key:e("fr",U,Re),name:U,url:V,line:ie,col:Me});return Pe}function W(U){let V=U.line===nn,ie=V?void 0:U.line-1,Me=V||U.column===nn?void 0:U.column-1;return A(U.name,U.sourceURL,ie,Me)}let G=A("(root)",void 0,void 0,void 0),D=1,z={id:0,frameIx:G,children:new Map,selfUs:0,samples:0,totalUs:0},J=new Map([[0,z]]),H={llint:0,baseline:0,dfg:0,ftl:0},re=new Map,ae=[],ye=[];for(let U of l.traces){let V=U.frames,ie=z;for(let Re=V.length-1;Re>=0;Re--){let Pe=W(V[Re]),Ae=ie.children.get(Pe);if(!Ae)Ae={id:D++,frameIx:Pe,children:new Map,selfUs:0,samples:0,totalUs:0},ie.children.set(Pe,Ae),J.set(Ae.id,Ae);ie=Ae}ie.selfUs+=f,ie.samples+=1,ae.push(ie.id),ye.push(f);let Me=V[0],se=Me&&Cn.get(Me.category);if(se){H[se]++;let Re=re.get(se)??new Map;Re.set(ie.frameIx,(Re.get(ie.frameIx)??0)+1),re.set(se,Re)}}function oe(U){let V=U.selfUs;for(let ie of U.children.values())V+=oe(ie);return U.totalUs=V,V}oe(z);let le=new Map;function ke(U){let V=le.get(U.frameIx);if(V)V.selfUs+=U.selfUs,V.totalUs+=U.totalUs,V.samples+=U.samples;else le.set(U.frameIx,{frameIx:U.frameIx,selfUs:U.selfUs,totalUs:U.totalUs,samples:U.samples});for(let ie of U.children.values())ke(ie)}ke(z);let xe=[...J.values()].map((U)=>({id:U.id,frameIx:U.frameIx,children:[...U.children.values()].map((V)=>V.id)})),Oe={origin:"jsc-profile",samplingIntervalUs:f,frames:N,nodes:xe,totals:[...le.values()].sort((U,V)=>V.selfUs-U.selfUs),samples:{nodeIds:ae,timeDeltasUs:ye}},Ie=[...re.entries()].flatMap(([U,V])=>[...V.entries()].sort((ie,Me)=>Me[1]-ie[1]).slice(0,3).map(([ie,Me])=>({tier:U,frameKey:N[ie].key,samples:Me})));return{cpu:Oe,jit:{origin:"jsc-profile",tiers:H,topFramesByTier:Ie}}}var Ln=1000;async function ne(l,d={}){let f=d.intervalUs??Ln,w,N=Bun.nanoseconds(),A=await _n(async()=>(w=await l(),w),f),W=Bun.nanoseconds()-N,{cpu:G,jit:D}=tn(A.stackTraces,f);return{result:w,cpu:G,jit:D,diagnosticWallNs:W}}var Wn=500,Dn=20,rn=3,Gn=10,jn=2,Hn=0.1,Jn=1000,sn=1e4,Vn=2*sn,Kn=1e6,zn=5,te=256;function an(l){let d=Math.log10(Math.max(1,l)/1e6),f=Math.round(rn+jn*d);return Math.min(Gn,Math.max(rn,f))}function qn(l,d){let f=Math.floor(d/l);return Math.min(Dn,Math.max(f,an(l)))}var Yn;function ve(l){Yn=l}function p(l){return l!==null&&typeof l==="object"&&typeof l.then==="function"}var Zn=(async()=>{}).constructor,Xn=0;function ce(l){let d=`/* ostia task loop ${Xn++} */
|
|
12
|
+
const t0 = Bun.nanoseconds()
|
|
13
|
+
for (let b = 0; b < n; b++) sink[b & ${te-1}] = ${l?"await ":""}fn()
|
|
14
|
+
return Bun.nanoseconds() - t0`;return(l?Zn:Function)("fn","sink","n",d)}function on(l,d){return Math.max(1,Math.ceil(Jn/l),Math.ceil(d/(l*sn)))}function Qn(l){let d=[...l].sort((f,w)=>f-w);return d[d.length>>1]}async function un(l,d={}){let f=(d.budgetMs??Wn)*1e6,w=f*(d.warmup??Hn),N=Bun.nanoseconds(),A=l(),W=p(A);if(W)await A;let G=Math.max(1,Bun.nanoseconds()-N),D=ce(W),z=Array(te),J=(se)=>D(l,z,se),H=Bun.nanoseconds(),re=1;while(Bun.nanoseconds()-H<w){let se=await J(re);if(G=Math.max(1,se/re),se<Kn)re*=2}let ae=on(G,f);if(ae>1){let se=[];for(let Re=0;Re<zn;Re++)se.push(await J(ae)/ae);G=Math.max(1,Qn(se)),ae=on(G,f)}let ye=G*ae,oe=d.samples??d.minSamples??qn(ye,f),le=d.samples!==void 0?0:f,ke=d.samples??Math.max(Vn,oe),xe=[],Oe=Bun.nanoseconds(),Ie=0,Ne=0;while(Ne<oe||Ie<le&&Ne<ke){let se=await J(ae);if(xe.push({i:Ne,wallNs:se/ae}),Ne++,Ie=Bun.nanoseconds()-Oe,d.gc)Bun.gc(!0);if(Ne>=ke&&Ne>=oe)break}let U=xe.map((se)=>se.wallNs),V=c(U);if(ae>1)V.batch=ae;let ie=X(V,[],"inprocess"),Me=an(ye);if(xe.length<Me)ie.push({code:"low-sample-count",message:`Only ${xe.length} sample(s) at ~${et(ye)} per trial; ${Me} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:xe.length,target:Me,trialCostNs:ye}});return{trials:xe,timing:V,warnings:ie}}function et(l){if(l>=1e9)return`${(l/1e9).toFixed(2)}s`;if(l>=1e6)return`${(l/1e6).toFixed(1)}ms`;if(l>=1000)return`${(l/1000).toFixed(1)}\xB5s`;return`${l.toFixed(0)}ns`}var He=[],Se,Ee;function Ge(l,d,f,w){let N=Se;Se={name:l,description:f?.description,isolate:f?.isolate,gc:f?.gc,cpu:f?.cpu,alloc:f?.alloc,peakMem:f?.peakMem,before:f?.before,after:f?.after,skip:w.skip,only:w.only};try{d()}finally{Se=N}}var Te=Object.assign((l,d,f)=>Ge(l,d,f,{}),{skip:(l,d,f)=>Ge(l,d,f,{skip:!0}),only:(l,d,f)=>Ge(l,d,f,{only:!0})});function je(l,d,f,w){let N=Ee!==void 0||f?.params!==void 0?{...Ee,...f?.params}:void 0;He.push({groupName:Se?.name,groupDescription:Se?.description,groupIsolate:Se?.isolate,groupGc:Se?.gc,groupCpu:Se?.cpu,groupAlloc:Se?.alloc,groupPeakMem:Se?.peakMem,groupBefore:Se?.before,groupAfter:Se?.after,name:l,fn:d,baseline:f?.baseline,params:N,skipped:w.skip||Se?.skip,only:w.only||Se?.only,opts:f})}var $e=Object.assign((l,d,f)=>je(l,d,f,{}),{skip:(l,d,f)=>je(l,d,f,{skip:!0}),only:(l,d,f)=>je(l,d,f,{only:!0})});function y(){return He}function L(){He.length=0,Se=void 0,Ee=void 0}function be(l,d){let f=Ee;Ee=l;try{return d()}finally{Ee=f}}function b(l){return l.groupName?`${l.groupName}/${l.name}`:l.name}function ue(l,d){return l.opts?.isolate??l.groupIsolate??d}function cn(l,d){return l.opts?.gc??l.groupGc??d}function ln(l,d){return l.opts?.cpu??l.groupCpu??d}function mn(l,d){return l.opts?.alloc??l.groupAlloc??d}function we(l,d){return l.opts?.peakMem??l.groupPeakMem??d}function me(l,d){if(!d)return[...l];let f=new RegExp(d);return l.filter((w)=>f.test(b(w)))}function x(l,d,f){let w=l.filter((W)=>W.only),N=w.length>0?w:l;if(w.length>0)process.stderr.write(`bench: ${w.length} task(s) selected by .only
|
|
15
|
+
`);let A=me(N,d);if(A.length===0)throw Error(`filter ${JSON.stringify(d)} matched zero of ${N.length} registered task(s) in ${f}.`);return A}import{heapStats as nt}from"bun:jsc";var tt=100;function pn(){try{return nt().heapSize}catch{return process.memoryUsage().heapUsed}}async function dn(l,d=tt){let f=Bun.nanoseconds();Bun.gc(!0);let w=pn();for(let W=0;W<d;W++){let G=l();if(p(G))await G}Bun.gc(!0);let N=pn(),A=Bun.nanoseconds()-f;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(N-w)/d)},diagnosticWallNs:A}}var Je=100,Be=2000,rt=2,ot=200,it=1e4,st=Be/2,at=20;function ut(l){let d=Be*rt*l/1000;return Math.min(it,Math.max(ot,d))}async function fn(l,d={}){let f=d.intervalUs??Je,w=ut(f)*1e6,N=async()=>{let H=Bun.nanoseconds();do{let re=l();if(p(re))await re}while(Bun.nanoseconds()-H<w)},{cpu:A,jit:W,diagnosticWallNs:G}=await ne(N,{intervalUs:f}),D=[],z=ct(A);if(z)D.push(z);let J=lt(W);if(J)D.push(J);return{cpu:A,jit:W,diagnosticWallNs:G,warnings:D}}function ct(l){let d=E(l);if(d>=st)return;return{code:"low-sample-count",message:`Only ${d} CPU sample(s) at ${l.samplingIntervalUs}\xB5s (target ${Be}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:d,target:Be,intervalUs:l.samplingIntervalUs}}}function lt(l){let{llint:d,baseline:f,dfg:w,ftl:N}=l.tiers,A=d+f+w+N;if(A===0)return;let W=d/A*100,G=f/A*100,D=w/A*100,z=N/A*100;if(W+G<=at)return;return{code:"jit-cold",message:`${(W+G).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:W,baselinePct:G,dfgPct:D,ftlPct:z}}}function P(l,d,f){let w=b(d);return Xe(l,w,{label:w,baseline:d.baseline,group:d.groupName,description:d.opts?.description,groupDescription:d.groupDescription,isolated:f,params:d.params,skipped:d.skipped})}async function j(l,d,f){let N=d.some((J)=>!J.skipped)&&f.noiseCheck!==!1?u():void 0,A=N?m(N):void 0,W=new Map,G=new Map;d.forEach((J,H)=>{if(J.groupName===void 0||J.skipped)return;if(!W.has(J.groupName))W.set(J.groupName,H);G.set(J.groupName,H)});let D=[],z=[];for(let J=0;J<d.length;J++){let H=d[J],re=P(l,H,f.markIsolated);if(D.push(re),H.skipped)continue;let ae=H.groupName!==void 0&&W.get(H.groupName)===J,ye=H.groupName!==void 0&&G.get(H.groupName)===J;if(ae&&H.groupBefore)await H.groupBefore();if(H.opts?.before)await H.opts.before();let oe={budgetMs:H.opts?.budgetMs??f.budgetMs,samples:H.opts?.samples??f.samples,minSamples:H.opts?.minSamples??f.minSamples,warmup:f.warmup,gc:cn(H,f.gc??!1)},le=await un(H.fn,oe);if(z.push(C({workload:re,configFingerprint:i({budgetMs:oe.budgetMs??null,samples:oe.samples??null,minSamples:oe.minSamples??null,gc:oe.gc??!1}),trials:le.trials,timing:le.timing,warnings:A&&z.length===0?[...le.warnings,A]:le.warnings})),ln(H,f.cpu??!1)){let ke=f.cpuIntervalUs??Je,xe=await fn(H.fn,{intervalUs:ke});z.push(h({workload:re,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:ke}),diagnosticWallNs:xe.diagnosticWallNs,cpu:xe.cpu,jit:xe.jit,warnings:xe.warnings,artifacts:[]}))}if(mn(H,f.alloc??!1)){let ke=await dn(H.fn);z.push(h({workload:re,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:ke.diagnosticWallNs,memory:ke.memory,warnings:[],artifacts:[]}))}if(H.opts?.after)await H.opts.after();if(ye&&H.groupAfter)await H.groupAfter()}return s(D,z,N)}
|
|
16
|
+
export{g,e,F,M,n,E,k,q,v,t,K,de,T,Y,c,r,X,Z,B,pe,Q,R,S,s,_,fe,C,h,ge,he,i,I,ee,a,O,o,u,m,ne,te,ve,p,ce,Te,$e,y,L,be,b,ue,we,me,x,P,j};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{g,e,F,M,n,E,k,q,v,t,K,de,T,Y,c,r,X,Z,B,pe,Q,R,s,_,fe,C,h,he,i,I,o,u,m,ne,y,be,x,j}from"./chunk-cqy5fzae.js";function ln(a,b,p){let P=a[0];if(P==="bun"||P?.endsWith("/bun"))return{argv:[P,...b,...a.slice(1)],env:p};return{argv:a,env:{...process.env,...p,BUN_OPTIONS:b.join(" ")}}}function kt(a){return a.startsWith("file://")?a.slice(7):a}function pn(a,b,p){let P=a.nodes,S=P.length,ee=new Map,L=[],te=new Map,O=new Int32Array(S);for(let Ce=0;Ce<S;Ce++){let ve=P[Ce],$e=ve.callFrame,Ne=kt($e.url),Ue=ee.get($e.functionName);if(Ue===void 0)Ue=new Map,ee.set($e.functionName,Ue);let Oe=Ue.get(Ne);if(Oe===void 0)Oe=L.length,Ue.set(Ne,Oe),L.push({key:e("fr",$e.functionName,Ne),name:$e.functionName,url:Ne||void 0,line:$e.lineNumber>=0?$e.lineNumber:void 0,col:$e.columnNumber>=0?$e.columnNumber:void 0});O[Ce]=Oe,te.set(ve.id,Ce)}let me=Array(S);for(let Ce=0;Ce<S;Ce++){let ve=P[Ce];me[Ce]={id:ve.id,frameIx:O[te.get(ve.id)],children:ve.children??[]}}let we=new Float64Array(S),ue=new Float64Array(S),{samples:ge,timeDeltas:ce}=a;for(let Ce=0;Ce<ge.length;Ce++){let ve=te.get(ge[Ce]);if(ve===void 0)continue;we[ve]+=ce[Ce]??0,ue[ve]+=1}let Re=new Int32Array(S).fill(-1);for(let Ce=0;Ce<S;Ce++){let ve=P[Ce].children;if(!ve)continue;for(let $e of ve){let Ne=te.get($e);if(Ne!==void 0)Re[Ne]=Ce}}let Ie=[],Te=[];for(let Ce=S-1;Ce>=0;Ce--)if(Re[Ce]===-1)Te.push(Ce);while(Te.length>0){let Ce=Te.pop();Ie.push(Ce);let ve=P[Ce].children;if(!ve)continue;for(let $e of ve){let Ne=te.get($e);if(Ne!==void 0&&Re[Ne]===Ce)Te.push(Ne)}}let Be=new Float64Array(S);for(let Ce=Ie.length-1;Ce>=0;Ce--){let ve=Ie[Ce];Be[ve]+=we[ve];let $e=Re[ve];if($e>=0)Be[$e]+=Be[ve]}let Fe=Array(L.length),De=[];for(let Ce=0;Ce<S;Ce++){let ve=me[Ce].frameIx,$e=Fe[ve];if($e)$e.selfUs+=we[Ce],$e.totalUs+=Be[Ce],$e.samples+=ue[Ce];else{let Ne={frameIx:ve,selfUs:we[Ce],totalUs:Be[Ce],samples:ue[Ce]};Fe[ve]=Ne,De.push(Ne)}}return{origin:b,samplingIntervalUs:p,frames:L,nodes:me,totals:De.sort((Ce,ve)=>ve.selfUs-Ce.selfUs),samples:{nodeIds:a.samples,timeDeltasUs:a.timeDeltas}}}async function Fn(a){let b=`${a.artifactDir}/${a.fileName}`,{argv:p,env:P}=ln(a.argv,["--cpu-prof","--cpu-prof-dir",a.artifactDir,"--cpu-prof-name",a.fileName,"--cpu-prof-interval",String(a.intervalUs)],a.env),S=Bun.nanoseconds(),L=await Bun.spawn(p,{cwd:a.cwd,env:P,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,te=Bun.nanoseconds()-S,O=Bun.file(b);if(!await O.exists())return{diagnosticWallNs:te,exitCode:L,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${b} after exit ${L}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:b,argv:a.argv}}]};let me=await O.json(),we=pn(me,"cpu-prof",a.intervalUs),ue=me.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:te,exitCode:L,artifactPath:b,cpu:we,warnings:ue}}function Bn(a){let{node_fields:p,node_types:P}=a.snapshot.meta,S=p.indexOf("type"),ee=p.indexOf("self_size"),L=p.length,te=P[0];if(S===-1||ee===-1||!Array.isArray(te))return{origin:"heap-prof",typeCounts:[],objectCount:a.snapshot.node_count};let O=te.length,me=Array(O),we=new Map,ue=[],ge=0,ce=a.nodes,Re=ce.length;for(let De=0;De<Re;De+=L){let Ce=ce[De+S],ve=ce[De+ee]??0;ge+=ve;let $e;if(Ce>=0&&Ce<O){if($e=me[Ce],$e===void 0)$e={type:te[Ce],count:0,bytes:0},me[Ce]=$e,ue.push($e)}else{let Ne=`unknown(${Ce})`;if($e=we.get(Ne),$e===void 0)$e={type:Ne,count:0,bytes:0},we.set(Ne,$e),ue.push($e)}$e.count++,$e.bytes+=ve}let Ie=ue.sort((De,Ce)=>Ce.count-De.count),Te=Ie.slice(0,20),Be=Ie.slice(20),Fe=Te.map(({type:De,count:Ce,bytes:ve})=>({type:De,count:Ce,retainedBytes:ve}));if(Be.length>0){let De=0,Ce=0;for(let ve of Be)De+=ve.count,Ce+=ve.bytes;Fe.push({type:"other",count:De,retainedBytes:Ce})}return{origin:"heap-prof",heapSizeBytes:ge,objectCount:a.snapshot.node_count,typeCounts:Fe}}async function An(a){let b=`${a.artifactDir}/${a.fileName}`,{argv:p,env:P}=ln(a.argv,["--heap-prof","--heap-prof-dir",a.artifactDir,"--heap-prof-name",a.fileName],a.env),S=Bun.nanoseconds(),L=await Bun.spawn(p,{cwd:a.cwd,env:P,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,te=Bun.nanoseconds()-S,O=Bun.file(b);if(!await O.exists())return{diagnosticWallNs:te,exitCode:L,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${b} after exit ${L}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:b,argv:a.argv}}]};let me=await O.json(),we=Bn(me);return{diagnosticWallNs:te,exitCode:L,artifactPath:b,heap:we,warnings:[]}}var Pt=1000;async function Un(a,b={}){let p=b.intervalUs??Pt,{Session:P}=await import("inspector/promises"),S=new P;S.connect();let ee=Bun.nanoseconds();try{await S.post("Profiler.enable"),await S.post("Profiler.setSamplingInterval",{interval:p}),await S.post("Profiler.start");let L=await a(),{profile:te}=await S.post("Profiler.stop"),O=Bun.nanoseconds()-ee,me=pn(te,"inspector",p);return{result:L,cpu:me,diagnosticWallNs:O}}finally{S.disconnect()}}function $t(a){let b=a>>>0;return()=>{b=b+1831565813|0;let p=Math.imul(b^b>>>15,1|b);return p=p+Math.imul(p^p>>>7,61|p)^p,((p^p>>>14)>>>0)/4294967296}}var fn=2000,xt=2000;function Mt(a){let b=a.length,p=b>>1;return b%2===0?(a[p-1]+a[p])/2:a[p]}function jn(a,b,p){if(a.length<=p)return a;let P=[...a];for(let S=0;S<p;S++){let ee=S+Math.floor(b()*(P.length-S)),L=P[S];P[S]=P[ee],P[ee]=L}return P.slice(0,p)}class Mn{sorted;rankOf;counts;n;constructor(a){let b=a.length,p=new Uint32Array(b);for(let P=0;P<b;P++)p[P]=P;p.sort((P,S)=>a[P]-a[S]),this.sorted=new Float64Array(b),this.rankOf=new Uint32Array(b);for(let P=0;P<b;P++)this.sorted[P]=a[p[P]],this.rankOf[p[P]]=P;this.n=b,this.counts=new Uint32Array(b)}resampleMedian(a){let{n:b,counts:p,sorted:P,rankOf:S}=this;p.fill(0);for(let me=0;me<b;me++)p[S[Math.floor(a()*b)]]++;let ee=b+1>>1,L=b%2===0?ee+1:ee,te=0,O=-1;for(let me=0;me<b;me++){if(te+=p[me],O<0&&te>=ee)O=me;if(te>=L)return O===me?P[me]:(P[O]+P[me])/2}return P[b-1]}}function Rt(a,b){let p=new Float64Array(a.length+b.length+1);return p.set(a),p[a.length]=Number.NaN,p.set(b,a.length+1),Bun.hash.crc32(p)}function _n(a,b,p={}){let P=p.seed??Rt(a,b),S=$t(P),ee=p.iterations??xt,L=a.length>fn||b.length>fn,te=new Mn(jn(a,S,fn)),O=new Mn(jn(b,S,fn)),me=Mt(te.sorted),we=new Float64Array(ee);for(let ue=0;ue<ee;ue++){let ge=te.resampleMedian(S),ce=O.resampleMedian(S);we[ue]=me===0?ce-ge===0?0:1/0:(ce-ge)/me*100}return we.sort(),{ci95:[r(we,0.025),r(we,0.975)],seed:P,data:{subsampled:L,iterations:ee}}}function vt(a){let b=a<0?-1:1,p=Math.abs(a),P=0.254829592,S=-0.284496736,ee=1.421413741,L=-1.453152027,te=1.061405429,O=0.3275911,me=1/(1+0.3275911*p),we=1-((((1.061405429*me+-1.453152027)*me+1.421413741)*me+-0.284496736)*me+0.254829592)*me*Math.exp(-p*p);return b*we}function Ct(a){return 0.5*(1+vt(a/Math.SQRT2))}function Ln(a,b){let p=a.length,P=b.length,S=p+P,ee=new Float64Array(a),L=new Float64Array(b);ee.sort(),L.sort();let te=0,O=0,me=0,we=0,ue=0;while(me<p||we<P){let Be=we>=P||me<p&&ee[me]<=L[we]?ee[me]:L[we],Fe=0;while(me<p&&ee[me]===Be)Fe++,me++;let De=0;while(we<P&&L[we]===Be)De++,we++;let Ce=Fe+De,ve=ue+(Ce+1)/2;if(te+=Fe*ve,Ce>1)O+=Ce**3-Ce;ue+=Ce}let ge=te-p*(p+1)/2,ce=p*P/2,Re=Math.sqrt(p*P*(S+1-O/(S*(S-1)))/12),Ie=Re===0?0:(ge-ce)/Re,Te=Math.min(1,Math.max(0,2*(1-Ct(Math.abs(Ie)))));return{u:ge,z:Ie,pValue:Te}}var f={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Rn=5;function gn(a,b){if(a===0)return b===0?0:1/0;return(b-a)/a*100}function Vn(a){let b=new Map;for(let p of a.measurements){let P=`${p.workloadId}\x00${p.phase}`;if(!b.has(P))b.set(P,p)}return b}function Tt(a,b,p){return{base:a,cand:b,baseByPhase:Vn(a),candByPhase:Vn(b),candWorkloads:new Map(b.workloads.map((P)=>[P.id,P])),environmentMismatch:It(a,b),effectiveTimingPct:Math.max(p.timingPct,a.environment?.noise.floorPct??0,b.environment?.noise.floorPct??0)}}function It(a,b){let p=[];if(a.platform.os!==b.platform.os)p.push({field:"platform.os",base:a.platform.os,cand:b.platform.os});if(a.platform.arch!==b.platform.arch)p.push({field:"platform.arch",base:a.platform.arch,cand:b.platform.arch});if(a.bunVersion!==b.bunVersion)p.push({field:"bunVersion",base:a.bunVersion,cand:b.bunVersion});if(a.environment&&b.environment){if(a.environment.cpuModel!==b.environment.cpuModel)p.push({field:"cpuModel",base:a.environment.cpuModel,cand:b.environment.cpuModel});if(a.environment.cores!==b.environment.cores)p.push({field:"cores",base:a.environment.cores,cand:b.environment.cores})}if(p.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${p.map((P)=>P.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:p}}}function St(a){let b=[];for(let P of a){if(!P.timing)continue;let S=1+P.timing.medianDeltaPct/100;if(Number.isFinite(S)&&S>0)b.push(Math.log(S))}if(b.length===0)return null;let p=b.reduce((P,S)=>P+S,0)/b.length;return(Math.exp(p)-1)*100}function re(a,b,p=f){let P=Tt(a,b,p);return{effectiveTimingPct:P.effectiveTimingPct,compare:(S)=>Ot(P,S,p),unmatched(){let S=new Set(a.workloads.map((ee)=>ee.id));return{baseOnly:a.workloads.filter((ee)=>!P.candWorkloads.has(ee.id)),candOnly:b.workloads.filter((ee)=>!S.has(ee.id))}}}}function se(a,b){let p=0,P=0,S=0;for(let ee of a){if(!ee.timing)continue;if(ee.timing.verdict==="regressed")p++;else if(ee.timing.verdict==="improved")P++;else S++}return{matched:a.length,regressed:p,improved:P,unchanged:S,geomeanPct:St(a),effectiveTimingPct:b,verdict:a.some((ee)=>ee.verdict==="fail")?"fail":"pass"}}function H(a,b,p=f){let P=re(a,b,p),S=[];for(let ee of a.workloads){let L=P.compare(ee.id);if(L)S.push(L)}return{comparisons:S,unmatched:P.unmatched(),summary:se(S,P.effectiveTimingPct)}}function Ot(a,b,p){let{baseByPhase:P,candByPhase:S,effectiveTimingPct:ee}=a,L=P.get(`${b}\x00timing`),te=S.get(`${b}\x00timing`),O=P.get(`${b}\x00cpu`),me=S.get(`${b}\x00cpu`),we=P.get(`${b}\x00heap`),ue=S.get(`${b}\x00heap`),ge=a.candWorkloads.get(b),ce=L?.id??O?.id??we?.id,Re=te?.id??me?.id??ue?.id??ge?.id;if(!ce||!Re)return;let Ie=!1,Te=[];if(a.environmentMismatch)Te.push(a.environmentMismatch);let Be;if(L?.timing&&ge?.skipped&&!te?.timing)Be={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},Te.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:b}});else if(L?.timing&&te?.timing){let Ce=L.timing.samples,ve=te.timing.samples,$e=gn(L.timing.median,te.timing.median),Ne=gn(L.timing.mean,te.timing.mean),Ue=(Oe,Ae)=>{if(Oe>ee)return"regressed";if(Ae<-ee)return"improved";return"unchanged"};if(Ce.length<Rn||ve.length<Rn){let Oe=Ue($e,$e);if(Oe==="regressed")Ie=!0;Be={medianDeltaPct:$e,meanDeltaPct:Ne,verdict:Oe},Te.push({code:"thin-comparison",message:`Only ${Ce.length} baseline / ${ve.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Rn}+ per side).`,data:{baseSamples:Ce.length,candSamples:ve.length}})}else{let Oe=_n(Ce,ve,{iterations:p.bootstrapIterations}),Ae=Ln(Ce,ve),_e=Ae.pValue<p.alpha?Ue(Oe.ci95[0],Oe.ci95[1]):"unchanged";if(_e==="regressed")Ie=!0;Be={medianDeltaPct:$e,meanDeltaPct:Ne,ci95:Oe.ci95,pValue:Ae.pValue,seed:Oe.seed,verdict:_e}}}let Fe;if(O?.cpu&&me?.cpu){let Ce=new Map(O.cpu.totals.map((Oe)=>[O.cpu.frames[Oe.frameIx].key,Oe])),ve=new Map(me.cpu.totals.map((Oe)=>[me.cpu.frames[Oe.frameIx].key,Oe])),$e=new Map(O.cpu.frames.map((Oe)=>[Oe.key,Oe.name])),Ne=new Map(me.cpu.frames.map((Oe)=>[Oe.key,Oe.name]));Fe=[...new Set([...Ce.keys(),...ve.keys()])].map((Oe)=>{let Ae=Ce.get(Oe)?.selfUs??0,_e=ve.get(Oe)?.selfUs??0;return{frameKey:Oe,name:Ne.get(Oe)??$e.get(Oe)??Oe,baseSelfUs:Ae,candSelfUs:_e,deltaPct:gn(Ae,_e)}}).sort((Oe,Ae)=>Math.abs(Ae.deltaPct)-Math.abs(Oe.deltaPct));for(let Oe of Fe)if((Oe.baseSelfUs>=p.minFrameSelfUs||Oe.candSelfUs>=p.minFrameSelfUs)&&Oe.deltaPct>p.frameSelfPct)Ie=!0}let De;if(we?.heap&&ue?.heap){let Ce=new Map(we.heap.typeCounts.map((Ne)=>[Ne.type,Ne])),ve=new Map(ue.heap.typeCounts.map((Ne)=>[Ne.type,Ne]));De=[...new Set([...Ce.keys(),...ve.keys()])].map((Ne)=>{let Ue=Ce.get(Ne),Oe=ve.get(Ne);return{type:Ne,baseCount:Ue?.count??0,candCount:Oe?.count??0,baseBytes:Ue?.retainedBytes,candBytes:Oe?.retainedBytes,deltaPct:gn(Ue?.count??0,Oe?.count??0)}}).sort((Ne,Ue)=>Math.abs(Ue.deltaPct)-Math.abs(Ne.deltaPct));for(let Ne of De)if(Ne.deltaPct>p.heapTypePct)Ie=!0}return{id:e("cmp",ce,Re),baselineMeasurementId:ce,candidateMeasurementId:Re,timing:Be,...Te.length>0&&{warnings:Te},frames:Fe,heapTypes:De,thresholds:{...p,effectiveTimingPct:ee},verdict:Ie?"fail":"pass"}}var Ze="node_modules/.cache/ostia",Dt=".ostia/baselines",Nt={warmup:3,outDir:Ze,baselineDir:Dt,baseline:"main",thresholds:f,workloads:[]};class N extends Error{}var Et={runs:"samples"};function zn(a,b){for(let[p,P]of Object.entries(Et))if(p in a)throw new N(`${b}: "${p}" was renamed to "${P}".`);return{...Nt,...a,thresholds:{...f,...a.thresholds??{}}}}async function Hn(a){let b=Bun.file(a);if(!await b.exists())return;let p;try{p=await b.json()}catch(P){throw new N(`${a}: ${P instanceof Error?P.message:String(P)}`)}return zn(p,a)}async function Gn(a){let b=a.startsWith("/")?a:`${process.cwd()}/${a}`;if(!await Bun.file(b).exists())return;let p;try{p=await import(b)}catch(P){throw new N(`${a}: ${P instanceof Error?P.message:String(P)}`)}return zn(p.default??{},a)}async function W(a){if(a!==void 0)return a.endsWith(".ts")?Gn(a):Hn(a);return await Gn("ostia.config.ts")??Hn("ostia.config.json")}function l(a,b){return`${a.baselineDir}/${b??a.baseline}.json`}async function oe(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var Wt=10,Ft=3000000000,Bt=3;function vn(a){if(a.timeSource)Z(a.timeSource);let b=a.warmup??Bt,p=a.samples,P=a.minSamples??Wt,S=p??P,ee=p!==void 0?0:a.budgetMs!==void 0?a.budgetMs*1e6:Ft,L=a.timeSource!==void 0,te=a.ignoreExitCodes??[],O=new Set(te),me=[],we=0,ue=0,ge=!1,ce;function Re(){if(ge)return!0;if(p!==void 0)return ue>=p;return ue>=S&&we>=ee}async function Ie(Te,Be){if(a.prepare)await Q(a.prepare,{phase:Te,index:Be},{cwd:a.cwd,env:a.env,timeoutMs:a.timeoutMs,signal:a.signal});return pe(a)}return{async warmup(){for(let Te=0;Te<b;Te++){if(a.signal?.aborted)return;await Ie("warmup",Te)}},async step(){if(Re()||a.signal?.aborted)return!1;let Te=await Ie("timing",ue);if(a.signal?.aborted)return!1;if(Te.timeSourceNoMatch)ce??=Te.timeSourceMissOutput;if(me.push({i:ue,wallNs:Te.wallNs,exitCode:Te.exitCode??void 0,userNs:Te.userNs,systemNs:Te.systemNs,maxRssBytes:Te.maxRssBytes,...Te.reportedNs!==void 0&&{reportedNs:Te.reportedNs},...Te.timedOut?{timedOut:!0}:{},...Te.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),we+=Te.wallNs,ue++,Te.exitCode!==null&&Te.exitCode!==0&&!O.has(Te.exitCode))ge=!0;return!0},done:Re,result(){let Te=me.filter(($e)=>!$e.timedOut&&!$e.timeSourceNoMatch),Be=Te.map(($e)=>L?$e.reportedNs:$e.wallNs),Fe=[],De=me.filter(($e)=>$e.timedOut).length;if(De>0)Fe.push({code:"timeout",message:`${De} of ${me.length} trial(s) timed out after ${a.timeoutMs}ms.`,data:{timeoutMs:a.timeoutMs,trials:De}});let Ce=me.filter(($e)=>$e.timeSourceNoMatch).length;if(Ce>0&&a.timeSource){let{pattern:$e}=a.timeSource;Fe.push({code:"time-source-no-match",message:`${Ce} of ${me.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof $e==="string"?$e:$e.source,trials:Ce,...ce!==void 0&&{output:ce}}})}if(Be.length===0)return{trials:me,warnings:Fe};let ve=c(Be);return Fe.push(...X(ve,Te.map(($e)=>$e.exitCode),L?"reported":"subprocess",te)),{trials:me,timing:ve,warnings:Fe}}}}async function Cn(a){await a.warmup();while(await a.step());}async function le(a){let b=vn(a);return await Cn(b),b.result()}function J(a,b=[]){if(!a.timing)return!0;let p=new Set(b);return a.trials.some((P)=>P.exitCode!==void 0&&P.exitCode!==0&&!p.has(P.exitCode))}function hn(a,b){let p={samples:b.samples,minSamples:b.minSamples};for(let[P,S]of Object.entries(p))if(S!==void 0&&(!Number.isFinite(S)||S<1))throw RangeError(`${a}: ${P} must be >= 1, got ${S}`);if(b.budgetMs!==void 0&&!Number.isFinite(b.budgetMs))throw RangeError(`${a}: budgetMs must be finite, got ${b.budgetMs}`)}import{appendFileSync as At,existsSync as Tn,lstatSync as Ut,realpathSync as jt,renameSync as _t}from"fs";import{isAbsolute as Kn,relative as Lt,sep as Vt}from"path";class A extends Error{}var Ht=new URL("./ab-runner.ts",import.meta.url).pathname,cn={base:"HEAD",rounds:15,thresholdPct:10,geomeanThresholdPct:1.5,confirm:2};function Jn(a,b){let p=Bun.spawnSync(["git",...a],{cwd:b,stdout:"pipe",stderr:"ignore"});return p.success?p.stdout.toString().trim():void 0}var Gt=`
|
|
3
|
+
;globalThis.__ostia_ab_base__;
|
|
4
|
+
`,zt="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function Kt(a){for await(let b of new Bun.Glob(zt).scan({cwd:a,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(b)||!Ut(b).isFile())continue;At(b,Gt)}}async function Jt(a,b,p){if(Tn(b))return;let P=`${b}.tmp-${process.pid}`;await Bun.spawn(["rm","-rf",P]).exited,await Bun.spawn(["mkdir","-p",P]).exited;let S=Bun.spawn(["git","archive","--format=tar",a],{cwd:p,stdout:"pipe",stderr:"pipe"}),ee=Bun.spawn(["tar","-x","-C",P],{stdin:S.stdout,stderr:"pipe"}),[L,te]=await Promise.all([S.exited,ee.exited]);if(L!==0||te!==0){let O=await new Response(L!==0?S.stderr:ee.stderr).text();throw await Bun.spawn(["rm","-rf",P]).exited,Error(`Could not extract ${a}: ${O.trim()}`)}await Kt(P);try{_t(P,b)}catch{await Bun.spawn(["rm","-rf",P]).exited}}function Yt(a){return r(Float64Array.from(a).sort(),0.5)}function qt(a){if(!a.repeats?.length)return a.medianRatio;return Yt([a.medianRatio,...a.repeats.map((b)=>b.medianRatio)])}function Qt(a,b){let p=a.map((te)=>te.paired).filter((te)=>te!==void 0),P=0;for(let te of p)P+=Math.log(qt(te));let S=p.length>0?(Math.exp(P/p.length)-1)*100:null,ee=p.filter((te)=>te.verdict==="regressed").length,L=p.filter((te)=>te.verdict==="improved").length;return{...b,matched:p.length,regressed:ee,improved:L,unchanged:p.length-ee-L,unconfirmed:p.filter((te)=>te.confirmed===!1).length,outputDiffers:p.filter((te)=>!te.sameOutput).length,geomeanPct:S,verdict:ee>0||S!==null&&S>b.geomeanThresholdPct?"fail":"pass"}}async function G(a){let b=a.base??cn.base,p=a.rounds??cn.rounds,P=a.thresholdPct??cn.thresholdPct,S=a.geomeanThresholdPct??cn.geomeanThresholdPct,ee=a.confirm??cn.confirm;if(!Number.isInteger(p)||p<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${p}`);if(!Number.isInteger(ee)||ee<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${ee}`);for(let[ve,$e]of Object.entries({thresholdPct:P,geomeanThresholdPct:S}))if(!Number.isFinite($e)||$e<0)throw RangeError(`ab: ${ve} must be >= 0, got ${$e}`);let L=a.cwd??process.cwd(),te=a.outDir??Ze,O=Kn(te)?te:`${L}/${te}`,me=`${O}/ab-tmp`,we=Jn(["rev-parse","--show-toplevel"],L);if(we===void 0)throw new A(`${L} is not inside a git repository.`);let ue=Jn(["rev-parse","--verify","--quiet",`${b}^{commit}`],L);if(ue===void 0)throw new A(`"${b}" is not a commit in ${we}.`);let ge=`${O}/ab/${ue}`;await Jt(ue,ge,L);let ce=a.noiseCheck===!1?void 0:u(),Re=(ve)=>Kn(ve)?ve:`${L}/${ve}`,Ie=a.suites.map(Re),Te=Ie.map((ve,$e)=>{if(!Tn(ve))throw Error(`Suite not found: ${a.suites[$e]}`);let Ne=Lt(we,jt(ve));if(Ne===".."||Ne.startsWith(`..${Vt}`))throw new A(`${a.suites[$e]} is outside ${we}.`);return Tn(`${ge}/${Ne}`)?`${ge}/${Ne}`:""}),Be=(a.preload??[]).map(Re),Fe=a.bunFlags??[],De=0,Ce=async(ve,$e={})=>{let Ne=`${me}/${e("ab-run",Ie[ve],De++)}.json`,Ue={filter:a.filter,rounds:p,thresholdPct:P,preload:Be,...$e},Oe=B(a.timeoutMs,a.signal),_e=await Bun.spawn(["bun",...Fe,Ht,Ie[ve],Te[ve],Ne,JSON.stringify(Ue)],{cwd:L,stdout:"inherit",stderr:"inherit",stdin:"ignore",...Oe.spawn}).exited;if(a.signal?.aborted)return;if(Oe.timedOut())throw Error(`A/B suite timed out after ${a.timeoutMs}ms: ${a.suites[ve]}`);if(_e!==0)throw Error(`A/B suite failed: ${a.suites[ve]} (runner exited ${_e})`);return o(Ne)};try{let ve=[],$e=[],Ne=new Map,Ue=[],Oe=[];for(let Se=0;Se<Ie.length;Se++){let Ee=await Ce(Se);if(!Ee)break;ve.push(...Ee.workloads),$e.push(...Ee.measurements);for(let Ve of Ee.measurements)Ne.set(Ve.workloadId,Se);Ue.push(...Ee.unmatched?.baseOnly??[]),Oe.push(...Ee.unmatched?.candOnly??[])}for(let Se of $e){let Ee=Se.paired;if(!Ee?.flagged||ee===0)continue;Ee.repeats=[];for(let Ve=0;Ve<ee&&!a.signal?.aborted;Ve++){let He=(await Ce(Ne.get(Se.workloadId),{workloadIds:[Se.workloadId]}))?.measurements[0]?.paired;if(!He)break;Ee.repeats.push({medianRatio:He.medianRatio,p25:He.p25,p75:He.p75,...He.flagged&&{flagged:He.flagged}})}Ee.confirmed=Ee.repeats.length===ee&&Ee.repeats.every((Ve)=>Ve.flagged===Ee.flagged),Ee.verdict=Ee.confirmed?Ee.flagged:"unchanged"}let Ae=ce&&m(ce);if(Ae&&$e.length>0)$e[0].warnings.push(Ae);if(a.signal?.aborted&&$e.length>0)$e[$e.length-1].warnings.push({code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites had already completed."});let _e=s(ve,$e,ce);return _e.unmatched={baseOnly:Ue,candOnly:Oe},_e.ab=Qt($e,{base:{ref:b,sha:ue},rounds:p,thresholdPct:P,geomeanThresholdPct:S}),_e}finally{await Bun.spawn(["rm","-rf",me]).exited}}async function V(a,b){let p=new Set;for(let P of a)for await(let S of new Bun.Glob(P).scan({cwd:b,absolute:!1}))p.add(S);return[...p].sort()}var In=new URL("./runner.ts",import.meta.url).pathname;function ie(){return Math.max(1,navigator.hardwareConcurrency||1)}async function U(a,b){return V(a,b)}function Xt(a){if(a===void 0)return;return a==="auto"?ie():a}async function z(a,b,p=process.cwd()){return{suites:a.suites.length>0?a.suites:b?.suites?await U(b.suites,p):[],budgetMs:a.budgetMs??b?.budgetMs,samples:a.samples??b?.samples,minSamples:a.minSamples??b?.minSamples,jobs:a.jobs??Xt(b?.jobs),gc:a.gc??b?.gc??!1,cpu:a.cpu??b?.cpu??!1,cpuIntervalUs:a.cpuIntervalUs??b?.cpuIntervalUs,alloc:a.alloc??b?.alloc??!1,peakMem:a.peakMem??b?.peakMem??!1,filter:a.filter??b?.filter,isolate:a.isolate??b?.isolate??!1,preload:a.preload.length>0?a.preload:b?.preload??[],bunFlags:a.bunFlags.length>0?a.bunFlags:b?.bunFlags??[],outDir:a.outDir??b?.outDir,noiseCheck:a.noiseCheck,timeoutMs:a.timeoutMs??b?.timeoutMs,cwd:p}}var Zt=3,er=16777216;async function D(a){hn("bench",a);let b=a.cwd??process.cwd(),p=a.outDir??Ze,P=`${p.startsWith("/")?p:`${b}/${p}`}/bench-tmp`,S=Math.max(1,Math.floor(a.jobs??1)),ee={budgetMs:a.budgetMs,samples:a.samples,minSamples:a.minSamples,gc:a.gc,cpu:a.cpu,cpuIntervalUs:a.cpuIntervalUs,alloc:a.alloc,peakMem:a.peakMem,noiseCheck:!1},L=a.noiseCheck===!1?void 0:u(),te=L?m(L):void 0,O=(ce)=>ce.startsWith("/")?ce:`${b}/${ce}`,me=a.suites.map(O),we=(a.preload??[]).map(O),ue=a.bunFlags??[],ge=async(ce,Re,Ie)=>{let Te=new Set,Be=0,Fe,De=async()=>{while(Fe===void 0&&!a.signal?.aborted&&Be<ce.length){let Ce=Be++;try{let ve=B(a.timeoutMs,a.signal),$e=Bun.spawn(ce[Ce],{cwd:b,...Ie&&{env:{...process.env,...Ie}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...ve.spawn});Te.add($e);let Ne=await $e.exited;if(Te.delete($e),a.signal?.aborted)return;if(ve.timedOut())throw Error(`Bench suite timed out after ${a.timeoutMs}ms: ${Re(Ce)}`);if(Ne!==0)throw Error(`Bench suite failed: ${Re(Ce)} (runner exited ${Ne})`)}catch(ve){Fe??=ve instanceof Error?ve:Error(String(ve));for(let $e of Te)$e.kill()}}};if(await Promise.all(Array.from({length:Math.min(S,ce.length)},De)),Fe)throw Fe};try{let ce=me.map((Se)=>`${P}/${e("bench-plan",Se)}.json`),Re=me.map((Se)=>`${P}/${e("bench-primary",Se)}.json`),Ie=me.map((Se,Ee)=>["bun",...ue,In,Se,Re[Ee],JSON.stringify({...ee,filter:a.filter,isolate:a.isolate,preload:we,planPath:ce[Ee]})]);await ge(Ie,(Se)=>a.suites[Se]);let Te=await Promise.all(ce.map(async(Se)=>{if(!await Bun.file(Se).exists())return[];let{tasks:Ee}=await Bun.file(Se).json();return Ee})),Be=await Promise.all(Re.map(async(Se)=>await Bun.file(Se).exists()?o(Se):void 0)),Fe=[];for(let Se=0;Se<Te.length;Se++)for(let Ee of Te[Se])if(Ee.isolate)Fe.push({suiteIndex:Se,taskIds:[Ee.id]});let De=Fe.map((Se,Ee)=>`${P}/${e("bench-item",me[Se.suiteIndex],Ee)}.json`),Ce=Fe.map((Se,Ee)=>["bun",...ue,In,me[Se.suiteIndex],De[Ee],JSON.stringify({...ee,taskIds:Se.taskIds,preload:we,markIsolated:!0})]);await ge(Ce,(Se)=>a.suites[Fe[Se].suiteIndex]);let ve=await Promise.all(De.map(async(Se)=>await Bun.file(Se).exists()?o(Se):void 0)),$e=[];for(let Se=0;Se<Te.length;Se++)for(let Ee of Te[Se]){if(!Ee.peakMem)continue;for(let Ve=0;Ve<Zt;Ve++)$e.push({suiteIndex:Se,workloadId:Ee.workloadId})}let Ne=$e.map((Se,Ee)=>`${P}/${e("bench-peak",me[Se.suiteIndex],Ee)}.json`);await ge($e.map((Se,Ee)=>["bun",...ue,In,me[Se.suiteIndex],Ne[Ee],JSON.stringify({filter:a.filter,preload:we,peakMemFor:Se.workloadId})]),(Se)=>a.suites[$e[Se].suiteIndex],{OSTIA_PEAK_MEM:"1"});let Ue=new Map;for(let Se=0;Se<$e.length;Se++){let Ee=Bun.file(Ne[Se]);if(!await Ee.exists())continue;let Ve=$e[Se].workloadId,ze=Ue.get(Ve)??[];ze.push(await Ee.json()),Ue.set(Ve,ze)}let Oe=(Se)=>{let Ee=Ue.get(Se.id);if(!Ee?.length)return[];let Ve=(je)=>r(Float64Array.from(je).sort(),0.5),ze=Ve(Ee.map((je)=>je.peakBytes)),He=Math.max(...Ee.map((je)=>je.slackBytes)),We=He>=er&&He>ze/4?[{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${k(He)} the allocator still held (module-scope setup or before hooks that allocate), which the call could reuse without RSS rising: this reading can be low by up to that much. Skip that work when process.env.OSTIA_PEAK_MEM is set.`,data:{slackBytes:He,processes:Ee.length}}]:[];return[h({workload:Se,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:Ve(Ee.map((je)=>je.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:ze},warnings:We,artifacts:[]})]},Ae=[],_e=[];for(let Se=0;Se<Te.length;Se++){let Ee=Be[Se];if(!Ee)continue;let Ve=new Map;for(let Ke of Ee.measurements){let We=Ve.get(Ke.workloadId)??[];We.push(Ke),Ve.set(Ke.workloadId,We)}let ze=0,He=new Map;Fe.forEach((Ke,We)=>{let je=ve[We];if(Ke.suiteIndex===Se&&je)He.set(Ke.taskIds[0],je)});for(let Ke of Te[Se])if(Ke.isolate){let We=He.get(Ke.id);if(!We)continue;let je=We.workloads[0];Ae.push(je);for(let Ye of We.measurements)if(Ye.workloadId===je.id)_e.push(Ye);_e.push(...Oe(je))}else{let We=Ee.workloads[ze];Ae.push(We),ze++;for(let je of Ve.get(We.id)??[])_e.push(je);_e.push(...Oe(We))}}if(te&&_e.length>0)_e[0].warnings=[..._e[0].warnings,te];if(a.signal?.aborted&&_e.length>0){let Se=_e[_e.length-1];Se.warnings=[...Se.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return s(Ae,_e,L)}finally{await Bun.spawn(["rm","-rf",P]).exited}}function ke(a,b,p=8){if(p<=1)throw RangeError(`range: multiplier must be > 1, got ${p}`);if(a<=0)throw RangeError(`range: start must be > 0, got ${a}`);let P=[];for(let S=a;S<=b;S*=p)P.push(S);if(!P.includes(b))P.push(b);return P}function Xe(a,b){if(b){let p=a.measurements.find((P)=>P.id===b);return p?.cpu?[p]:[]}return a.measurements.filter((p)=>p.phase==="cpu"&&p.cpu)}function nn(a){let b=a.nodes,p=b.length,P=nr(a),S=new Int32Array(p).fill(-1);for(let O=0;O<p;O++)for(let me of b[O].children){let we=P(me);if(we!==-1)S[we]=O}let ee=[];for(let O=0;O<p;O++)if(S[O]===-1)ee.push(O);let L=[],te=[];for(let O=ee.length-1;O>=0;O--)te.push(ee[O]);while(te.length>0){let O=te.pop();L.push(O);for(let me of b[O].children){let we=P(me);if(we!==-1&&S[we]===O)te.push(we)}}return{count:p,indexOf:P,parentIx:S,roots:ee,order:L}}function nr(a){let b=a.nodes,p=b.length,P=1/0,S=-1/0,ee=!0;for(let te=0;te<p;te++){let O=b[te].id;if(!Number.isInteger(O)){ee=!1;break}if(O<P)P=O;if(O>S)S=O}if(ee&&p>0&&S-P<p*4+64){let te=S-P+1,O=new Int32Array(te).fill(-1);for(let me=0;me<p;me++)O[b[me].id-P]=me;return(me)=>{let we=me-P;return we>=0&&we<te?O[we]:-1}}let L=new Map;for(let te=0;te<p;te++)L.set(b[te].id,te);return(te)=>L.get(te)??-1}function Yn(a,b){let{count:p,indexOf:P,parentIx:S,order:ee}=b,L=new Float64Array(p),te=new Float64Array(p),O=a.samples?.nodeIds??[],me=a.samples?.timeDeltasUs??[];for(let ue=0;ue<O.length;ue++){let ge=P(O[ue]);if(ge===-1)continue;L[ge]+=me[ue]??0,te[ge]+=1}let we=new Float64Array(p);for(let ue=ee.length-1;ue>=0;ue--){let ge=ee[ue];we[ge]+=L[ge];let ce=S[ge];if(ce>=0)we[ce]+=we[ge]}return{selfUs:L,totalUs:we,samples:te}}var qn={name:"collapsed",async render(a,b={}){return{files:Xe(a,b.measurementId).map((S)=>{let ee=S.cpu,{nodes:L,frames:te}=ee,O=nn(ee),me=Array(O.count);for(let Re of O.order){let Ie=te[L[Re].frameIx].name||"(anonymous)",Te=O.parentIx[Re];me[Re]=Te===-1?Ie:`${me[Te]};${Ie}`}let we=new Float64Array(O.count),ue=[],ge=ee.samples?.nodeIds??[];for(let Re=0;Re<ge.length;Re++){let Ie=O.indexOf(ge[Re]);if(Ie===-1)continue;if(we[Ie]++===0)ue.push(Ie)}let ce=Array(ue.length);for(let Re=0;Re<ue.length;Re++){let Ie=ue[Re];ce[Re]=`${me[Ie]} ${we[Ie]}`}return{path:`${S.id}.collapsed.txt`,content:ce.join(`
|
|
5
|
+
`)+(ce.length>0?`
|
|
6
|
+
`:"")}})}}};var Qn={name:"cpuprofile",async render(a,b={}){let p=Xe(a,b.measurementId),P=[],S=[];for(let ee of p){if(ee.cpu?.origin!=="cpu-prof"&&ee.cpu?.origin!=="inspector"){S.push(`${ee.id} (origin ${ee.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let L=ee.artifacts.find((O)=>O.kind==="cpuprofile");if(!L){S.push(`${ee.id} (no cpuprofile artifact recorded on this run)`);continue}let te=Bun.file(L.path);if(!await te.exists()){S.push(`${ee.id} (artifact missing on disk: ${L.path})`);continue}P.push({path:`${ee.id}.cpuprofile`,content:await te.text()})}if(P.length===0&&S.length>0)return{text:`No .cpuprofile artifacts available:
|
|
7
|
+
${S.map((ee)=>` - ${ee}`).join(`
|
|
8
|
+
`)}
|
|
9
|
+
`};return{files:P}}};var Xn={name:"json",async render(a){return{text:I(a)}}};var Zn={name:"jsonl",async render(a){let{measurements:b,...p}=a;return{text:`${[g({kind:"document",...p}),...b.map((S)=>g({kind:"measurement",...S}))].join(`
|
|
10
|
+
`)}
|
|
11
|
+
`}}};function en(a){return a.measurements.filter((b)=>b.phase==="paired"&&b.timing!==void 0&&b.paired!==void 0)}function qe(a){let b=(a-1)*100;return`${b>=0?"+":""}${b.toFixed(1)}%`}function bn(a){if(!a.flagged)return"";let b=a.repeats?.length?` (repeats: ${a.repeats.map((p)=>qe(p.medianRatio)).join(", ")})`:"";if(a.confirmed===void 0)return`${a.flagged}${b}`;return`${a.confirmed?`${a.flagged}, confirmed`:`${a.flagged}? unconfirmed`}${b}`}function wn(a){return`working tree vs ${a.base.ref} (${a.base.sha.slice(0,7)}) \xB7 ${a.rounds} rounds \xB7 threshold ${a.thresholdPct}% \xB7 geomean threshold ${a.geomeanThresholdPct}%`}function yn(a){let b=a.geomeanPct===null?"Geomean -":`Geomean ${a.geomeanPct>=0?"+":""}${a.geomeanPct.toFixed(1)}% (threshold ${a.geomeanThresholdPct}%)`,p=a.unconfirmed>0?` (${a.unconfirmed} unconfirmed)`:"";return`${b} \xB7 ${a.regressed} regressed, ${a.improved} improved, ${a.unchanged} unchanged of ${a.matched}${p} \xB7 ${a.verdict}`}function kn(a){let b=new Map(a.workloads.map((P)=>[P.id,P])),p=(P)=>b.has(P)?t(b.get(P)):P;return{outputDiffers:en(a).filter((P)=>!P.paired.sameOutput).map((P)=>p(P.workloadId)),baseOnly:(a.unmatched?.baseOnly??[]).map(p),candOnly:(a.unmatched?.candOnly??[]).map(p)}}function dn(a){if(!a?.entry)return;if(a.entry.group!==void 0)return a.entry.group;let b=a.entry.task,p=b.lastIndexOf("/");return p===-1?void 0:b.slice(0,p)}function tn(a){let b=Math.min(...a.map((S)=>S.run.timing.median)),p=new Map;for(let S of a){let ee=dn(S.workload);if(ee===void 0)continue;let L=p.get(ee);if(L)L.push(S);else p.set(ee,[S])}let P=new Map;for(let S of a){let ee=dn(S.workload);if(ee===void 0){P.set(S,b);continue}let L=p.get(ee)??[S],te=L.find((O)=>O.workload?.baseline);P.set(S,te?te.run.timing.median:Math.min(...L.map((O)=>O.run.timing.median)))}return P}function rn(a){return a.measurements.filter((b)=>b.phase==="timing"&&b.timing!==void 0)}function sn(a,b){let p=new Set(b.map((P)=>P.workloadId));return a.workloads.filter((P)=>P.skipped&&!p.has(P.id))}function Pn(a){for(let b of a.comparisons??[]){let p=b.warnings?.find((P)=>P.code==="environment-mismatch");if(p)return p}return}function on(a){let b=new Map;for(let p of a.measurements){if(p.phase!=="memstats"||!p.memory)continue;let P=b.get(p.workloadId)??{warnings:[]};if(p.memory.bytesPerOp!==void 0)P.retained=p.memory.bytesPerOp;if(p.memory.peakBytes!==void 0)P.peak=p.memory.peakBytes;P.warnings.push(...p.warnings),b.set(p.workloadId,P)}return b}function et(a){return(a/1e6).toFixed(3)}function Sn(a){if(!a?.params)return"";return` (${Object.entries(a.params).map(([p,P])=>`${p}=${P}`).join(", ")})`}function Ge(a){return de(String(a))}function tr(a){let b;for(let p of a){let P=p?.params?Object.keys(p.params):void 0;if(P?.length!==2)return;if(b===void 0)b=P;else if(P.length!==b.length||P.some((S,ee)=>S!==b[ee]))return}return b}function rr(a){let b=[...a.values()],p=[{name:"Retained/op",cell:(P)=>P?.retained===void 0?"-":k(P.retained)},{name:"Peak mem",cell:(P)=>P?.peak===void 0?"-":k(P.peak)}].filter((P,S)=>b.some((ee)=>S===0?ee.retained!==void 0:ee.peak!==void 0));return{columns:p.map((P)=>P.name),cells:(P)=>p.map((S)=>S.cell(a.get(P)))}}var nt=10,tt=10,rt={name:"markdown",async render(a){let b=new Map(a.workloads.map((O)=>[O.id,O])),p=[];p.push("# Profile Report","");let P=a.git?` \xB7 ${v(a.git)}`:"";if(p.push(`Bun ${a.bunVersion} \xB7 ostia ${a.toolVersion} \xB7 ${a.platform.os}/${a.platform.arch} \xB7 ${a.createdAt}${P}`,""),a.environment)p.push(q(a.environment),"");let S=Pn(a);if(S)p.push(`> \u26A0 ${S.message}`,"");if(a.ab){let O=en(a);if(p.push("## A/B",""),p.push(wn(a.ab),""),O.length>0){p.push("| Task | Base | Candidate | Change | p25\u2026p75 | Verdict |","|---|---|---|---|---|---|");for(let we of O){let ue=b.get(we.workloadId),ge=we.paired,ce=M(Math.min(ge.baseMedianNs,we.timing.median)),Re=bn(ge);p.push(`| ${Ge(t(ue)+Sn(ue))} | ${n(ge.baseMedianNs,ce)} | ${n(we.timing.median,ce)} | ${qe(ge.medianRatio)} | ${qe(ge.p25)}\u2026${qe(ge.p75)} | ${Re?`**${Ge(Re)}**`:""} |`)}p.push("")}let me=kn(a);if(me.outputDiffers.length>0)p.push(`Output differs from the base: ${me.outputDiffers.map(Ge).join(", ")}`,"");if(me.baseOnly.length>0)p.push(`Base only: ${me.baseOnly.map(Ge).join(", ")}`,"");if(me.candOnly.length>0)p.push(`Candidate only: ${me.candOnly.map(Ge).join(", ")}`,"");for(let we of O){let ue=t(b.get(we.workloadId));for(let ge of we.warnings)p.push(`- **${ue}**: ${ge.message} (\`${ge.code}\`)`)}if(O.some((we)=>we.warnings.length>0))p.push("");p.push(`**${yn(a.ab)}**`,"")}let ee=rn(a),L=sn(a,ee),te=on(a);if(ee.length>0||L.length>0){p.push("## Timing","");let O=new Map,me=[];for(let ce of ee){let Re=b.get(ce.workloadId)?.entry?.group;if(Re===void 0){me.push(ce);continue}let Ie=O.get(Re);if(Ie)Ie.push(ce);else O.set(Re,[ce])}let we=new Map;for(let[ce,Re]of O){let Ie=tr(Re.map((Te)=>b.get(Te.workloadId)));if(Ie)we.set(ce,{keys:Ie,runs:Re});else me.push(...Re)}if(me.length>0||L.length>0){let ce=ee.map((Oe)=>({run:Oe,workload:b.get(Oe.workloadId)})),Re=ce.length>1,Ie=Re?tn(ce):void 0,Te=new Map(ce.map((Oe)=>[Oe.run.id,Ie?.get(Oe)??Oe.run.timing.median])),Be=Re?" Relative |":"",Fe=Re?"---|":"",De=me.some((Oe)=>T(Oe)),Ce=De?" User/Sys |":"",ve=De?"---|":"",$e=rr(te),Ne=$e.columns.map((Oe)=>` ${Oe} |`).join(""),Ue=$e.columns.map(()=>"---|").join("");p.push(`| Task | Median | Spread (p75\u2026p99) | Mean \xB1 SD | Range | MAD |${Ce}${Ne}${Be}`,`|---|---|---|---|---|---|${ve}${Ue}${Fe}`);for(let Oe of me){let Ae=b.get(Oe.workloadId),_e=Ge(t(Ae)+Sn(Ae)),Se=Oe.timing,Ee=M(Se.median),Ve=T(Oe),ze=De?` ${Ve?Y(Ve):"-"} |`:"",He=Re?` ${K(Se.median/(Te.get(Oe.id)??Se.median),!!Ae?.baseline)} |`:"",Ke=$e.cells(Oe.workloadId).map((We)=>` ${We} |`).join("");p.push(`| ${_e} | ${n(Se.median,Ee)} | ${n(Se.p75,Ee)}\u2026${n(Se.p99,Ee)} | ${n(Se.mean,Ee)} \xB1 ${n(Se.stddev,Ee)} | ${n(Se.min,Ee)}\u2026${n(Se.max,Ee)} | ${n(Se.mad,Ee)} |${ze}${Ke}${He}`)}for(let Oe of L){let Ae=Ge(t(Oe)+Sn(Oe)),_e=Re?" - |":"",Se=De?" - |":"",Ee=$e.columns.map(()=>" - |").join("");p.push(`| ${Ae} | - skipped | - | - | - | - |${Se}${Ee}${_e}`)}p.push("")}for(let[ce,{keys:Re,runs:Ie}]of we){let[Te,Be]=Re,Fe=[],De=[],Ce=new Map;for(let ve of Ie){let $e=b.get(ve.workloadId).params,Ne=$e[Te],Ue=$e[Be];if(!Fe.includes(Ne))Fe.push(Ne);if(!De.includes(Ue))De.push(Ue);Ce.set(`${Ne}\x00${Ue}`,ve)}p.push(`### ${Ge(ce)} (${Ge(Te)} \xD7 ${Ge(Be)})`,""),p.push(`| ${Ge(Te)} \\ ${Ge(Be)} | ${De.map(Ge).join(" | ")} |`,`|---|${De.map(()=>"---").join("|")}|`);for(let ve of Fe){let $e=De.map((Ne)=>{let Ue=Ce.get(`${ve}\x00${Ne}`);return Ue?n(Ue.timing.median):"-"});p.push(`| ${Ge(ve)} | ${$e.join(" | ")} |`)}p.push("")}let ue=(ce)=>{let Re=te.get(ce.workloadId)?.warnings;return Re?.length?[...ce.warnings,...Re]:ce.warnings},ge=ee.filter((ce)=>ue(ce).length>0);if(ge.length>0){p.push("### Warnings","");for(let ce of ge){let Re=t(b.get(ce.workloadId));for(let Ie of ue(ce))p.push(`- **${Re}**: ${Ie.message} (\`${Ie.code}\`)`)}p.push("")}}for(let O of a.measurements){if(O.phase!=="cpu"&&O.phase!=="heap")continue;let me=t(b.get(O.workloadId));if(O.phase==="cpu"){if(p.push(`## CPU capture - ${me}`,""),p.push(`instrumented, diagnostic wall ${et(O.diagnosticWallNs??0)}ms`,""),O.cpu){p.push(`origin: \`${O.cpu.origin}\`, interval: ${O.cpu.samplingIntervalUs}\xB5s, samples: ${E(O.cpu)}`,""),p.push("| Self % | Self (ms) | Total (ms) | Frame |","|---|---|---|---|");let we=O.cpu.totals.reduce((ue,ge)=>ue+ge.selfUs,0)||1;for(let ue of O.cpu.totals.slice(0,nt)){let ge=O.cpu.frames[ue.frameIx],ce=(ue.selfUs/we*100).toFixed(1);p.push(`| ${ce}% | ${(ue.selfUs/1000).toFixed(2)} | ${(ue.totalUs/1000).toFixed(2)} | ${Ge(ge?.name||"(anonymous)")} |`)}if(p.push(""),O.jit){let ue=O.jit.tiers;p.push(`JIT tiers: LLInt ${ue.llint} \xB7 Baseline ${ue.baseline} \xB7 DFG ${ue.dfg} \xB7 FTL ${ue.ftl}`,"")}}}else if(p.push(`## Heap snapshot - ${me}`,""),p.push(`instrumented, diagnostic wall ${et(O.diagnosticWallNs??0)}ms`,""),O.heap){p.push(`${O.heap.objectCount??"?"} objects, ${((O.heap.heapSizeBytes??0)/1e6).toFixed(2)}MB`,""),p.push("| Count | Type |","|---|---|");for(let we of O.heap.typeCounts.slice(0,tt))p.push(`| ${we.count} | ${Ge(we.type)} |`);p.push("")}for(let we of O.artifacts)p.push(`- artifact: \`${we.path}\``);for(let we of O.warnings)p.push(`- ! ${we.message} (\`${we.code}\`)`);if(O.artifacts.length>0||O.warnings.length>0)p.push("")}if(a.comparisons&&a.comparisons.length>0){p.push("## Comparisons","");for(let O of a.comparisons){let me=a.measurements.find((ue)=>ue.id===O.candidateMeasurementId),we=t(me?b.get(me.workloadId):b.get(O.candidateMeasurementId));if(p.push(`### ${O.verdict==="pass"?"\u2713":"\u2717"} ${we}`,""),O.timing){let ue=O.timing.medianDeltaPct>0?"+":"",ge=O.timing.verdict==="unchanged"&&O.timing.pValue!==void 0&&O.timing.pValue>=O.thresholds.alpha?"~":"",ce=[];if(me?.timing)ce.push(`n=${me.timing.samples.length}`);if(O.timing.ci95)ce.push(`95% CI [${O.timing.ci95[0]>0?"+":""}${O.timing.ci95[0].toFixed(1)}%, ${O.timing.ci95[1]>0?"+":""}${O.timing.ci95[1].toFixed(1)}%]`);if(O.timing.pValue!==void 0)ce.push(`p=${O.timing.pValue.toFixed(4)}`);ce.push(`threshold ${O.thresholds.effectiveTimingPct.toFixed(1)}%`),p.push(`- timing: ${ge}${ue}${O.timing.medianDeltaPct.toFixed(1)}% median, ${ce.join(", ")} (**${O.timing.verdict}**)`)}for(let ue of O.frames?.slice(0,nt)??[]){if(Math.abs(ue.deltaPct)<F)continue;let ge=ue.deltaPct>0?"+":"";p.push(`- frame \`${Ge(ue.name)}\`: ${ge}${ue.deltaPct.toFixed(1)}% self-time (${(ue.baseSelfUs/1000).toFixed(2)}ms \u2192 ${(ue.candSelfUs/1000).toFixed(2)}ms)`)}for(let ue of O.heapTypes?.slice(0,tt)??[]){if(Math.abs(ue.deltaPct)<F)continue;let ge=ue.deltaPct>0?"+":"";p.push(`- heap \`${Ge(ue.type)}\`: ${ge}${ue.deltaPct.toFixed(1)}% count (${ue.baseCount} \u2192 ${ue.candCount})`)}for(let ue of O.warnings??[]){if(ue.code==="environment-mismatch")continue;p.push(`- ! ${ue.message} (\`${ue.code}\`)`)}p.push("")}}return{text:p.join(`
|
|
12
|
+
`)}}};var sr=15;function On(a){return`n${a}`}function ir(a,b,p){return`${(a||"(anonymous)").replace(/"/g,"'")} (self ${(b/1000).toFixed(2)}ms, total ${(p/1000).toFixed(2)}ms)`}function or(a,b,p,P){let S=[];if(P<=0)return S;for(let ee=0;ee<b;ee++){if(ee===p)continue;let L=a[ee];if(S.length===P&&L<=a[S[P-1]])continue;let te=S.length;while(te>0&&a[S[te-1]]<L)te--;if(S.splice(te,0,ee),S.length>P)S.pop()}return S}var st={name:"mermaid",async render(a,b={}){let p=b.topN??sr;return{files:Xe(a,b.measurementId).map((ee)=>{let L=ee.cpu,{nodes:te,frames:O}=L,me=nn(L),{selfUs:we,totalUs:ue}=Yn(L,me),{parentIx:ge}=me,ce=me.roots[0]??-1,Re=or(we,me.count,ce,p),Ie=new Set(ce!==-1?[ce]:[]),Te=[];for(let Fe of Re){Te.length=0;for(let De=Fe;De!==-1;De=ge[De])Te.push(De);for(let De=Te.length-1;De>=0;De--)Ie.add(Te[De])}let Be=["graph TD"];for(let Fe of Ie){let De=te[Fe].id;Be.push(` ${On(De)}["${ir(O[te[Fe].frameIx].name,we[Fe],ue[Fe])}"]`)}for(let Fe of Ie){let De=ge[Fe];if(De!==-1&&Ie.has(De))Be.push(` ${On(te[De].id)} --> ${On(te[Fe].id)}`)}return{path:`${ee.id}.mermaid.md`,content:`${Be.join(`
|
|
13
|
+
`)}
|
|
14
|
+
`}})}}};var w=1;function Le(a){return Number.isFinite(a)?Number(a.toPrecision(6)):a}function Dn(a,b){return a?.entry?.task??a?.label??a?.command?.join(" ")??b}function it(a,b){if(b?.entry?.group!==void 0)a.group=b.entry.group;if(b?.description!==void 0)a.description=b.description;if(b?.groupDescription!==void 0)a.groupDescription=b.groupDescription;if(b?.params!==void 0)a.params=b.params}function ot(a){if(!a?.timing)return;let b={medianPct:Le(a.timing.medianDeltaPct),meanPct:Le(a.timing.meanDeltaPct),verdict:a.timing.verdict,pass:a.verdict==="pass",effectiveTimingPct:Le(a.thresholds.effectiveTimingPct),matched:!0};if(a.timing.ci95)b.ci95=[Le(a.timing.ci95[0]),Le(a.timing.ci95[1])];if(a.timing.pValue!==void 0)b.pValue=Le(a.timing.pValue);return b}function ar(a,b,p,P){let S={event:"run",protocolVersion:w,schemaVersion:a.schemaVersion,workloadId:b.id,task:Dn(b,b.id),skipped:!0,batch:1,warnings:(p?.warnings??[]).map((L)=>L.data?{code:L.code,data:L.data}:{code:L.code})};if(it(S,b),P!==void 0)S.noiseFloorPct=Le(P);let ee=ot(p);if(ee)S.delta=ee;return S}function mr(a){let b=new Map(a.workloads.map((ue)=>[ue.id,ue])),p=a.environment?.noise.floorPct,P=rn(a).map((ue)=>({run:ue,workload:b.get(ue.workloadId)})),S=P.length>1?tn(P):void 0,ee=[...P,...en(a).map((ue)=>({run:ue,workload:b.get(ue.workloadId)}))],L=new Map((a.comparisons??[]).map((ue)=>[ue.candidateMeasurementId,ue])),te=on(a),O=new Map;for(let ue of a.measurements){if(ue.phase!=="cpu"||ue.warnings.length===0)continue;let ge=O.get(ue.workloadId)??[];O.set(ue.workloadId,[...ge,...ue.warnings])}let me=sn(a,ee.map((ue)=>ue.run)).map((ue)=>ar(a,ue,L.get(ue.id),p));return[...ee.map((ue)=>{let{run:ge,workload:ce}=ue,Re=ge.timing,Ie=L.get(ge.id),Te={event:"run",protocolVersion:w,schemaVersion:a.schemaVersion,workloadId:ge.workloadId,task:Dn(ce,ge.workloadId),unit:"ns",samples:Re.samples.length,batch:Re.batch??1,mean:Le(Re.mean),median:Le(Re.median),stddev:Le(Re.stddev),stddevPct:Le(Re.mean===0?0:Re.stddev/Re.mean*100),min:Le(Re.min),max:Le(Re.max),warnings:[...ge.warnings,...O.get(ge.workloadId)??[],...te.get(ge.workloadId)?.warnings??[],...Ie?.warnings??[]].map(($e)=>$e.data?{code:$e.code,data:$e.data}:{code:$e.code})};Te.p75=Le(Re.p75),Te.p99=Le(Re.p99),Te.mad=Le(Re.mad);let Be=T(ge);if(Be)Te.userNs=Le(Be.userNs),Te.systemNs=Le(Be.systemNs);let Fe=te.get(ge.workloadId);if(Fe?.retained!==void 0)Te.retainedBytesPerOp=Math.round(Fe.retained);if(Fe?.peak!==void 0)Te.peakBytes=Math.round(Fe.peak);it(Te,ce);let De=S?.get(ue);if(De!==void 0)Te.relative=Le(Re.median/De);if(ce?.baseline)Te.baseline=!0;if(p!==void 0)Te.noiseFloorPct=Le(p);let Ce=ot(Ie);if(Ce)Te.delta=Ce;let ve=ge.paired;if(ve)Te.paired={baseMedian:Le(ve.baseMedianNs),medianRatio:Le(ve.medianRatio),p25:Le(ve.p25),p75:Le(ve.p75),rounds:ve.rounds,verdict:ve.verdict,...ve.flagged&&{flagged:ve.flagged},...ve.confirmed!==void 0&&{confirmed:ve.confirmed},...ve.repeats&&{repeats:ve.repeats.map(($e)=>Le($e.medianRatio))},sameOutput:ve.sameOutput};return Te}),...me]}function ur(a){if(!a.unmatched)return[];let b=(p,P)=>({event:"unmatched",protocolVersion:w,workloadId:p.id,task:Dn(p,p.id),side:P});return[...a.unmatched.baseOnly.map((p)=>b(p,"base")),...a.unmatched.candOnly.map((p)=>b(p,"cand"))]}function cr(a,b){let p=b.command==="ab"&&a.ab?{...a.ab,effectiveTimingPct:a.ab.thresholdPct}:a.comparisonSummary,P=(b.unmatched?.baseOnly.length??0)+(b.unmatched?.candOnly.length??0),S={event:"summary",protocolVersion:w,command:b.command,matched:p?.matched??0,regressed:p?.regressed??0,improved:p?.improved??0,unchanged:p?.unchanged??0,unmatched:P,geomeanPct:p?.geomeanPct!==void 0?p.geomeanPct:null,effectiveTimingPct:Le(p?.effectiveTimingPct??0),verdict:b.exitCode===0?"pass":"fail",exitCode:b.exitCode};if(b.command==="ci"){if(S.cached=b.cached??0,S.executed=b.executed??0,S.failed=b.failed??0,S.missingBaseline=b.missingBaseline??0,b.baseline)S.baseline=b.baseline}if(b.command==="ab"&&a.ab)S.base=a.ab.base,S.geomeanThresholdPct=a.ab.geomeanThresholdPct,S.unconfirmed=a.ab.unconfirmed,S.outputDiffers=a.ab.outputDiffers;if(a.environment)S.noiseFloorPct=Le(a.environment.noise.floorPct);if(b.baseGit||b.candGit)S.git={...b.baseGit&&{base:b.baseGit},...b.candGit&&{cand:b.candGit}};if(b.exportedTo)S.exportedTo=b.exportedTo;return S}var at={name:"minimal",async render(a,b={}){let p=[...mr(a)];if(b.protocol)p.push(...ur(b.protocol)),p.push(cr(a,b.protocol));let P=p.map((S)=>JSON.stringify(S));return{text:P.length>0?`${P.join(`
|
|
15
|
+
`)}
|
|
16
|
+
`:""}}};var dr="https://www.speedscope.app/file-format-schema.json";function mt(a){return a?.label??a?.command?.join(" ")??a?.entry?.task??"profile"}var ut={name:"speedscope",async render(a,b={}){let p=Xe(a,b.measurementId),P=new Map(a.workloads.map((ee)=>[ee.id,ee]));return{files:p.map((ee)=>{let L=ee.cpu,{nodes:te}=L,O=nn(L),me=L.samples?.nodeIds??[],we=L.samples?.timeDeltasUs??[],ue=Array(O.count);for(let Ie of O.order){let Te=O.parentIx[Ie],Be=te[Ie].frameIx;ue[Ie]=Te===-1?[Be]:[...ue[Te],Be]}let ge=Array(me.length);for(let Ie=0;Ie<me.length;Ie++){let Te=O.indexOf(me[Ie]);ge[Ie]=Te===-1?[]:ue[Te]}let ce=0;for(let Ie=0;Ie<we.length;Ie++)ce+=we[Ie];let Re={$schema:dr,exporter:"ostia",name:mt(P.get(ee.workloadId)),activeProfileIndex:0,shared:{frames:L.frames.map((Ie)=>({name:Ie.name||"(anonymous)",file:Ie.url,line:Ie.line!==void 0?Ie.line+1:void 0}))},profiles:[{type:"sampled",name:mt(P.get(ee.workloadId)),unit:"microseconds",startValue:0,endValue:ce,samples:ge,weights:we}]};return{path:`${ee.id}.speedscope.json`,content:`${JSON.stringify(Re,null,2)}
|
|
17
|
+
`}})}}};function lr(a){return(a/1e6).toFixed(3)}var dt={name:"table",async render(a){let b=rn(a),p=new Map(a.workloads.map((We)=>[We.id,We])),P=a.environment?[q(a.environment),""]:[];if(a.ab)return{text:pr(a,en(a),P)};let S=sn(a,b);if(b.length===0&&S.length===0){let We=ct(a,p);return{text:We.length>0?`${[...P,...We].join(`
|
|
18
|
+
`)}
|
|
19
|
+
`:`(no timing runs)
|
|
20
|
+
`}}let ee=new Map(b.map((We)=>[We.workloadId,We])),L=[],te=[];for(let We of a.workloads){let je=ee.get(We.id),Ye=t(We);if(je){let an={kind:"measured",run:je,workload:We,label:Ye};L.push(an),te.push(an)}else if(We.skipped)L.push({kind:"skipped",workload:We,label:Ye})}let O=on(a),me=!1,we=!1;for(let We of O.values()){if(We.retained!==void 0)me=!0;if(We.peak!==void 0)we=!0}let ue=(We)=>{let je=O.get(We.workloadId)?.warnings;return je?.length?[...We.warnings,...je]:We.warnings},ge=new Map(te.map((We)=>[We,T(We.run)])),ce=[...ge.values()].some(Boolean),Re=te.length>1,Ie=tn(te),Te=new Map,Be=new Map,Fe;for(let We of L){let je=dn(We.workload);if(je!==Fe){if(je!==void 0)Be.set(We,je);Fe=je}Te.set(We,je!==void 0?" ":"")}let De=Math.max(4,...L.map((We)=>Te.get(We).length+We.label.length)),Ce=10,ve=18,$e=18,Ne=11,Ue=10,Oe=18,Ae=[...P],_e=me?` ${"Retained/op".padEnd(Ne)}`:"",Se=we?` ${"Peak mem".padEnd(Ue)}`:"",Ee=ce?` ${"User/Sys".padEnd(Oe)}`:"",Ve=`${"Task".padEnd(De)} ${"Median".padEnd(Ce)} ${"Spread".padEnd(ve)} ${"Range".padEnd($e)}${Ee}${_e}${Se}${Re?" Relative":""}`;Ae.push(Ve),Ae.push("-".repeat(Ve.length));let ze=[];for(let We of L){let je=Be.get(We);if(je!==void 0)Ae.push(`${je}:`);let Ye=Te.get(We);if(We.kind==="skipped"){Ae.push(`${(Ye+We.label).padEnd(De)} - skipped`);continue}let{run:an,label:ht,workload:$n}=We,Qe=an.timing,mn=M(Qe.median),bt=n(Qe.median,mn),wt=`${n(Qe.p75,mn)}\u2026${n(Qe.p99,mn)}`,yt=`${n(Qe.min,mn)}\u2026${n(Qe.max,mn)}`,un=`${(Ye+ht).padEnd(De)} ${bt.padEnd(Ce)} ${wt.padEnd(ve)} ${yt.padEnd($e)}`;if(ce){let Je=ge.get(We);un+=` ${(Je?Y(Je):"").padEnd(Oe)}`}let En=$n?O.get($n.id):void 0;if(me){let Je=En?.retained,xn=Je!==void 0?k(Je):"";un+=` ${xn.padEnd(Ne)}`}if(we){let Je=En?.peak,xn=Je!==void 0?k(Je):"";un+=` ${xn.padEnd(Ue)}`}if(Re){let Je=Qe.median/(Ie.get(We)??Qe.median);un+=` ${K(Je,!!$n?.baseline)}`}Ae.push(un);let Wn=ue(an);if(Wn.length>0)Ae.push(`${" ".repeat(Ye.length)} ! ${Wn.map((Je)=>Je.code).join(", ")}`),ze.push(We)}if(ze.length>0){Ae.push(""),Ae.push("Warnings:");for(let We of ze)for(let je of ue(We.run))Ae.push(` ${We.label}: ${je.message}`)}let He=fr(a,p);if(He.length>0)Ae.push(""),Ae.push(...He);let Ke=ct(a,p);if(Ke.length>0)Ae.push(""),Ae.push(...Ke);return{text:`${Ae.map((We)=>We.trimEnd()).join(`
|
|
21
|
+
`)}
|
|
22
|
+
`}}};function pr(a,b,p){let P=new Map(a.workloads.map((O)=>[O.id,O])),S=[...p];if(a.ab)S.push(`A/B: ${wn(a.ab)}`,"");let ee=b.map((O)=>{let me=P.get(O.workloadId),we=O.paired,ue=M(Math.min(we.baseMedianNs,O.timing.median));return{run:O,group:dn(me),label:t(me),cells:[n(we.baseMedianNs,ue),n(O.timing.median,ue),qe(we.medianRatio),`${qe(we.p25)}\u2026${qe(we.p75)}`],verdict:bn(we)}});if(ee.length>0){let O=Math.max(4,...ee.map((ge)=>(ge.group!==void 0?2:0)+ge.label.length)),me=[10,10,9,18],we=`${"Task".padEnd(O)} ${["Base","Candidate","Change","p25\u2026p75"].map((ge,ce)=>ge.padEnd(me[ce])).join(" ")} Verdict`;S.push(we,"-".repeat(we.length));let ue;for(let ge of ee){if(ge.group!==ue&&ge.group!==void 0)S.push(`${ge.group}:`);ue=ge.group;let ce=ge.group!==void 0?" ":"";if(S.push(`${(ce+ge.label).padEnd(O)} ${ge.cells.map((Re,Ie)=>Re.padEnd(me[Ie])).join(" ")} ${ge.verdict}`),ge.run.warnings.length>0)S.push(`${ce} ! ${ge.run.warnings.map((Re)=>Re.code).join(", ")}`)}}let L=kn(a);if(L.outputDiffers.length>0){S.push("",`Output differs from the base (${L.outputDiffers.length}):`);for(let O of L.outputDiffers)S.push(` ${O}`)}if(L.baseOnly.length>0||L.candOnly.length>0){if(S.push("","Unmatched:"),L.baseOnly.length>0)S.push(` base only: ${L.baseOnly.join(", ")}`);if(L.candOnly.length>0)S.push(` candidate only: ${L.candOnly.join(", ")}`)}let te=ee.filter((O)=>O.run.warnings.length>0);if(te.length>0){S.push("","Warnings:");for(let O of te)for(let me of O.run.warnings)S.push(` ${O.label}: ${me.message}`)}if(a.ab)S.push("",yn(a.ab));return`${S.map((O)=>O.trimEnd()).join(`
|
|
23
|
+
`)}
|
|
24
|
+
`}function ct(a,b){if(!a.comparisons||a.comparisons.length===0)return[];let p=[],P=new Map(a.measurements.map((L)=>[L.id,L])),S=Pn(a);if(S)p.push(`\u26A0 ${S.message}`,"");let ee=[];for(let L of a.comparisons){let te=P.get(L.candidateMeasurementId),O=b.get(te?.workloadId??L.candidateMeasurementId),me=O?t(O):L.candidateMeasurementId,we=L.verdict==="pass"?"\u2713":"\u2717";if(p.push(`${we} ${me}`),L.timing){let ge=(ce)=>`${ce>=0?"+":""}${ce.toFixed(1)}%`;if(L.timing.ci95&&L.timing.pValue!==void 0){let ce=L.timing.pValue<0.001?"p<0.001":`p=${L.timing.pValue.toFixed(3)}`;p.push(` timing: ${ge(L.timing.medianDeltaPct)} median, 95% CI [${ge(L.timing.ci95[0])}, ${ge(L.timing.ci95[1])}], ${ce} (${L.timing.verdict})`)}else p.push(` timing: ${ge(L.timing.medianDeltaPct)} median (${L.timing.verdict})`)}if(L.frames)for(let ge of L.frames.slice(0,lt)){if(Math.abs(ge.deltaPct)<F)continue;let ce=ge.deltaPct>0?"+":"";p.push(` frame ${ge.name}: ${ce}${ge.deltaPct.toFixed(1)}% self-time (${(ge.baseSelfUs/1000).toFixed(2)}ms -> ${(ge.candSelfUs/1000).toFixed(2)}ms)`)}if(L.heapTypes)for(let ge of L.heapTypes.slice(0,pt)){if(Math.abs(ge.deltaPct)<F)continue;let ce=ge.deltaPct>0?"+":"";p.push(` heap ${ge.type}: ${ce}${ge.deltaPct.toFixed(1)}% count (${ge.baseCount} -> ${ge.candCount})`)}let ue=(L.warnings??[]).filter((ge)=>ge.code!=="environment-mismatch");if(ue.length>0){p.push(` ! ${ue.map((ge)=>ge.code).join(", ")}`);for(let ge of ue)ee.push({label:me,message:ge.message})}}if(ee.length>0){p.push("","Comparison warnings:");for(let L of ee)p.push(` ${L.label}: ${L.message}`)}return p}var lt=5,pt=5;function fr(a,b){let p=[];for(let P of a.measurements){if(P.phase!=="cpu"&&P.phase!=="heap")continue;let S=b.get(P.workloadId),ee=S?t(S):P.workloadId;if(P.phase==="cpu")if(P.cpu){p.push(`CPU capture - ${ee} (instrumented, ${P.cpu.samplingIntervalUs}\xB5s interval, ${E(P.cpu)} samples, diagnostic wall ${lr(P.diagnosticWallNs??0)}ms)`);let L=P.cpu.totals.reduce((te,O)=>te+O.selfUs,0)||1;for(let te of P.cpu.totals.slice(0,lt)){let O=P.cpu.frames[te.frameIx],me=(te.selfUs/L*100).toFixed(1);p.push(` ${me.padStart(5)}% ${(te.selfUs/1000).toFixed(2).padStart(8)}ms self ${O?.name??"?"}`)}}else p.push(`CPU capture - ${ee} (instrumented, no evidence captured)`);else if(P.heap){let L=((P.heap.heapSizeBytes??0)/1e6).toFixed(2);p.push(`Heap snapshot - ${ee} (instrumented, ${P.heap.objectCount??"?"} objects, ${L}MB)`);for(let te of P.heap.typeCounts.slice(0,pt))p.push(` ${String(te.count).padStart(6)} ${te.type}`)}else p.push(`Heap snapshot - ${ee} (instrumented, no evidence captured)`);for(let L of P.artifacts)p.push(` artifact: ${L.path}`);for(let L of P.warnings)p.push(` ! ${L.message}`)}return p}var d={table:dt,json:Xn,markdown:rt,jsonl:Zn,minimal:at,collapsed:qn,mermaid:st,speedscope:ut,cpuprofile:Qn};async function ye(a={}){let b=y();if(b.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let p=Bun.main,P;try{P=x(b,a.filter,p)}catch(ee){throw Error(`run(): ${ee.message}`)}let S=await j(p,P,a);if(!a.quiet){let ee=a.format??"table",{text:L}=await d[ee].render(S,{});if(L)process.stdout.write(L)}return S}function xe(a,b){let p=Object.keys(a),P=(S,ee)=>{if(S===p.length){be(ee,()=>b(ee));return}let L=p[S];for(let te of a[L])P(S+1,{...ee,[L]:te})};P(0,{})}function Pe(a){return a}var Nn=1000;async function ae(a){if(hn("time",a),a.warmup!==void 0&&(!Number.isFinite(a.warmup)||a.warmup<0))throw RangeError(`time: warmup must be >= 0, got ${a.warmup}`);let b=i({samples:a.samples??null,budgetMs:a.budgetMs??null,minSamples:a.minSamples??null,warmup:a.warmup??null,cpu:a.cpu??!1,heap:a.heap??!1,cpuIntervalUs:a.cpuIntervalUs??Nn}),P=`${a.outDir??Ze}/artifacts`,S=a.noiseCheck===!1?void 0:u(),ee=S?m(S):void 0,L=[],te=[],O=a.commands.map((ce)=>{let Re=typeof ce==="string"||Array.isArray(ce)?{command:ce}:ce,Ie=Array.isArray(Re.command)?Re.command:R(Re.command),Te=Re.prepare??a.prepare,Be=Re.timeSource??a.timeSource,Fe=Re.timeoutMs??a.timeoutMs,De=Re.ignoreExitCodes??a.ignoreExitCodes,Ce=_(Ie,Re.label??(Array.isArray(Re.command)?void 0:Re.command),{prepare:Te,timeSource:Be});return{argv:Ie,workload:Ce,prepare:Te,timeSource:Be,timeoutMs:Fe,ignoreExitCodes:De}}),me=(a.interleave??!0)&&O.length>1,we=(ce)=>({argv:ce.argv,cwd:a.cwd,env:a.env,samples:a.samples,budgetMs:a.budgetMs,minSamples:a.minSamples,warmup:a.warmup,prepare:ce.prepare,timeSource:ce.timeSource,timeoutMs:ce.timeoutMs,ignoreExitCodes:ce.ignoreExitCodes,signal:a.signal}),ue=O.map((ce)=>vn(we(ce))),ge=async(ce)=>{let{argv:Re,workload:Ie,prepare:Te}=O[ce];L.push(Ie);let Be=ue[ce].result(),Fe=C({workload:Ie,configFingerprint:b,trials:Be.trials,timing:Be.timing,warnings:ee&&te.length===0?[...Be.warnings,ee]:Be.warnings,interleaved:me?!0:void 0});if(te.push(Fe),!a.signal?.aborted)te.push(...await gr({workload:Ie,argv:Re,timingMeasurementId:Fe.id,cfgFp:b,opts:a,artifactDir:P,prepare:Te}))};if(me){for(let Re of ue)await Re.warmup();let ce=!0;while(ce){ce=!1;for(let Re of ue)if(await Re.step())ce=!0}for(let Re=0;Re<O.length;Re++)await ge(Re)}else for(let ce=0;ce<O.length;ce++)await Cn(ue[ce]),await ge(ce);if(a.signal?.aborted&&te.length>0){let ce=te[te.length-1];ce.warnings=[...ce.warnings,gt()]}return s(L,te,S)}function gt(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function gr({workload:a,argv:b,timingMeasurementId:p,cfgFp:P,opts:S,artifactDir:ee,prepare:L}){let te=[],O=async(me)=>{if(L)await Q(L,{phase:me,index:0},{cwd:S.cwd,env:S.env})};if(S.cpu){await O("cpu");let me=`${p}-cpu.cpuprofile`,we=await Fn({argv:b,cwd:S.cwd,env:S.env,artifactDir:ee,fileName:me,intervalUs:S.cpuIntervalUs??Nn});te.push(await ft({workload:a,phase:"cpu",configFingerprint:P,diagnosticWallNs:we.diagnosticWallNs,exitCode:we.exitCode,cpu:we.cpu,artifactPath:we.artifactPath,artifactKind:"cpuprofile",warnings:we.warnings}))}if(S.heap){await O("heap");let me=`${p}-heap.heapsnapshot`,we=await An({argv:b,cwd:S.cwd,env:S.env,artifactDir:ee,fileName:me});te.push(await ft({workload:a,phase:"heap",configFingerprint:P,diagnosticWallNs:we.diagnosticWallNs,exitCode:we.exitCode,heap:we.heap,artifactPath:we.artifactPath,artifactKind:"heapsnapshot",warnings:we.warnings}))}return te}async function ft(a){let b=`${a.workload.id}-${a.phase}-${a.configFingerprint}`,p=a.artifactPath?[await he(b,a.artifactKind,a.artifactPath)]:[];return h({workload:a.workload,phase:a.phase,configFingerprint:a.configFingerprint,diagnosticWallNs:a.diagnosticWallNs,exitCode:a.exitCode,cpu:a.cpu,heap:a.heap,warnings:a.warnings,artifacts:p})}async function Me(a,b={}){let p=fe(a),P=i({intervalUs:b.intervalUs??Nn,origin:b.origin??"inspector"}),S=(te)=>te.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];if(b.signal?.aborted){let te=Bun.nanoseconds(),O=await a(),me=h({workload:p,phase:"cpu",configFingerprint:P,diagnosticWallNs:Bun.nanoseconds()-te,warnings:[gt()],artifacts:[]});return{result:O,measurement:me,document:s([p],[me])}}let ee=b.origin==="jsc"?await ne(a,b):{...await Un(a,b),jit:void 0},L=h({workload:p,phase:"cpu",configFingerprint:P,diagnosticWallNs:ee.diagnosticWallNs,cpu:ee.cpu,jit:ee.jit,warnings:S(ee.cpu),artifacts:[]});return{result:ee.result,measurement:L,document:s([p],[L])}}
|
|
25
|
+
export{f,re,se,H,N,W,l,oe,A,G,V,le,J,ie,U,z,D,ke,w,d,ye,xe,Pe,ae,Me};
|
package/cli.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{e,
|
|
4
|
-
`)}var $e=600000;class me extends Error{path;constructor(
|
|
3
|
+
import{e,v,t,R,S,s,_,C,i,I,ee,a,O,o,u,m}from"./chunk-cqy5fzae.js";import{f,re,se,H,N,W,l,oe,A,G,V,le,J,ie,U,z,D,w,d,ae}from"./chunk-t6q9jbb6.js";import{resolve as Ue}from"path";function ve(r){return e("cache",r.workloadId,r.phase,r.configFingerprint,r.bunVersion,r.toolVersion,r.instrumented,r.inputsDigest??null)}async function ye(r,n=process.cwd()){if(r.length===0)return;let c=await V(r,n),p=await Promise.all(c.map(async(h)=>{let g=await Bun.file(Ue(n,h)).arrayBuffer();return{path:h,sha256:Bun.CryptoHasher.hash("sha256",g,"hex")}}));return e("inputs",p)}function Ce(r,n){return`${r}/cache/${n}.json`}async function xe(r,n){let c=Bun.file(Ce(r,n));if(!await c.exists())return;return await c.json()}async function Pe(r,n,c){await Bun.write(Ce(r,n),`${JSON.stringify(c,null,2)}
|
|
4
|
+
`)}var $e=600000;class me extends Error{path;constructor(r){super(`No baseline document at ${r}. Create one with: ostia baseline save ${r.split("/").pop().replace(/\.json$/,"")}`);this.path=r}}class de extends Error{path;missing;total;constructor(r,n,c){super(`${n} of ${c} configured workload(s) have no matching row in baseline ${r} (by workload id). Re-seed with: ostia baseline save`);this.path=r;this.missing=n;this.total=c}}function qe(r,n,c){if(r)return r;return n===c?"fail":"warn"}async function ge(r,n){let c=r.noiseCheck===!1?void 0:u(),p=c?m(c):void 0,h=[];for(let g of r.workloads){if(g.suites){let F=await U(g.suites,process.cwd()),K=await z({suites:F,preload:[],bunFlags:[],noiseCheck:!1},r.bench),Z=await D({...K,outDir:K.outDir??r.outDir,timeoutMs:K.timeoutMs??$e});for(let X of Z.workloads){let E=Z.measurements.find((te)=>te.workloadId===X.id&&te.phase==="timing");if(!E)continue;if(p)E.warnings.push(p);h.push({workload:X,status:"executed",run:E,harnessFailed:!1})}continue}let x=_(g.command,g.label,{prepare:g.prepare,timeSource:g.timeSource}),b=await ye(g.inputs??[]),k=i({samples:r.samples??null,budgetMs:r.budgetMs??null,minSamples:r.minSamples??null,warmup:r.warmup}),q=g.inputs!==void 0&&typeof g.prepare!=="function",j=ve({workloadId:x.id,phase:"timing",configFingerprint:k,bunVersion:Bun.version,toolVersion:S,instrumented:!1,inputsDigest:b}),M=n||!q?void 0:await xe(r.outDir,j),P,y;if(M)P=M,y="cached";else{let F=await le({argv:g.command,samples:r.samples,budgetMs:r.budgetMs,minSamples:r.minSamples,warmup:r.warmup,prepare:g.prepare,timeSource:g.timeSource,timeoutMs:g.timeoutMs??$e,ignoreExitCodes:g.ignoreExitCodes});if(P=C({workload:x,configFingerprint:k,trials:F.trials,timing:F.timing,warnings:p?[...F.warnings,p]:F.warnings}),q)await Pe(r.outDir,j,P);y="executed"}h.push({workload:x,status:y,run:P,harnessFailed:J(P,g.ignoreExitCodes)})}return{results:h,environment:c}}async function Ae(r){let{config:n}=r,c=l(n,r.baselineName);if(!await Bun.file(c).exists())throw new me(c);let h=await o(c),{results:g,environment:x}=await ge(n,r.full),b=g.map((E)=>({...E})),k=b.filter((E)=>E.status==="executed").length,q=b.length-k,j=b.filter((E)=>E.harnessFailed).length,M=s(b.map((E)=>E.workload),b.map((E)=>E.run),x),P=0,y=0,F=0,K=re(h,M,n.thresholds);for(let E of b){let te=K.compare(E.workload.id);if(!te){F++;continue}if(E.comparison=te,te.verdict==="pass")P++;else y++}if(F>0){if(qe(n.onMissingBaseline,F,b.length)==="fail")throw new de(c,F,b.length)}let Z=b.map((E)=>E.comparison).filter((E)=>E!==void 0);M.comparisons=Z;let X=K.unmatched();return M.unmatched={baseOnly:X.baseOnly.map((E)=>E.id),candOnly:X.candOnly.map((E)=>E.id)},M.comparisonSummary=se(Z,K.effectiveTimingPct),{document:M,summary:{total:b.length,cached:q,executed:k,passed:P,regressed:y,missingBaseline:F,failed:j,results:b,unmatched:X},baseline:h}}function Me(r){let n=[];if(n.push(`${r.total} workloads`),n.push(`${r.cached} cached`),n.push(`${r.executed} executed`),r.missingBaseline>0)n.push(`${r.missingBaseline} skipped (no matching baseline workload)`);if(r.failed>0){let p=r.results.filter((h)=>h.harnessFailed).map((h)=>t(h.workload));n.push(`${r.failed} failed (harness error, a command exited non-zero or produced no samples: ${p.join(", ")})`)}let c=r.results.filter((p)=>p.comparison?.verdict==="fail").map((p)=>{let h=p.comparison.timing,g=t(p.workload);return h?`${h.medianDeltaPct>0?"+":""}${h.medianDeltaPct.toFixed(1)}% median on ${g}`:g});return n.push(`${r.passed} passed ${r.regressed} regressed${c.length>0?` (${c.join(", ")})`:""}`),n.push(""),n.push(`Profile CI: ${r.regressed>0||r.failed>0?"\u2717":"\u2713"}`),`${n.join(`
|
|
5
5
|
`)}
|
|
6
|
-
`}async function Se(
|
|
6
|
+
`}async function Se(r,n){let{results:c,environment:p}=await ge(r,!1),h=s(c.map((x)=>x.workload),c.map((x)=>x.run),p),g=l(r,n);return await a(h,g),g}async function Fe(r){let n=[];try{let p=new Bun.Glob("*.json");for await(let h of p.scan({cwd:r.baselineDir,absolute:!1}))n.push(h.replace(/\.json$/,""))}catch{return[]}return n.sort(),(await Promise.all(n.map(async(p)=>{let h=l(r,p);try{let g=await o(h);return{name:p,path:h,createdAt:g.createdAt,toolVersion:g.toolVersion,bunVersion:g.bunVersion,workloads:g.workloads.length,...g.git!==void 0&&{git:g.git}}}catch{return}}))).filter((p)=>p!==void 0)}function Y(r){return r instanceof Error?r.message:String(r)}var B=(r)=>Bun.write(Bun.stdout,r),Te=(r)=>Bun.write(Bun.stderr,r);class Q extends Error{}var Ie=[],Ee=new Set(["minimal","json","jsonl"]);async function Le(r){let{isatty:n}=await import("tty");if(!n(2))return!0;return r.some((c,p)=>c==="--format"&&Ee.has(r[p+1]??"")||c.startsWith("--format=")&&Ee.has(c.slice(9)))}async function T(r,n,c){if(await Te(n.endsWith(`
|
|
7
7
|
`)?n:`${n}
|
|
8
|
-
`),!await Le(Ie))return;await Te(`${JSON.stringify({event:"error",protocolVersion:
|
|
9
|
-
`)[0],...
|
|
10
|
-
`)}async function
|
|
11
|
-
Run 'ostia ${n} --help'.`),2}function Ge(
|
|
12
|
-
`;function Ne(
|
|
13
|
-
`)}else if(
|
|
14
|
-
${
|
|
8
|
+
`),!await Le(Ie))return;await Te(`${JSON.stringify({event:"error",protocolVersion:w,code:r,message:n.split(`
|
|
9
|
+
`)[0],...c&&{data:c}})}
|
|
10
|
+
`)}async function L(r,n){return await B(r),n?0:2}async function Je(r,n){return await T("invalid-flag",`${r.message}
|
|
11
|
+
Run 'ostia ${n} --help'.`),2}function Ge(r,n,c={}){if(c.allowAuto&&n==="auto")return ie();let p=c.min??1,h=Number(n);if(!Number.isInteger(h)||h<p)throw new Q(`Invalid ${r} "${n}": expected an integer \u2265 ${p}${c.allowAuto?' (or "auto")':""}`);return h}var Ve=["ns","us","ms","s"],ne=["table","json","jsonl","markdown","minimal"],we=["collapsed","mermaid","speedscope","cpuprofile"],ze=[...ne,...we],be=`No CPU evidence in this document; rerun with --cpu (ostia time) or --cpu (ostia bench)
|
|
12
|
+
`;function Ne(r){return r.measurements.some((n)=>n.phase==="cpu")}async function pe(r,n,c={}){if(n.format==="json"&&n.exportJson){let p=I(r);if(await ee(p,n.exportJson),!n.quiet)await B(p);return 0}if(n.exportJson)await a(r,n.exportJson);if(n.quiet)return 0;if(we.includes(n.format)&&!Ne(r))return await T("no-cpu-evidence",be),2;return await ue(await d[n.format].render(r,c)),0}async function fe(r){let n=await W();if(!n){await T("config-missing",r?`No ostia.config.json found. "${r}" needs configured workloads.`:"No ostia.config.json found.");return}if(r&&n.workloads.length===0){let c=await oe()??"ostia.config.json";await T("config-missing",`${c} has no "workloads" configured.`);return}return n}async function ue(r,n){if(r.text)await B(r.text);if(!r.files||r.files.length===0)return;if(n)for(let c of r.files){let p=c.path?`${n}/${c.path}`:n;await Bun.write(p,c.content),await B(`wrote ${p}
|
|
13
|
+
`)}else if(r.files.length===1)await B(r.files[0].content);else for(let c of r.files)await B(`--- ${c.path??"(unnamed)"} ---
|
|
14
|
+
${c.content}
|
|
15
15
|
`)}var Ke=`ostia time [flags] <command...>
|
|
16
16
|
ostia time [flags] -- <argv...>
|
|
17
17
|
|
|
@@ -48,7 +48,7 @@ Examples:
|
|
|
48
48
|
ostia time --prepare "rm -rf dist" "bun build.ts"
|
|
49
49
|
ostia time --time-source "built in (\\d+)ms" "bun build.ts"
|
|
50
50
|
ostia time -- bun -e "console.log('a b')"
|
|
51
|
-
`,Xe=Array.from({length:255},(
|
|
51
|
+
`,Xe=Array.from({length:255},(r,n)=>n+1),De=`ostia bench [flags] <suite.ts...>
|
|
52
52
|
|
|
53
53
|
Run in-process group()/task() suites, each file in its own child process. With no files,
|
|
54
54
|
uses ostia.config's "bench" section; each flag overrides its config field.
|
|
@@ -194,24 +194,24 @@ Examples:
|
|
|
194
194
|
ostia baseline list
|
|
195
195
|
ostia baseline show main
|
|
196
196
|
ostia baseline show main --format markdown
|
|
197
|
-
`;function ce(
|
|
198
|
-
`),
|
|
199
|
-
`);if(n.format==="table"&&
|
|
200
|
-
`)}let
|
|
197
|
+
`;function ce(r,n,c,p,h,g){let x=p;for(let b=0;b<r.length;b++){let k=r[b],q=g?.(k,b,p);if(q!==void 0){b=q;continue}let j=k.startsWith("--")?k.indexOf("="):-1,M=j>0?k.slice(0,j):k,P=c[M];if(!P||j>0&&P.spec.kind==="bool"){if(k.startsWith("-"))throw new Q(`Unknown flag "${k}" for "ostia ${n}".`);h(k,p);continue}let y=()=>j>0?k.slice(j+1):r[++b];switch(P.spec.kind){case"string":x[P.dest]=y();break;case"int":x[P.dest]=Ge(M,y(),P.spec);break;case"number":{let F=y(),K=Number(F);if(F===void 0||F===""||!Number.isFinite(K)||K<P.spec.min)throw new Q(`Invalid ${M} "${F}": expected a number \u2265 ${P.spec.min}`);x[P.dest]=K;break}case"bool":x[P.dest]=P.spec.value;break;case"list":x[P.dest].push(y()??"");break;case"enum":{let F=y();if(!P.spec.values.includes(F))throw new Q(`Invalid ${M} "${F}": expected one of: ${P.spec.values.join(", ")}`);x[P.dest]=F;break}}}return p}var Ye={"--samples":{dest:"samples",spec:{kind:"int",min:1}},"--budget":{dest:"budgetMs",spec:{kind:"int",min:1}},"--min-samples":{dest:"minSamples",spec:{kind:"int",min:1}},"--warmup":{dest:"warmup",spec:{kind:"int",min:0}},"--no-interleave":{dest:"interleave",spec:{kind:"bool",value:!1}},"--prepare":{dest:"prepare",spec:{kind:"list"}},"--time-source":{dest:"timeSource",spec:{kind:"string"}},"--time-unit":{dest:"timeUnit",spec:{kind:"enum",values:Ve}},"--cpu":{dest:"cpu",spec:{kind:"bool",value:!0}},"--heap":{dest:"heap",spec:{kind:"bool",value:!0}},"--cpu-interval":{dest:"cpuIntervalUs",spec:{kind:"int",min:1}},"--timeout":{dest:"timeoutMs",spec:{kind:"int",min:1}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--no-noise-check":{dest:"noiseCheck",spec:{kind:"bool",value:!1}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"enum",values:ne}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function et(r){return ce(r,"time",Ye,{commands:[],prepare:[],interleave:!0,cpu:!1,heap:!1,ignoreExitCodes:[],noiseCheck:!0,format:"table",quiet:!1,help:!1},(c,p)=>p.commands.push(c),(c,p,h)=>{if(c==="--")return h.argvCommand=r.slice(p+1),r.length;if(c==="--ignore-failure"||c.startsWith("--ignore-failure=")){let g=c.startsWith("--ignore-failure=")?c.slice(17):void 0;return h.ignoreExitCodes.push(...g===void 0?Xe:g.split(",").map(Number)),p}return})}async function ke(r){let n=new AbortController,c=()=>n.abort();process.on("SIGINT",c);try{return{result:await r(n.signal),aborted:n.signal.aborted}}finally{process.off("SIGINT",c)}}async function tt(r){let n=et(r),c=(n.argvCommand?.length??0)>0;if(n.help||n.commands.length===0&&!c)return L(Ke,n.help);let p=n.commands.length+(c?1:0);if(n.prepare.length>1&&n.prepare.length!==p)return await T("invalid-flag",`--prepare given ${n.prepare.length} times for ${p} command(s): give it once (applies to all) or once per command.`),2;if(n.timeSource!==void 0)try{new RegExp(n.timeSource)}catch(y){return await T("invalid-flag",`Invalid --time-source regex: ${Y(y)}`),2}let h=n.timeSource!==void 0?{pattern:n.timeSource,unit:n.timeUnit}:void 0,g=(y)=>n.prepare.length===1?n.prepare[0]:n.prepare[y],x=n.commands.map((y,F)=>({command:y,prepare:g(F)}));if(c)x.push({command:n.argvCommand,prepare:g(n.commands.length)});let b,k;try{({result:b,aborted:k}=await ke((y)=>ae({commands:x,timeSource:h,samples:n.samples,budgetMs:n.budgetMs,minSamples:n.minSamples,warmup:n.warmup,interleave:n.interleave,cpu:n.cpu,heap:n.heap,cpuIntervalUs:n.cpuIntervalUs,timeoutMs:n.timeoutMs,ignoreExitCodes:n.ignoreExitCodes,outDir:n.outDir,noiseCheck:n.noiseCheck,signal:y})))}catch(y){return await T("spawn-failed",`Run failed: ${Y(y)}`),2}let q=await pe(b,n);if(q!==0)return q;if(k)return 130;let j=b.workloads.map((y)=>b.measurements.find((F)=>F.workloadId===y.id&&F.phase==="timing")??{trials:[],timing:void 0}),M=j.some((y)=>!y.timing),P=j.some((y)=>y.timing&&J(y,n.ignoreExitCodes));if(P||M){let y=b.measurements.some((Z)=>Z.warnings.some((X)=>X.code==="timeout")),F=b.measurements.some((Z)=>Z.warnings.some((X)=>X.code==="time-source-no-match"));return await T(P?"command-failed":y?"timeout":F?"time-source-no-match":"command-failed","One or more commands failed to produce a clean measurement; see the report above for details."),2}return 0}var nt={"--budget":{dest:"budgetMs",spec:{kind:"int",min:1}},"--samples":{dest:"samples",spec:{kind:"int",min:1}},"--min-samples":{dest:"minSamples",spec:{kind:"int",min:1}},"--jobs":{dest:"jobs",spec:{kind:"int",min:1,allowAuto:!0}},"--gc":{dest:"gc",spec:{kind:"bool",value:!0}},"--no-gc":{dest:"gc",spec:{kind:"bool",value:!1}},"--cpu":{dest:"cpu",spec:{kind:"bool",value:!0}},"--no-cpu":{dest:"cpu",spec:{kind:"bool",value:!1}},"--cpu-interval":{dest:"cpuIntervalUs",spec:{kind:"int",min:1}},"--alloc":{dest:"alloc",spec:{kind:"bool",value:!0}},"--no-alloc":{dest:"alloc",spec:{kind:"bool",value:!1}},"--peak-mem":{dest:"peakMem",spec:{kind:"bool",value:!0}},"--no-peak-mem":{dest:"peakMem",spec:{kind:"bool",value:!1}},"--filter":{dest:"filter",spec:{kind:"string"}},"--isolate":{dest:"isolate",spec:{kind:"bool",value:!0}},"--no-isolate":{dest:"isolate",spec:{kind:"bool",value:!1}},"--preload":{dest:"preload",spec:{kind:"list"}},"--timeout":{dest:"timeoutMs",spec:{kind:"int",min:1}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--no-noise-check":{dest:"noiseCheck",spec:{kind:"bool",value:!1}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"enum",values:ne}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function st(r){return ce(r,"bench",nt,{suites:[],preload:[],bunFlags:[],noiseCheck:!0,format:"table",quiet:!1,help:!1},(c,p)=>p.suites.push(c),Be(r))}function Be(r){return(n,c,p)=>{if(n==="--bun-flags")return p.bunFlags.push(...R(r[c+1]??"")),c+1;if(n.startsWith("--bun-flags="))return p.bunFlags.push(...R(n.slice(12))),c;return}}async function ot(r){let n=st(r);if(n.help)return L(De,!0);let c=await W(),p=await z(n,c?.bench);if(p.suites.length===0)return L(De,!1);if(p.jobs!==void 0&&!(p.jobs>=1))return await T("invalid-flag",'--jobs expects a positive integer or "auto".'),2;let h,g;try{({result:h,aborted:g}=await ke((b)=>D({...p,signal:b})))}catch(b){return await T("spawn-failed",`Bench failed: ${Y(b)}`),2}let x=await pe(h,n);if(x!==0)return x;return g?130:0}var at={"--base":{dest:"base",spec:{kind:"string"}},"--rounds":{dest:"rounds",spec:{kind:"int",min:3}},"--threshold":{dest:"thresholdPct",spec:{kind:"number",min:0}},"--geomean-threshold":{dest:"geomeanThresholdPct",spec:{kind:"number",min:0}},"--confirm":{dest:"confirm",spec:{kind:"int",min:0}},"--filter":{dest:"filter",spec:{kind:"string"}},"--preload":{dest:"preload",spec:{kind:"list"}},"--timeout":{dest:"timeoutMs",spec:{kind:"int",min:1}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--no-noise-check":{dest:"noiseCheck",spec:{kind:"bool",value:!1}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"enum",values:ne}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function it(r){return ce(r,"ab",at,{suites:[],preload:[],bunFlags:[],noiseCheck:!0,format:"table",quiet:!1,help:!1},(c,p)=>p.suites.push(c),Be(r))}async function rt(r){let n=it(r);if(n.help)return L(Re,!0);let c=(await W())?.bench,p=n.suites.length>0?n.suites:c?.suites?await U(c.suites,process.cwd()):[];if(p.length===0)return L(Re,!1);let h,g;try{({result:h,aborted:g}=await ke((M)=>G({suites:p,base:n.base,rounds:n.rounds,thresholdPct:n.thresholdPct,geomeanThresholdPct:n.geomeanThresholdPct,confirm:n.confirm,filter:n.filter??c?.filter,preload:n.preload.length>0?n.preload:c?.preload??[],bunFlags:n.bunFlags.length>0?n.bunFlags:c?.bunFlags??[],timeoutMs:n.timeoutMs??c?.timeoutMs,outDir:n.outDir??c?.outDir,noiseCheck:n.noiseCheck,signal:M})))}catch(M){if(M instanceof A)return await T("invalid-flag",`--base: ${M.message}`),2;return await T("spawn-failed",`A/B run failed: ${Y(M)}`),2}let x=h.ab,b=g?130:x.matched===0?2:x.verdict==="fail"?1:0,k=new Map(h.workloads.map((M)=>[M.id,M])),q=(M=[])=>M.flatMap((P)=>k.get(P)??[]),j=await pe(h,n,{protocol:{command:"ab",exitCode:b,unmatched:{baseOnly:q(h.unmatched?.baseOnly),candOnly:q(h.unmatched?.candOnly)},...n.exportJson&&{exportedTo:n.exportJson}}});if(j!==0)return j;if(b===2)await T("no-matches",`No task exists both at ${x.base.ref} and in the working tree; nothing was paired.`);return b}var lt={"--baseline":{dest:"baseline",spec:{kind:"string"}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"enum",values:ne}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function ct(r){return ce(r,"compare",lt,{paths:[],format:"table",quiet:!1,help:!1},(c,p)=>p.paths.push(c))}async function ut(){let r=await W();if(!r)return{thresholds:f,source:"defaults"};return{thresholds:r.thresholds,source:await oe()??"ostia.config.json"}}async function mt(r){let n=ct(r);if(n.help)return L(Oe,!0);let c,p;if(n.baseline)c=n.baseline,p=n.paths[0];else c=n.paths[0],p=n.paths[1];if(!c||!p)return L(Oe,!1);let h,g;try{[h,g]=await Promise.all([o(c),o(p)])}catch(y){return await T("document-load-failed",`Failed to load documents: ${Y(y)}`),2}let{thresholds:x,source:b}=await ut(),k=H(h,g,x),q={...g,comparisons:k.comparisons,comparisonSummary:k.summary,unmatched:{baseOnly:k.unmatched.baseOnly.map((y)=>y.id),candOnly:k.unmatched.candOnly.map((y)=>y.id)}},j=n.format==="table"||n.format==="markdown";if(!n.quiet&&j){if(await B(`thresholds: ${b}
|
|
198
|
+
`),h.git&&g.git)await B(`base ${v(h.git)} \u2192 cand ${v(g.git)}
|
|
199
|
+
`);if(n.format==="table"&&k.summary.effectiveTimingPct>x.timingPct)await B(`threshold ${x.timingPct}% (widened to ${k.summary.effectiveTimingPct.toFixed(1)}% by noise floor)
|
|
200
|
+
`)}let M=k.summary.matched===0?2:k.summary.verdict==="fail"?1:0,P=await pe(q,n,{protocol:{command:"compare",exitCode:M,unmatched:k.unmatched,baseGit:h.git,candGit:g.git,...n.exportJson&&{exportedTo:n.exportJson}}});if(P!==0)return P;if(!n.quiet&&(n.format==="table"||n.format==="markdown")&&(k.unmatched.baseOnly.length>0||k.unmatched.candOnly.length>0))await B(dt(k.unmatched,n.format));if(k.summary.matched===0)await T("no-matches","No workload matched between base and candidate; nothing was compared.");return M}function dt(r,n){let c=(h)=>h.map((g)=>t(g)).join(", ");if(n==="markdown"){let h=["### Unmatched",""];if(r.baseOnly.length>0)h.push(`- baseline only: ${c(r.baseOnly)}`);if(r.candOnly.length>0)h.push(`- candidate only: ${c(r.candOnly)}`);return h.push(""),`${h.join(`
|
|
201
201
|
`)}
|
|
202
|
-
`}let
|
|
202
|
+
`}let p=["","Unmatched:"];if(r.baseOnly.length>0)p.push(` baseline only: ${c(r.baseOnly)}`);if(r.candOnly.length>0)p.push(` candidate only: ${c(r.candOnly)}`);return`${p.join(`
|
|
203
203
|
`)}
|
|
204
|
-
`}var pt={"--format":{dest:"format",spec:{kind:"enum",values:ze}},"--measurement":{dest:"measurementId",spec:{kind:"string"}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function ft(
|
|
204
|
+
`}var pt={"--format":{dest:"format",spec:{kind:"enum",values:ze}},"--measurement":{dest:"measurementId",spec:{kind:"string"}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function ft(r){return ce(r,"report",pt,{format:"table",help:!1},(c,p)=>{if(p.path!==void 0)throw new Q(`"ostia report" takes exactly one document path, got "${p.path}" and "${c}".`);p.path=c})}async function _e(r){let n=ft(r);if(n.help||!n.path)return L(Ze,n.help);let c;try{c=await o(n.path)}catch(g){return await T("document-load-failed",`Failed to load ${n.path}: ${Y(g)}`),2}if(we.includes(n.format)&&!n.measurementId&&!Ne(c))return await T("no-cpu-evidence",be),2;let h=await d[n.format].render(c,{measurementId:n.measurementId});if(!h.text&&(!h.files||h.files.length===0))return await T("no-cpu-evidence",n.measurementId?`No CPU evidence found for measurement "${n.measurementId}".`:be),2;return await ue(h,n.outDir),0}var ht={"--full":{dest:"full",spec:{kind:"bool",value:!0}},"--baseline":{dest:"baseline",spec:{kind:"string"}},"--save-baseline":{dest:"saveBaseline",spec:{kind:"bool",value:!0}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"enum",values:ne}},"--no-noise-check":{dest:"noiseCheck",spec:{kind:"bool",value:!1}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function gt(r){return ce(r,"ci",ht,{full:!1,saveBaseline:!1,format:"table",quiet:!1,help:!1,noiseCheck:!0},(c)=>{throw new Q(`Unknown flag "${c}" for "ostia ci".`)})}async function bt(r){let n=gt(r);if(n.help)return L(Qe,!0);let c=await fe("ostia ci");if(!c)return 2;let p={...c,...!n.noiseCheck&&{noiseCheck:!1}},h;try{h=await Ae({config:p,full:n.full,baselineName:n.baseline})}catch(b){if(b instanceof me||b instanceof de)return await T("baseline-missing",b.message),2;if(b instanceof O)return await T("document-load-failed",b.message),2;return await T("spawn-failed",`CI run failed: ${Y(b)}`),2}let g=n.format==="json"&&!n.quiet?I(h.document):void 0;if(n.exportJson)if(g)await ee(g,n.exportJson);else await a(h.document,n.exportJson);if(n.saveBaseline&&h.summary.regressed===0&&h.summary.failed===0)await a(h.document,l(p,n.baseline));let x=h.summary.failed>0?2:h.summary.regressed>0?1:0;if(h.summary.failed>0){let b=h.summary.results.filter((k)=>k.harnessFailed).map((k)=>t(k.workload));await T("command-failed",`${h.summary.failed} workload(s) failed (harness error, a command exited non-zero or produced no samples): ${b.join(", ")}`)}if(!n.quiet){let b=n.baseline??p.baseline;if(n.format==="table"){if(await B(Me(h.summary)),h.document.comparisons&&h.document.comparisons.length>0)await ue(await d.table.render(h.document,{}))}else if(g!==void 0)await B(g);else if(n.format==="markdown")await B(`## ostia ci
|
|
205
205
|
|
|
206
|
-
Baseline: \`${
|
|
206
|
+
Baseline: \`${b}\` (\`${l(p,n.baseline)}\`) \xB7 ${h.summary.cached} cached, ${h.summary.executed} executed
|
|
207
207
|
|
|
208
|
-
`),await ue(await
|
|
209
|
-
Run 'ostia baseline --help'.`),2;let n=
|
|
210
|
-
Run 'ostia baseline --help'.`),2}let
|
|
211
|
-
`),0}async function kt(
|
|
212
|
-
`),0;for(let
|
|
213
|
-
`)}return 0}async function vt(
|
|
214
|
-
Run 'ostia baseline --help'.`),2;let
|
|
208
|
+
`),await ue(await d.markdown.render(h.document,{}));else await ue(await d[n.format].render(h.document,{protocol:{command:"ci",exitCode:x,unmatched:h.summary.unmatched,baseGit:h.baseline.git,candGit:h.document.git,baseline:{name:b,path:l(p,n.baseline)},cached:h.summary.cached,executed:h.summary.executed,failed:h.summary.failed,missingBaseline:h.summary.missingBaseline,...n.exportJson&&{exportedTo:n.exportJson}}}))}return x}var je=/^[A-Za-z0-9._-]+$/;function He(r){if(r.startsWith("-"))return`Invalid baseline name "${r}": names can't start with "-".`;if(!je.test(r))return`Invalid baseline name "${r}": expected to match ${je}.`;return}async function wt(r){if(r.includes("--help")||r.includes("-h"))return L(he,!0);if(r.length>1)return await T("invalid-flag",`"ostia baseline save" takes at most one name argument, got ${r.length}.
|
|
209
|
+
Run 'ostia baseline --help'.`),2;let n=r[0];if(n!==void 0){let h=He(n);if(h)return await T("invalid-flag",`${h}
|
|
210
|
+
Run 'ostia baseline --help'.`),2}let c=await fe("ostia baseline save");if(!c)return 2;let p=await Se(c,n);return await B(`Wrote ${p}
|
|
211
|
+
`),0}async function kt(r){if(r.includes("--help")||r.includes("-h"))return L(he,!0);let n=await fe();if(!n)return 2;let c=await Fe(n);if(c.length===0)return await B(`No baselines found in ${n.baselineDir}.
|
|
212
|
+
`),0;for(let p of c){let h=p.git?` ${v(p.git)}`:"";await B(`${p.name} ${p.workloads} workloads created ${p.createdAt} toolVersion ${p.toolVersion}${h}
|
|
213
|
+
`)}return 0}async function vt(r){let[n,...c]=r;if(!n||n==="--help"||n==="-h")return L(he,!!n);let p=He(n);if(p)return await T("invalid-flag",`${p}
|
|
214
|
+
Run 'ostia baseline --help'.`),2;let h=await fe();if(!h)return 2;return _e([l(h,n),...c])}async function We(r,n,c,p,h,g=""){if(r===void 0||r==="--help"||r==="-h")return L(p,r!==void 0);let x=c[r];if(!x)return await T("invalid-flag",h(r)),2;try{return await x(n)}catch(b){if(b instanceof N)return await T("config-invalid",b.message),2;if(b instanceof Q)return Je(b,`${g}${r}`);return await T("internal",`Internal error: ${b instanceof Error?b.stack??b.message:String(b)}`),2}}async function yt(r){let[n,...c]=r;return We(n,c,{save:wt,list:kt,show:vt},he,(p)=>`Unknown "ostia baseline ${p}". Run "ostia baseline --help".`,"baseline ")}var Ct=`ostia - profiling and benchmarking for Bun
|
|
215
215
|
|
|
216
216
|
Commands:
|
|
217
217
|
time Time commands N times and report timing/CPU/heap
|
|
@@ -223,4 +223,4 @@ Commands:
|
|
|
223
223
|
baseline Manage baseline ProfileDocuments (save/list/show)
|
|
224
224
|
|
|
225
225
|
Run "ostia <command> --help" for details.
|
|
226
|
-
`;async function xt(){let[
|
|
226
|
+
`;async function xt(){let[r,...n]=process.argv.slice(2);return Ie=n,We(r,n,{time:tt,bench:ot,ab:rt,compare:mt,report:_e,ci:bt,baseline:yt},Ct,(c)=>`Unknown subcommand "${c}". Run "ostia --help".`)}if(import.meta.main)xt().then((r)=>process.exit(r));export{Q as CliUsageError,Ge as parseIntFlag};
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{f,H,G,D,ke,w,d,ye,xe,Pe,ae,Me}from"./chunk-t6q9jbb6.js";import{s,a,O,o,ve,Te,$e}from"./chunk-cqy5fzae.js";export{f as DEFAULT_THRESHOLDS,w as MINIMAL_PROTOCOL_VERSION,O as OstiaDocumentError,G as ab,D as bench,H as compareDocuments,s as createDocument,Pe as defineConfig,Te as group,ve as keep,o as loadDocument,Me as profile,ke as range,d as renderers,ye as run,a as saveDocument,xe as sweep,$e as task,ae as time};
|
package/package.json
CHANGED
package/runner.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{
|
|
3
|
+
import{a,p,y,L,b,ue,we,x,P,j}from"./chunk-cqy5fzae.js";import{heapStats as S}from"bun:jsc";function g(){let{heapSize:e,extraMemorySize:r}=S();return{rssBytes:process.memoryUsage.rss(),liveBytes:e+r}}var i={ready:1,go:2,sampling:3,stop:4},M=`self.onmessage = (event) => {
|
|
4
4
|
const slots = new Int32Array(event.data)
|
|
5
|
-
Atomics.store(slots, 0, ${
|
|
6
|
-
Atomics.wait(slots, 0, ${
|
|
7
|
-
if (Atomics.compareExchange(slots, 0, ${
|
|
8
|
-
while (Atomics.load(slots, 0) === ${
|
|
5
|
+
Atomics.store(slots, 0, ${i.ready})
|
|
6
|
+
Atomics.wait(slots, 0, ${i.ready})
|
|
7
|
+
if (Atomics.compareExchange(slots, 0, ${i.go}, ${i.sampling}) === ${i.go}) {
|
|
8
|
+
while (Atomics.load(slots, 0) === ${i.sampling}) {
|
|
9
9
|
const kib = (process.memoryUsage.rss() / 1024) | 0
|
|
10
10
|
if (kib > Atomics.load(slots, 1)) Atomics.store(slots, 1, kib)
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
postMessage(0)
|
|
14
|
-
}`;async function
|
|
15
|
-
`),2;let s=
|
|
16
|
-
`),2;let
|
|
17
|
-
`),2}if(s.taskIds){let t=new Set(s.taskIds);
|
|
18
|
-
`),2;await t.groupBefore?.(),await t.opts?.before?.();let
|
|
14
|
+
}`;async function w(){let e=new Int32Array(new SharedArrayBuffer(8)),r=new Worker(URL.createObjectURL(new Blob([M],{type:"application/javascript"}))),m=new Promise((s)=>{r.onmessage=s});r.postMessage(e.buffer);while(Atomics.load(e,0)!==i.ready)await Bun.sleep(1);return{async during(s){try{Atomics.store(e,0,i.go),Atomics.notify(e,0);while(Atomics.load(e,0)!==i.sampling);return await s(),Atomics.store(e,0,i.stop),await m,Atomics.load(e,1)*1024}finally{r.terminate()}}}}async function h(e,r,m){let s=m??await w();Bun.gc(!0);let l=g(),c=process.resourceUsage().maxRSS*1024,u=Bun.nanoseconds(),n=0,k=await s.during(async()=>{let f=e();if(p(f))await f;n=Bun.nanoseconds()-u}),d=process.resourceUsage().maxRSS*1024,t=Math.max(k,d>c?d:0),o=r?l.rssBytes-r.rssBytes-(l.liveBytes-r.liveBytes):0;return{peakBytes:Math.max(0,t-l.rssBytes),slackBytes:Math.max(0,o),wallNs:n}}async function B(){let[e,r,m]=process.argv.slice(2);if(!e||!r)return process.stderr.write(`bench runner: usage: runner.ts <suiteFile> <outputPath> [optsJson]
|
|
15
|
+
`),2;let s=m?JSON.parse(m):{},l,c;if(s.peakMemFor)c=await w(),await import("./index.js"),l=g();for(let t of s.preload??[])await import(t);L(),await import(e);let u=y();if(u.length===0)return process.stderr.write(`bench runner: ${e} registered no tasks (no task() calls found).
|
|
16
|
+
`),2;let n;try{n=x(u,s.filter,e)}catch(t){return process.stderr.write(`bench runner: ${t.message}
|
|
17
|
+
`),2}if(s.taskIds){let t=new Set(s.taskIds);n=n.filter((o)=>t.has(b(o)))}if(s.peakMemFor){let t=n.find((f)=>P(e,f).id===s.peakMemFor);if(!t)return process.stderr.write(`bench runner: no task with workload id ${s.peakMemFor} in ${e}.
|
|
18
|
+
`),2;await t.groupBefore?.(),await t.opts?.before?.();let o=await h(t.fn,l,c);return await t.opts?.after?.(),await t.groupAfter?.(),await Bun.write(r,JSON.stringify(o)),0}if(s.planPath){let t=n.map((o)=>({id:b(o),workloadId:P(e,o).id,isolate:ue(o,s.isolate??!1),peakMem:!o.skipped&&we(o,s.peakMem??!1)}));await Bun.write(s.planPath,JSON.stringify({tasks:t}))}let k=s.taskIds?n:n.filter((t)=>!ue(t,s.isolate??!1)),d=await j(e,k,s);return await a(d,r),0}B().then((e)=>process.exit(e));
|
package/chunk-17t12ta6.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
function h(u){if(u.length===0)throw Error("computeTimingStats: samples must be non-empty");let m=u.length,d=pn(u),f=0;for(let R=0;R<m;R++)f+=u[R];let T=f/m,S=o(d,0.5),E=0;for(let R=0;R<m;R++){let H=u[R]-T;E+=H*H}let L=Math.sqrt(E/m),F=d[0],V=d[m-1],j=o(d,0.25),G=o(d,0.75),ne=G-j,se=j-1.5*ne,be=G+1.5*ne,te=j-3*ne,ae=G+3*ne,ge=0,he=0;for(let R=0;R<m;R++){let H=u[R];if(H<te||H>ae)he++;else if(H<se||H>be)ge++}let Ie=o(d,0.99),Me=new Float64Array(m);for(let R=0;R<m;R++)Me[R]=Math.abs(u[R]-S);Me.sort();let Se=o(Me,0.5);return{unit:"ns",samples:u,mean:T,median:S,stddev:L,min:F,max:V,outliers:{mild:ge,severe:he},p25:j,p75:G,p99:Ie,mad:Se}}function pn(u){let m=new Float64Array(u.length);return m.set(u),m.sort(),m}function o(u,m){let d=u.length;if(d===1)return u[0];let f=m*(d-1),T=Math.floor(f),S=Math.ceil(f);if(T===S)return u[T];let E=f-T;return u[T]*(1-E)+u[S]*E}var dn=5000000;function K(u,m,d="subprocess",f=[]){let T=[],S=u.samples[0];if(S!==void 0){let F=u.p75-u.p25;if(S>u.median+3*F&&S>2*u.median&&F>0)T.push({code:"slow-first-run",message:`First run took ${n(S)}, much slower than the median ${n(u.median)}. Consider more warmup.`,data:{firstNs:S,medianNs:u.median}})}if(d!=="inprocess"&&u.outliers.mild+u.outliers.severe>0)T.push({code:"outliers-detected",message:`${u.outliers.mild+u.outliers.severe} outlier(s) detected (${u.outliers.severe} severe, ${u.outliers.mild} mild).`,data:u.outliers});if(d==="subprocess"&&u.median<dn)T.push({code:"fast-command",message:`Median run time (${(u.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:u.median}});let E=new Set(f),L=m.filter((F)=>F!==void 0&&F!==0&&!E.has(F));if(L.length>0)T.push({code:"nonzero-exit",message:`${L.length} of ${m.length} trial(s) exited non-zero.`,data:{exitCodes:L}});return T}var I=0.5,fn={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function b(u){let m=Math.abs(u);if(m>=1e9)return"s";if(m>=1e6)return"ms";if(m>=1000)return"\xB5s";return"ns"}function gn(u){let m=Math.floor(Math.log10(Math.max(Math.abs(u),1)))+1;return Math.max(1,3-m)}function n(u,m=b(u)){let d=u/fn[m];return`${d.toFixed(gn(d))} ${m}`}function O(u){return u.samples?.nodeIds.length??u.totals.reduce((m,d)=>m+d.samples,0)}function g(u){if(u<1024)return`${u.toFixed(0)}B`;if(u<1048576)return`${(u/1024).toFixed(2)}KB`;return`${(u/1048576).toFixed(2)}MB`}function J(u){return`${u.cpuModel} \xB7 ${u.cores} cores \xB7 load ${u.loadAvg1.toFixed(1)} \xB7 noise floor ${u.noise.floorPct.toFixed(1)}%`}function w(u){return`${u.sha} (${u.branch}${u.dirty?", dirty":""})`}function t(u){return u?.label??u?.command?.join(" ")??u?.entry?.task??u?.id??"unknown"}function z(u,m){if(u===1)return m?"1.00\xD7 (baseline)":"1.00\xD7";if(u>1)return`${u.toFixed(2)}\xD7 slower`;return`${(1/u).toFixed(2)}\xD7 faster`}function ce(u){return u.replace(/\|/g,"\\|").replace(/</g,"<").replace(/>/g,">").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function k(u){let m=u.trials.filter((f)=>!f.timedOut&&!f.timeSourceNoMatch&&f.userNs!==void 0&&f.systemNs!==void 0);if(m.length===0)return;let d=(f)=>o(Float64Array.from(f).sort(),0.5);return{userNs:d(m.map((f)=>f.userNs)),systemNs:d(m.map((f)=>f.systemNs))}}function q(u){return`${n(u.userNs)}/${n(u.systemNs)}`}class Fe extends Error{}function Y(u){if(typeof u.pattern==="string")return;let{flags:m}=u.pattern;if(m.includes("g")||m.includes("y")||m.includes("d"))throw RangeError("timeSource pattern must not use the g or y flag")}function bn(...u){let m=u.filter((d)=>d!==void 0);if(m.length===0)return;if(m.length===1)return m[0];return AbortSignal.any(m)}var hn={ns:1,us:1000,ms:1e6,s:1e9};function D(u,m){let d=u!==void 0?AbortSignal.timeout(u):void 0,f=bn(d,m);return{spawn:f?{signal:f,killSignal:"SIGKILL"}:{},timedOut:()=>d?.aborted??!1}}async function ue(u){let m=u.timeSource!==void 0,d=Bun.nanoseconds(),f=D(u.timeoutMs,u.signal),T=Bun.spawn(u.argv,{cwd:u.cwd,env:u.env,stdout:m?"pipe":"ignore",stderr:m?"pipe":"ignore",stdin:"ignore",...f.spawn}),S=m?Promise.all([new Response(T.stdout).text(),new Response(T.stderr).text()]):void 0,E=await T.exited,L=Bun.nanoseconds(),F=T.resourceUsage?.(),V=f.timedOut(),j={wallNs:L-d,exitCode:V?null:E,userNs:F?Number(F.cpuTime.user)*1000:void 0,systemNs:F?Number(F.cpuTime.system)*1000:void 0,maxRssBytes:F?.maxRSS,...V?{timedOut:!0}:{}};if(S){let[G,ne]=await S;if(u.timeSource&&!V)try{j.reportedNs=kn(u.timeSource,G,ne,u.argv)}catch(se){if(!(se instanceof Fe))throw se;j.timeSourceNoMatch=!0,j.timeSourceMissOutput=wn(G,ne)}}return j}function kn(u,m,d,f=[]){let T=typeof u.pattern==="string"?new RegExp(u.pattern):u.pattern,S=u.group??1,E=T.exec(m)??T.exec(d),L=f.length>0?` for "${f.join(" ")}"`:"";if(!E)throw new Fe(`timeSource pattern ${T} did not match the output${L}. Output was:
|
|
3
|
-
${je(m,d)}`);let F=E[S];if(F===void 0)throw Error(`timeSource pattern ${T} matched${L} but has no capture group ${S} (matched text: "${E[0]}").`);let V=Number(F);if(!Number.isFinite(V))throw Error(`timeSource pattern ${T} group ${S} captured "${F}"${L}, which is not a number.`);return V*hn[u.unit??"ms"]}function je(u,m){let f=(S)=>S.length>800?`${S.slice(0,800)}\u2026(${S.length-800} more)`:S,T=[];if(u.trim())T.push(`--- stdout ---
|
|
4
|
-
${f(u.trimEnd())}`);if(m.trim())T.push(`--- stderr ---
|
|
5
|
-
${f(m.trimEnd())}`);return T.length>0?T.join(`
|
|
6
|
-
`):"(empty)"}var Oe=2048;function wn(u,m){let d=je(u,m);if(Buffer.byteLength(d,"utf8")<=Oe)return d;let f=d.slice(0,Oe);while(Buffer.byteLength(f,"utf8")>Oe)f=f.slice(0,-1);return`${f}\u2026`}var yn=1048576,xn=(u)=>`
|
|
7
|
-
\u2026(${u} bytes elided)\u2026
|
|
8
|
-
`;async function Tn(u,m=yn){let d=Math.floor(m/2),f=u.getReader(),T=[],S=0,E=[],L=0,F=0;try{for(;;){let{done:se,value:be}=await f.read();if(se)break;if(!be||be.byteLength===0)continue;F+=be.byteLength;let te=be;if(S<d){let ae=d-S;if(te.byteLength<=ae){T.push(te),S+=te.byteLength;continue}T.push(te.subarray(0,ae)),S+=ae,te=te.subarray(ae)}E.push(te),L+=te.byteLength;while(L>d&&E.length>0){let ae=E[0],ge=L-d;if(ae.byteLength<=ge)E.shift(),L-=ae.byteLength;else E[0]=ae.subarray(ge),L-=ge}}}finally{f.releaseLock()}let V=new TextDecoder,j=V.decode(Ge(T));if(F<=S+L)return j;let G=V.decode(Ge(E)),ne=F-S-L;return`${j}${xn(ne)}${G}`}function Ge(u){let m=u.reduce((T,S)=>T+S.byteLength,0),d=new Uint8Array(m),f=0;for(let T of u)d.set(T,f),f+=T.byteLength;return d}async function X(u,m,d){if(typeof u==="function"){await u(m);return}let f=Be(u),T=D(d.timeoutMs,d.signal),S=Bun.spawn(f,{cwd:d.cwd,env:d.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...T.spawn}),E=Tn(S.stderr).catch(()=>""),L=await S.exited;if(T.timedOut()){let F=(await E).trim();throw Error(`prepare command "${f.join(" ")}" timed out after ${d.timeoutMs}ms before ${m.phase} trial ${m.index}.${F?`
|
|
9
|
-
${F}`:""}`)}if(d.signal?.aborted)return;if(L!==0){let F=(await E).trim();throw Error(`prepare command "${f.join(" ")}" exited with code ${L} before ${m.phase} trial ${m.index}.${F?`
|
|
10
|
-
${F}`:""}`)}}function Be(u){if(u===void 0||typeof u==="function")return;return Array.isArray(u)?u:y(u)}function He(u){if(u===void 0)return;return{pattern:typeof u.pattern==="string"?u.pattern:u.pattern.source,...u.group!==void 0&&{group:u.group},...u.unit!==void 0&&{unit:u.unit}}}function y(u){return u.trim().split(/\s+/).filter(Boolean)}import{renameSync as Mn}from"fs";import{isAbsolute as vn,relative as Rn}from"path";var Je={name:"ostia",version:"0.2.8",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"src/cli/main.ts"},scripts:{build:"bun scripts/build.ts",test:"bun test",typecheck:"tsc6","typecheck:package":"tsc6 -p tests/types",lint:"biome check .","lint:fix":"biome check --write . --unsafe","lint:changed":"biome check --changed --no-errors-on-unmatched .","lint:fix:changed":"biome check --write --unsafe --changed --no-errors-on-unmatched .",knip:"knip-bun",bench:"bun src/cli/main.ts bench bench/*.ts","bench:baseline":"bun src/cli/main.ts bench bench/*.ts --budget 3000 --min-samples 30 --export-json .ostia/baselines/bench-main.json",baseline:"bun src/cli/main.ts baseline save",dogfood:"bun test && bun src/cli/main.ts ci",examples:"bun scripts/run-examples.ts"},devDependencies:{"@biomejs/biome":"2.5.14","@types/bun":"^1.4.2",knip:"^6.38.0",typescript:"npm:@typescript/typescript6@^6.0.2"},repository:{type:"git",url:"git+https://github.com/metonym/ostia.git"}};var N=Je.version;function C(u,m){return JSON.stringify(Ue(u),null,m)}function Ue(u){if(Array.isArray(u)){let m=!1;for(let d=0;d<u.length;d++){let f=u[d];if(f!==null&&typeof f==="object"){m=!0;break}}return m?u.map(Ue):u}if(u!==null&&typeof u==="object"){let m=u,d={};for(let f of Object.keys(m).sort())d[f]=Ue(m[f]);return d}return u}function e(u,...m){let d=Bun.CryptoHasher.hash("sha256",C(m),"hex");return`${u}_${d.slice(0,16)}`}var Ae,Ve=!1;function $e(u){let m=Bun.spawnSync(["git",...u],{timeout:200,stdout:"pipe",stderr:"ignore"});return m.success?m.stdout.toString().trim():void 0}function Ke(){if(Ve)return Ae;Ve=!0;try{let u=$e(["rev-parse","--short","HEAD"]);if(u===void 0)Ae=void 0;else{let m=$e(["rev-parse","--abbrev-ref","HEAD"]),d=$e(["status","--porcelain"]);Ae={sha:u,branch:m??"HEAD",dirty:(d?.length??0)>0}}}catch{Ae=void 0}return Ae}function r(u,m,d){let f=Ke();return{schemaVersion:2,toolVersion:N,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:u,measurements:m,...d!==void 0&&{environment:d},...f!==void 0&&{git:f}}}function B(u,m,d={}){if(d.timeSource)Y(d.timeSource);let f=Be(d.prepare),T=He(d.timeSource),S=typeof d.prepare==="function"?d.prepare.toString():f;return{id:e("wl","subprocess",u,...S!==void 0||T!==void 0?[S??null,T??null]:[]),kind:"subprocess",command:u,label:m,...f!==void 0&&{prepare:f},...T!==void 0&&{timeSource:T}}}function me(u,m){return{id:e("wl","inprocess",u.name,u.toString()),kind:"inprocess",label:m}}function ze(u,m,d={}){let f=vn(u)?Rn(process.cwd(),u):u;return{id:d.params!==void 0?e("wl","inprocess-entry",f,m,d.params):e("wl","inprocess-entry",f,m),kind:"inprocess",entry:{file:u,task:m,...d.group!==void 0&&{group:d.group}},...d.label!==void 0&&{label:d.label},...d.baseline!==void 0&&{baseline:d.baseline},...d.description!==void 0&&{description:d.description},...d.groupDescription!==void 0&&{groupDescription:d.groupDescription},...d.isolated!==void 0&&{isolated:d.isolated},...d.params!==void 0&&{params:d.params},...d.skipped!==void 0&&{skipped:d.skipped}}}function x(u){return{id:e("run",u.workload.id,"timing",u.configFingerprint,Bun.version,N),workloadId:u.workload.id,phase:"timing",instrumented:!1,configFingerprint:u.configFingerprint,trials:u.trials,timing:u.timing,warnings:u.warnings,artifacts:[],memory:Nn(u.trials),...u.interleaved!==void 0&&{interleaved:u.interleaved}}}function Nn(u){let m=u.map((d)=>d.maxRssBytes).filter((d)=>d!==void 0);if(m.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...m)}}function p(u){return{id:e("run",u.workload.id,u.phase,u.configFingerprint,Bun.version,N),workloadId:u.workload.id,phase:u.phase,instrumented:!0,configFingerprint:u.configFingerprint,trials:[{i:0,wallNs:u.diagnosticWallNs,exitCode:u.exitCode}],diagnosticWallNs:u.diagnosticWallNs,cpu:u.cpu,heap:u.heap,memory:u.memory,jit:u.jit,warnings:u.warnings,artifacts:u.artifacts}}async function le(u,m,d){let T=await Bun.file(d).arrayBuffer(),S=new Bun.CryptoHasher("sha256");return S.update(T),{id:e("art",u,m,d),kind:m,path:d,sha256:S.digest("hex"),bytes:T.byteLength}}function i(u){return e("cfg",u)}function P(u){return`${C(u,2)}
|
|
11
|
-
`}async function Z(u,m){let d=`${m}.tmp-${process.pid}`;await Bun.write(d,u),Mn(d,m)}async function l(u,m){await Z(P(u),m)}class M extends Error{code;path;schemaVersion;constructor(u,m,d={}){super(m);this.name="OstiaDocumentError",this.code=u,this.path=d.path,this.schemaVersion=d.schemaVersion}}async function s(u){let m=await Bun.file(u).text(),d;try{d=JSON.parse(m)}catch(T){let S=T instanceof Error?T.message:String(T);throw new M("invalid-json",`${u}: invalid JSON (${S})`,{path:u})}let f=d!==null&&typeof d==="object"?d.schemaVersion:void 0;if(typeof f!=="number")throw new M("not-a-document",`${u}: not a ProfileDocument (missing schemaVersion)`,{path:u});if(f!==2)throw new M("unsupported-schema",`${u}: unsupported ProfileDocument schemaVersion ${f} (this ostia reads 2)`,{path:u,schemaVersion:f});return In(d)}function In(u){for(let m of u.measurements){let d=m.timing;if(!d||d.mad!==void 0||d.samples.length===0)continue;m.timing={...h(d.samples),...d.batch!==void 0&&{batch:d.batch}}}return u}import Ce from"os";var Pn=200,qe=64,An=(()=>{let u=new Uint8Array(4096);for(let m=0;m<u.length;m++)u[m]=m*2654435761&255;return u})();function En(u,m){let d=m;for(let f=0;f<u.length;f++)d^=u[f],d=Math.imul(d,16777619);return d>>>0}function On(u){let m=h(u);return{floorPct:m.median===0?0:m.mad/m.median*100,referenceMedianNs:m.median,samples:u.length}}function Ye(u=Pn){let m=u*1e6,d=[],f=0,T=Bun.nanoseconds(),S=0;while(S<m){let E=Bun.nanoseconds();for(let F=0;F<qe;F++)f^=En(An,F);let L=Bun.nanoseconds();d.push((L-E)/qe),S=Bun.nanoseconds()-T}return On(d)}var Fn=0.75;function a(){let[u=0,m=0]=Ce.loadavg();return{cpuModel:Ce.cpus()[0]?.model??"unknown",cores:Ce.availableParallelism(),loadAvg1:u,loadAvg5:m,noise:Ye()}}function c(u){if(u.loadAvg1<=u.cores*Fn)return;return{code:"noisy-machine",message:`Load average ${u.loadAvg1.toFixed(2)} exceeds 75% of ${u.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:u.loadAvg1,cores:u.cores}}}import{profile as Un}from"bun:jsc";var Bn=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Ze=4294967295;function Xe(u,m){let d=m??u.interval*1e6,f=new Map,T=[];function S(R,H,re,we){let oe=f.get(R);if(oe===void 0)oe=new Map,f.set(R,oe);let Te=H??"",ve=oe.get(Te);if(ve===void 0)ve=T.length,oe.set(Te,ve),T.push({key:e("fr",R,Te),name:R,url:H,line:re,col:we});return ve}function E(R){let H=R.line===Ze,re=H?void 0:R.line-1,we=H||R.column===Ze?void 0:R.column-1;return S(R.name,R.sourceURL,re,we)}let L=S("(root)",void 0,void 0,void 0),F=1,V={id:0,frameIx:L,children:new Map,selfUs:0,samples:0,totalUs:0},j=new Map([[0,V]]),G={llint:0,baseline:0,dfg:0,ftl:0},ne=new Map,se=[],be=[];for(let R of u.traces){let H=R.frames,re=V;for(let Te=H.length-1;Te>=0;Te--){let ve=E(H[Te]),Re=re.children.get(ve);if(!Re)Re={id:F++,frameIx:ve,children:new Map,selfUs:0,samples:0,totalUs:0},re.children.set(ve,Re),j.set(Re.id,Re);re=Re}re.selfUs+=d,re.samples+=1,se.push(re.id),be.push(d);let we=H[0],oe=we&&Bn.get(we.category);if(oe){G[oe]++;let Te=ne.get(oe)??new Map;Te.set(re.frameIx,(Te.get(re.frameIx)??0)+1),ne.set(oe,Te)}}function te(R){let H=R.selfUs;for(let re of R.children.values())H+=te(re);return R.totalUs=H,H}te(V);let ae=new Map;function ge(R){let H=ae.get(R.frameIx);if(H)H.selfUs+=R.selfUs,H.totalUs+=R.totalUs,H.samples+=R.samples;else ae.set(R.frameIx,{frameIx:R.frameIx,selfUs:R.selfUs,totalUs:R.totalUs,samples:R.samples});for(let re of R.children.values())ge(re)}ge(V);let he=[...j.values()].map((R)=>({id:R.id,frameIx:R.frameIx,children:[...R.children.values()].map((H)=>H.id)})),Ie={origin:"jsc-profile",samplingIntervalUs:d,frames:T,nodes:he,totals:[...ae.values()].sort((R,H)=>H.selfUs-R.selfUs),samples:{nodeIds:se,timeDeltasUs:be}},Me=[...ne.entries()].flatMap(([R,H])=>[...H.entries()].sort((re,we)=>we[1]-re[1]).slice(0,3).map(([re,we])=>({tier:R,frameKey:T[re].key,samples:we})));return{cpu:Ie,jit:{origin:"jsc-profile",tiers:G,topFramesByTier:Me}}}var $n=1000;async function Q(u,m={}){let d=m.intervalUs??$n,f,T=Bun.nanoseconds(),S=await Un(async()=>(f=await u(),f),d),E=Bun.nanoseconds()-T,{cpu:L,jit:F}=Xe(S.stackTraces,d);return{result:f,cpu:L,jit:F,diagnosticWallNs:E}}var Cn=500,_n=20,Qe=3,Ln=10,Wn=2,Dn=0.1,Gn=1000,nn=1e4,jn=2*nn,Hn=1e6,Jn=5,tn=256;function rn(u){let m=Math.log10(Math.max(1,u)/1e6),d=Math.round(Qe+Wn*m);return Math.min(Ln,Math.max(Qe,d))}function Vn(u,m){let d=Math.floor(m/u);return Math.min(_n,Math.max(d,rn(u)))}var Kn;function ye(u){Kn=u}function v(u){return u!==null&&typeof u==="object"&&typeof u.then==="function"}var zn=(async()=>{}).constructor,qn=0;function Yn(u){let m=`/* ostia task loop ${qn++} */
|
|
12
|
-
const t0 = Bun.nanoseconds()
|
|
13
|
-
for (let b = 0; b < n; b++) sink[b & ${tn-1}] = ${u?"await ":""}fn()
|
|
14
|
-
return Bun.nanoseconds() - t0`;return(u?zn:Function)("fn","sink","n",m)}function en(u,m){return Math.max(1,Math.ceil(Gn/u),Math.ceil(m/(u*nn)))}function Zn(u){let m=[...u].sort((d,f)=>d-f);return m[m.length>>1]}async function on(u,m={}){let d=(m.budgetMs??Cn)*1e6,f=d*(m.warmup??Dn),T=Bun.nanoseconds(),S=u(),E=v(S);if(E)await S;let L=Math.max(1,Bun.nanoseconds()-T),F=Yn(E),V=Array(tn),j=(oe)=>F(u,V,oe),G=Bun.nanoseconds(),ne=1;while(Bun.nanoseconds()-G<f){let oe=await j(ne);if(L=Math.max(1,oe/ne),oe<Hn)ne*=2}let se=en(L,d);if(se>1){let oe=[];for(let Te=0;Te<Jn;Te++)oe.push(await j(se)/se);L=Math.max(1,Zn(oe)),se=en(L,d)}let be=L*se,te=m.samples??m.minSamples??Vn(be,d),ae=m.samples!==void 0?0:d,ge=m.samples??Math.max(jn,te),he=[],Ie=Bun.nanoseconds(),Me=0,Se=0;while(Se<te||Me<ae&&Se<ge){let oe=await j(se);if(he.push({i:Se,wallNs:oe/se}),Se++,Me=Bun.nanoseconds()-Ie,m.gc)Bun.gc(!0);if(Se>=ge&&Se>=te)break}let R=he.map((oe)=>oe.wallNs),H=h(R);if(se>1)H.batch=se;let re=K(H,[],"inprocess"),we=rn(be);if(he.length<we)re.push({code:"low-sample-count",message:`Only ${he.length} sample(s) at ~${Xn(be)} per trial; ${we} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:he.length,target:we,trialCostNs:be}});return{trials:he,timing:H,warnings:re}}function Xn(u){if(u>=1e9)return`${(u/1e9).toFixed(2)}s`;if(u>=1e6)return`${(u/1e6).toFixed(1)}ms`;if(u>=1000)return`${(u/1000).toFixed(1)}\xB5s`;return`${u.toFixed(0)}ns`}var We=[],ke,Ne;function _e(u,m,d,f){let T=ke;ke={name:u,description:d?.description,isolate:d?.isolate,gc:d?.gc,cpu:d?.cpu,alloc:d?.alloc,peakMem:d?.peakMem,before:d?.before,after:d?.after,skip:f.skip,only:f.only};try{m()}finally{ke=T}}var xe=Object.assign((u,m,d)=>_e(u,m,d,{}),{skip:(u,m,d)=>_e(u,m,d,{skip:!0}),only:(u,m,d)=>_e(u,m,d,{only:!0})});function Le(u,m,d,f){let T=Ne!==void 0||d?.params!==void 0?{...Ne,...d?.params}:void 0;We.push({groupName:ke?.name,groupDescription:ke?.description,groupIsolate:ke?.isolate,groupGc:ke?.gc,groupCpu:ke?.cpu,groupAlloc:ke?.alloc,groupPeakMem:ke?.peakMem,groupBefore:ke?.before,groupAfter:ke?.after,name:u,fn:m,baseline:d?.baseline,params:T,skipped:f.skip||ke?.skip,only:f.only||ke?.only,opts:d})}var Pe=Object.assign((u,m,d)=>Le(u,m,d,{}),{skip:(u,m,d)=>Le(u,m,d,{skip:!0}),only:(u,m,d)=>Le(u,m,d,{only:!0})});function W(){return We}function de(){We.length=0,ke=void 0,Ne=void 0}function pe(u,m){let d=Ne;Ne=u;try{return m()}finally{Ne=d}}function A(u){return u.groupName?`${u.groupName}/${u.name}`:u.name}function ie(u,m){return u.opts?.isolate??u.groupIsolate??m}function sn(u,m){return u.opts?.gc??u.groupGc??m}function an(u,m){return u.opts?.cpu??u.groupCpu??m}function un(u,m){return u.opts?.alloc??u.groupAlloc??m}function fe(u,m){return u.opts?.peakMem??u.groupPeakMem??m}function Qn(u,m){if(!m)return[...u];let d=new RegExp(m);return u.filter((f)=>d.test(A(f)))}function U(u,m,d){let f=u.filter((E)=>E.only),T=f.length>0?f:u;if(f.length>0)process.stderr.write(`bench: ${f.length} task(s) selected by .only
|
|
15
|
-
`);let S=Qn(T,m);if(S.length===0)throw Error(`filter ${JSON.stringify(m)} matched zero of ${T.length} registered task(s) in ${d}.`);return S}import{heapStats as et}from"bun:jsc";var nt=100;function cn(){try{return et().heapSize}catch{return process.memoryUsage().heapUsed}}async function ln(u,m=nt){let d=Bun.nanoseconds();Bun.gc(!0);let f=cn();for(let E=0;E<m;E++){let L=u();if(v(L))await L}Bun.gc(!0);let T=cn(),S=Bun.nanoseconds()-d;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(T-f)/m)},diagnosticWallNs:S}}var De=100,Ee=2000,tt=2,rt=200,ot=1e4,it=Ee/2,st=20;function at(u){let m=Ee*tt*u/1000;return Math.min(ot,Math.max(rt,m))}async function mn(u,m={}){let d=m.intervalUs??De,f=at(d)*1e6,T=async()=>{let G=Bun.nanoseconds();do{let ne=u();if(v(ne))await ne}while(Bun.nanoseconds()-G<f)},{cpu:S,jit:E,diagnosticWallNs:L}=await Q(T,{intervalUs:d}),F=[],V=ut(S);if(V)F.push(V);let j=ct(E);if(j)F.push(j);return{cpu:S,jit:E,diagnosticWallNs:L,warnings:F}}function ut(u){let m=O(u);if(m>=it)return;return{code:"low-sample-count",message:`Only ${m} CPU sample(s) at ${u.samplingIntervalUs}\xB5s (target ${Ee}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:m,target:Ee,intervalUs:u.samplingIntervalUs}}}function ct(u){let{llint:m,baseline:d,dfg:f,ftl:T}=u.tiers,S=m+d+f+T;if(S===0)return;let E=m/S*100,L=d/S*100,F=f/S*100,V=T/S*100;if(E+L<=st)return;return{code:"jit-cold",message:`${(E+L).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:E,baselinePct:L,dfgPct:F,ftlPct:V}}}function ee(u,m,d){let f=A(m);return ze(u,f,{label:f,baseline:m.baseline,group:m.groupName,description:m.opts?.description,groupDescription:m.groupDescription,isolated:d,params:m.params,skipped:m.skipped})}async function _(u,m,d){let T=m.some((j)=>!j.skipped)&&d.noiseCheck!==!1?a():void 0,S=T?c(T):void 0,E=new Map,L=new Map;m.forEach((j,G)=>{if(j.groupName===void 0||j.skipped)return;if(!E.has(j.groupName))E.set(j.groupName,G);L.set(j.groupName,G)});let F=[],V=[];for(let j=0;j<m.length;j++){let G=m[j],ne=ee(u,G,d.markIsolated);if(F.push(ne),G.skipped)continue;let se=G.groupName!==void 0&&E.get(G.groupName)===j,be=G.groupName!==void 0&&L.get(G.groupName)===j;if(se&&G.groupBefore)await G.groupBefore();if(G.opts?.before)await G.opts.before();let te={budgetMs:G.opts?.budgetMs??d.budgetMs,samples:G.opts?.samples??d.samples,minSamples:G.opts?.minSamples??d.minSamples,warmup:d.warmup,gc:sn(G,d.gc??!1)},ae=await on(G.fn,te);if(V.push(x({workload:ne,configFingerprint:i({budgetMs:te.budgetMs??null,samples:te.samples??null,minSamples:te.minSamples??null,gc:te.gc??!1}),trials:ae.trials,timing:ae.timing,warnings:S&&V.length===0?[...ae.warnings,S]:ae.warnings})),an(G,d.cpu??!1)){let ge=d.cpuIntervalUs??De,he=await mn(G.fn,{intervalUs:ge});V.push(p({workload:ne,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:ge}),diagnosticWallNs:he.diagnosticWallNs,cpu:he.cpu,jit:he.jit,warnings:he.warnings,artifacts:[]}))}if(un(G,d.alloc??!1)){let ge=await ln(G.fn);V.push(p({workload:ne,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:ge.diagnosticWallNs,memory:ge.memory,warnings:[],artifacts:[]}))}if(G.opts?.after)await G.opts.after();if(be&&G.groupAfter)await G.groupAfter()}return r(F,V,T)}
|
|
16
|
-
export{C,e,I,b,n,O,g,J,w,t,z,ce,k,q,h,o,K,Y,D,ue,X,y,N,r,B,me,x,p,le,i,P,Z,l,M,s,a,c,Q,ye,v,xe,Pe,W,de,pe,A,ie,fe,U,ee,_};
|
package/chunk-p3342c5c.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{C,e,I,b,n,O,g,J,w,t,z,ce,k,q,h,o,K,Y,D,ue,X,y,r,B,me,x,p,le,i,P,s,a,c,Q,W,pe,U,_}from"./chunk-17t12ta6.js";function ln(l,v,M){let N=l[0];if(N==="bun"||N?.endsWith("/bun"))return{argv:[N,...v,...l.slice(1)],env:M};return{argv:l,env:{...process.env,...M,BUN_OPTIONS:v.join(" ")}}}function kt(l){return l.startsWith("file://")?l.slice(7):l}function pn(l,v,M){let N=l.nodes,A=N.length,ie=new Map,ee=[],de=new Map,Z=new Int32Array(A);for(let Ce=0;Ce<A;Ce++){let ve=N[Ce],Me=ve.callFrame,Ne=kt(Me.url),Ue=ie.get(Me.functionName);if(Ue===void 0)Ue=new Map,ie.set(Me.functionName,Ue);let Oe=Ue.get(Ne);if(Oe===void 0)Oe=ee.length,Ue.set(Ne,Oe),ee.push({key:e("fr",Me.functionName,Ne),name:Me.functionName,url:Ne||void 0,line:Me.lineNumber>=0?Me.lineNumber:void 0,col:Me.columnNumber>=0?Me.columnNumber:void 0});Z[Ce]=Oe,de.set(ve.id,Ce)}let fe=Array(A);for(let Ce=0;Ce<A;Ce++){let ve=N[Ce];fe[Ce]={id:ve.id,frameIx:Z[de.get(ve.id)],children:ve.children??[]}}let xe=new Float64Array(A),ye=new Float64Array(A),{samples:$e,timeDeltas:Pe}=l;for(let Ce=0;Ce<$e.length;Ce++){let ve=de.get($e[Ce]);if(ve===void 0)continue;xe[ve]+=Pe[Ce]??0,ye[ve]+=1}let Re=new Int32Array(A).fill(-1);for(let Ce=0;Ce<A;Ce++){let ve=N[Ce].children;if(!ve)continue;for(let Me of ve){let Ne=de.get(Me);if(Ne!==void 0)Re[Ne]=Ce}}let Ie=[],Te=[];for(let Ce=A-1;Ce>=0;Ce--)if(Re[Ce]===-1)Te.push(Ce);while(Te.length>0){let Ce=Te.pop();Ie.push(Ce);let ve=N[Ce].children;if(!ve)continue;for(let Me of ve){let Ne=de.get(Me);if(Ne!==void 0&&Re[Ne]===Ce)Te.push(Ne)}}let Be=new Float64Array(A);for(let Ce=Ie.length-1;Ce>=0;Ce--){let ve=Ie[Ce];Be[ve]+=xe[ve];let Me=Re[ve];if(Me>=0)Be[Me]+=Be[ve]}let Fe=Array(ee.length),De=[];for(let Ce=0;Ce<A;Ce++){let ve=fe[Ce].frameIx,Me=Fe[ve];if(Me)Me.selfUs+=xe[Ce],Me.totalUs+=Be[Ce],Me.samples+=ye[Ce];else{let Ne={frameIx:ve,selfUs:xe[Ce],totalUs:Be[Ce],samples:ye[Ce]};Fe[ve]=Ne,De.push(Ne)}}return{origin:v,samplingIntervalUs:M,frames:ee,nodes:fe,totals:De.sort((Ce,ve)=>ve.selfUs-Ce.selfUs),samples:{nodeIds:l.samples,timeDeltasUs:l.timeDeltas}}}async function Fn(l){let v=`${l.artifactDir}/${l.fileName}`,{argv:M,env:N}=ln(l.argv,["--cpu-prof","--cpu-prof-dir",l.artifactDir,"--cpu-prof-name",l.fileName,"--cpu-prof-interval",String(l.intervalUs)],l.env),A=Bun.nanoseconds(),ee=await Bun.spawn(M,{cwd:l.cwd,env:N,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,de=Bun.nanoseconds()-A,Z=Bun.file(v);if(!await Z.exists())return{diagnosticWallNs:de,exitCode:ee,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${v} after exit ${ee}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:v,argv:l.argv}}]};let fe=await Z.json(),xe=pn(fe,"cpu-prof",l.intervalUs),ye=fe.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:de,exitCode:ee,artifactPath:v,cpu:xe,warnings:ye}}function Bn(l){let{node_fields:M,node_types:N}=l.snapshot.meta,A=M.indexOf("type"),ie=M.indexOf("self_size"),ee=M.length,de=N[0];if(A===-1||ie===-1||!Array.isArray(de))return{origin:"heap-prof",typeCounts:[],objectCount:l.snapshot.node_count};let Z=de.length,fe=Array(Z),xe=new Map,ye=[],$e=0,Pe=l.nodes,Re=Pe.length;for(let De=0;De<Re;De+=ee){let Ce=Pe[De+A],ve=Pe[De+ie]??0;$e+=ve;let Me;if(Ce>=0&&Ce<Z){if(Me=fe[Ce],Me===void 0)Me={type:de[Ce],count:0,bytes:0},fe[Ce]=Me,ye.push(Me)}else{let Ne=`unknown(${Ce})`;if(Me=xe.get(Ne),Me===void 0)Me={type:Ne,count:0,bytes:0},xe.set(Ne,Me),ye.push(Me)}Me.count++,Me.bytes+=ve}let Ie=ye.sort((De,Ce)=>Ce.count-De.count),Te=Ie.slice(0,20),Be=Ie.slice(20),Fe=Te.map(({type:De,count:Ce,bytes:ve})=>({type:De,count:Ce,retainedBytes:ve}));if(Be.length>0){let De=0,Ce=0;for(let ve of Be)De+=ve.count,Ce+=ve.bytes;Fe.push({type:"other",count:De,retainedBytes:Ce})}return{origin:"heap-prof",heapSizeBytes:$e,objectCount:l.snapshot.node_count,typeCounts:Fe}}async function An(l){let v=`${l.artifactDir}/${l.fileName}`,{argv:M,env:N}=ln(l.argv,["--heap-prof","--heap-prof-dir",l.artifactDir,"--heap-prof-name",l.fileName],l.env),A=Bun.nanoseconds(),ee=await Bun.spawn(M,{cwd:l.cwd,env:N,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,de=Bun.nanoseconds()-A,Z=Bun.file(v);if(!await Z.exists())return{diagnosticWallNs:de,exitCode:ee,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${v} after exit ${ee}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:v,argv:l.argv}}]};let fe=await Z.json(),xe=Bn(fe);return{diagnosticWallNs:de,exitCode:ee,artifactPath:v,heap:xe,warnings:[]}}var Pt=1000;async function Un(l,v={}){let M=v.intervalUs??Pt,{Session:N}=await import("inspector/promises"),A=new N;A.connect();let ie=Bun.nanoseconds();try{await A.post("Profiler.enable"),await A.post("Profiler.setSamplingInterval",{interval:M}),await A.post("Profiler.start");let ee=await l(),{profile:de}=await A.post("Profiler.stop"),Z=Bun.nanoseconds()-ie,fe=pn(de,"inspector",M);return{result:ee,cpu:fe,diagnosticWallNs:Z}}finally{A.disconnect()}}function $t(l){let v=l>>>0;return()=>{v=v+1831565813|0;let M=Math.imul(v^v>>>15,1|v);return M=M+Math.imul(M^M>>>7,61|M)^M,((M^M>>>14)>>>0)/4294967296}}var fn=2000,xt=2000;function Mt(l){let v=l.length,M=v>>1;return v%2===0?(l[M-1]+l[M])/2:l[M]}function jn(l,v,M){if(l.length<=M)return l;let N=[...l];for(let A=0;A<M;A++){let ie=A+Math.floor(v()*(N.length-A)),ee=N[A];N[A]=N[ie],N[ie]=ee}return N.slice(0,M)}class Mn{sorted;rankOf;counts;n;constructor(l){let v=l.length,M=new Uint32Array(v);for(let N=0;N<v;N++)M[N]=N;M.sort((N,A)=>l[N]-l[A]),this.sorted=new Float64Array(v),this.rankOf=new Uint32Array(v);for(let N=0;N<v;N++)this.sorted[N]=l[M[N]],this.rankOf[M[N]]=N;this.n=v,this.counts=new Uint32Array(v)}resampleMedian(l){let{n:v,counts:M,sorted:N,rankOf:A}=this;M.fill(0);for(let fe=0;fe<v;fe++)M[A[Math.floor(l()*v)]]++;let ie=v+1>>1,ee=v%2===0?ie+1:ie,de=0,Z=-1;for(let fe=0;fe<v;fe++){if(de+=M[fe],Z<0&&de>=ie)Z=fe;if(de>=ee)return Z===fe?N[fe]:(N[Z]+N[fe])/2}return N[v-1]}}function Rt(l,v){let M=new Float64Array(l.length+v.length+1);return M.set(l),M[l.length]=Number.NaN,M.set(v,l.length+1),Bun.hash.crc32(M)}function _n(l,v,M={}){let N=M.seed??Rt(l,v),A=$t(N),ie=M.iterations??xt,ee=l.length>fn||v.length>fn,de=new Mn(jn(l,A,fn)),Z=new Mn(jn(v,A,fn)),fe=Mt(de.sorted),xe=new Float64Array(ie);for(let ye=0;ye<ie;ye++){let $e=de.resampleMedian(A),Pe=Z.resampleMedian(A);xe[ye]=fe===0?Pe-$e===0?0:1/0:(Pe-$e)/fe*100}return xe.sort(),{ci95:[o(xe,0.025),o(xe,0.975)],seed:N,data:{subsampled:ee,iterations:ie}}}function vt(l){let v=l<0?-1:1,M=Math.abs(l),N=0.254829592,A=-0.284496736,ie=1.421413741,ee=-1.453152027,de=1.061405429,Z=0.3275911,fe=1/(1+0.3275911*M),xe=1-((((1.061405429*fe+-1.453152027)*fe+1.421413741)*fe+-0.284496736)*fe+0.254829592)*fe*Math.exp(-M*M);return v*xe}function Ct(l){return 0.5*(1+vt(l/Math.SQRT2))}function Ln(l,v){let M=l.length,N=v.length,A=M+N,ie=new Float64Array(l),ee=new Float64Array(v);ie.sort(),ee.sort();let de=0,Z=0,fe=0,xe=0,ye=0;while(fe<M||xe<N){let Be=xe>=N||fe<M&&ie[fe]<=ee[xe]?ie[fe]:ee[xe],Fe=0;while(fe<M&&ie[fe]===Be)Fe++,fe++;let De=0;while(xe<N&&ee[xe]===Be)De++,xe++;let Ce=Fe+De,ve=ye+(Ce+1)/2;if(de+=Fe*ve,Ce>1)Z+=Ce**3-Ce;ye+=Ce}let $e=de-M*(M+1)/2,Pe=M*N/2,Re=Math.sqrt(M*N*(A+1-Z/(A*(A-1)))/12),Ie=Re===0?0:($e-Pe)/Re,Te=Math.min(1,Math.max(0,2*(1-Ct(Math.abs(Ie)))));return{u:$e,z:Ie,pValue:Te}}var d={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Rn=5;function gn(l,v){if(l===0)return v===0?0:1/0;return(v-l)/l*100}function Vn(l){let v=new Map;for(let M of l.measurements){let N=`${M.workloadId}\x00${M.phase}`;if(!v.has(N))v.set(N,M)}return v}function Tt(l,v,M){return{base:l,cand:v,baseByPhase:Vn(l),candByPhase:Vn(v),candWorkloads:new Map(v.workloads.map((N)=>[N.id,N])),environmentMismatch:It(l,v),effectiveTimingPct:Math.max(M.timingPct,l.environment?.noise.floorPct??0,v.environment?.noise.floorPct??0)}}function It(l,v){let M=[];if(l.platform.os!==v.platform.os)M.push({field:"platform.os",base:l.platform.os,cand:v.platform.os});if(l.platform.arch!==v.platform.arch)M.push({field:"platform.arch",base:l.platform.arch,cand:v.platform.arch});if(l.bunVersion!==v.bunVersion)M.push({field:"bunVersion",base:l.bunVersion,cand:v.bunVersion});if(l.environment&&v.environment){if(l.environment.cpuModel!==v.environment.cpuModel)M.push({field:"cpuModel",base:l.environment.cpuModel,cand:v.environment.cpuModel});if(l.environment.cores!==v.environment.cores)M.push({field:"cores",base:l.environment.cores,cand:v.environment.cores})}if(M.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${M.map((N)=>N.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:M}}}function St(l){let v=[];for(let N of l){if(!N.timing)continue;let A=1+N.timing.medianDeltaPct/100;if(Number.isFinite(A)&&A>0)v.push(Math.log(A))}if(v.length===0)return null;let M=v.reduce((N,A)=>N+A,0)/v.length;return(Math.exp(M)-1)*100}function ne(l,v,M=d){let N=Tt(l,v,M);return{effectiveTimingPct:N.effectiveTimingPct,compare:(A)=>Ot(N,A,M),unmatched(){let A=new Set(l.workloads.map((ie)=>ie.id));return{baseOnly:l.workloads.filter((ie)=>!N.candWorkloads.has(ie.id)),candOnly:v.workloads.filter((ie)=>!A.has(ie.id))}}}}function te(l,v){let M=0,N=0,A=0;for(let ie of l){if(!ie.timing)continue;if(ie.timing.verdict==="regressed")M++;else if(ie.timing.verdict==="improved")N++;else A++}return{matched:l.length,regressed:M,improved:N,unchanged:A,geomeanPct:St(l),effectiveTimingPct:v,verdict:l.some((ie)=>ie.verdict==="fail")?"fail":"pass"}}function L(l,v,M=d){let N=ne(l,v,M),A=[];for(let ie of l.workloads){let ee=N.compare(ie.id);if(ee)A.push(ee)}return{comparisons:A,unmatched:N.unmatched(),summary:te(A,N.effectiveTimingPct)}}function Ot(l,v,M){let{baseByPhase:N,candByPhase:A,effectiveTimingPct:ie}=l,ee=N.get(`${v}\x00timing`),de=A.get(`${v}\x00timing`),Z=N.get(`${v}\x00cpu`),fe=A.get(`${v}\x00cpu`),xe=N.get(`${v}\x00heap`),ye=A.get(`${v}\x00heap`),$e=l.candWorkloads.get(v),Pe=ee?.id??Z?.id??xe?.id,Re=de?.id??fe?.id??ye?.id??$e?.id;if(!Pe||!Re)return;let Ie=!1,Te=[];if(l.environmentMismatch)Te.push(l.environmentMismatch);let Be;if(ee?.timing&&$e?.skipped&&!de?.timing)Be={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},Te.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:v}});else if(ee?.timing&&de?.timing){let Ce=ee.timing.samples,ve=de.timing.samples,Me=gn(ee.timing.median,de.timing.median),Ne=gn(ee.timing.mean,de.timing.mean),Ue=(Oe,Ae)=>{if(Oe>ie)return"regressed";if(Ae<-ie)return"improved";return"unchanged"};if(Ce.length<Rn||ve.length<Rn){let Oe=Ue(Me,Me);if(Oe==="regressed")Ie=!0;Be={medianDeltaPct:Me,meanDeltaPct:Ne,verdict:Oe},Te.push({code:"thin-comparison",message:`Only ${Ce.length} baseline / ${ve.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Rn}+ per side).`,data:{baseSamples:Ce.length,candSamples:ve.length}})}else{let Oe=_n(Ce,ve,{iterations:M.bootstrapIterations}),Ae=Ln(Ce,ve),_e=Ae.pValue<M.alpha?Ue(Oe.ci95[0],Oe.ci95[1]):"unchanged";if(_e==="regressed")Ie=!0;Be={medianDeltaPct:Me,meanDeltaPct:Ne,ci95:Oe.ci95,pValue:Ae.pValue,seed:Oe.seed,verdict:_e}}}let Fe;if(Z?.cpu&&fe?.cpu){let Ce=new Map(Z.cpu.totals.map((Oe)=>[Z.cpu.frames[Oe.frameIx].key,Oe])),ve=new Map(fe.cpu.totals.map((Oe)=>[fe.cpu.frames[Oe.frameIx].key,Oe])),Me=new Map(Z.cpu.frames.map((Oe)=>[Oe.key,Oe.name])),Ne=new Map(fe.cpu.frames.map((Oe)=>[Oe.key,Oe.name]));Fe=[...new Set([...Ce.keys(),...ve.keys()])].map((Oe)=>{let Ae=Ce.get(Oe)?.selfUs??0,_e=ve.get(Oe)?.selfUs??0;return{frameKey:Oe,name:Ne.get(Oe)??Me.get(Oe)??Oe,baseSelfUs:Ae,candSelfUs:_e,deltaPct:gn(Ae,_e)}}).sort((Oe,Ae)=>Math.abs(Ae.deltaPct)-Math.abs(Oe.deltaPct));for(let Oe of Fe)if((Oe.baseSelfUs>=M.minFrameSelfUs||Oe.candSelfUs>=M.minFrameSelfUs)&&Oe.deltaPct>M.frameSelfPct)Ie=!0}let De;if(xe?.heap&&ye?.heap){let Ce=new Map(xe.heap.typeCounts.map((Ne)=>[Ne.type,Ne])),ve=new Map(ye.heap.typeCounts.map((Ne)=>[Ne.type,Ne]));De=[...new Set([...Ce.keys(),...ve.keys()])].map((Ne)=>{let Ue=Ce.get(Ne),Oe=ve.get(Ne);return{type:Ne,baseCount:Ue?.count??0,candCount:Oe?.count??0,baseBytes:Ue?.retainedBytes,candBytes:Oe?.retainedBytes,deltaPct:gn(Ue?.count??0,Oe?.count??0)}}).sort((Ne,Ue)=>Math.abs(Ue.deltaPct)-Math.abs(Ne.deltaPct));for(let Ne of De)if(Ne.deltaPct>M.heapTypePct)Ie=!0}return{id:e("cmp",Pe,Re),baselineMeasurementId:Pe,candidateMeasurementId:Re,timing:Be,...Te.length>0&&{warnings:Te},frames:Fe,heapTypes:De,thresholds:{...M,effectiveTimingPct:ie},verdict:Ie?"fail":"pass"}}var Ze="node_modules/.cache/ostia",Dt=".ostia/baselines",Nt={warmup:3,outDir:Ze,baselineDir:Dt,baseline:"main",thresholds:d,workloads:[]};class T extends Error{}var Et={runs:"samples"};function zn(l,v){for(let[M,N]of Object.entries(Et))if(M in l)throw new T(`${v}: "${M}" was renamed to "${N}".`);return{...Nt,...l,thresholds:{...d,...l.thresholds??{}}}}async function Hn(l){let v=Bun.file(l);if(!await v.exists())return;let M;try{M=await v.json()}catch(N){throw new T(`${l}: ${N instanceof Error?N.message:String(N)}`)}return zn(M,l)}async function Gn(l){let v=l.startsWith("/")?l:`${process.cwd()}/${l}`;if(!await Bun.file(v).exists())return;let M;try{M=await import(v)}catch(N){throw new T(`${l}: ${N instanceof Error?N.message:String(N)}`)}return zn(M.default??{},l)}async function E(l){if(l!==void 0)return l.endsWith(".ts")?Gn(l):Hn(l);return await Gn("ostia.config.ts")??Hn("ostia.config.json")}function u(l,v){return`${l.baselineDir}/${v??l.baseline}.json`}async function re(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var Wt=10,Ft=3000000000,Bt=3;function vn(l){if(l.timeSource)Y(l.timeSource);let v=l.warmup??Bt,M=l.samples,N=l.minSamples??Wt,A=M??N,ie=M!==void 0?0:l.budgetMs!==void 0?l.budgetMs*1e6:Ft,ee=l.timeSource!==void 0,de=l.ignoreExitCodes??[],Z=new Set(de),fe=[],xe=0,ye=0,$e=!1,Pe;function Re(){if($e)return!0;if(M!==void 0)return ye>=M;return ye>=A&&xe>=ie}async function Ie(Te,Be){if(l.prepare)await X(l.prepare,{phase:Te,index:Be},{cwd:l.cwd,env:l.env,timeoutMs:l.timeoutMs,signal:l.signal});return ue(l)}return{async warmup(){for(let Te=0;Te<v;Te++){if(l.signal?.aborted)return;await Ie("warmup",Te)}},async step(){if(Re()||l.signal?.aborted)return!1;let Te=await Ie("timing",ye);if(l.signal?.aborted)return!1;if(Te.timeSourceNoMatch)Pe??=Te.timeSourceMissOutput;if(fe.push({i:ye,wallNs:Te.wallNs,exitCode:Te.exitCode??void 0,userNs:Te.userNs,systemNs:Te.systemNs,maxRssBytes:Te.maxRssBytes,...Te.reportedNs!==void 0&&{reportedNs:Te.reportedNs},...Te.timedOut?{timedOut:!0}:{},...Te.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),xe+=Te.wallNs,ye++,Te.exitCode!==null&&Te.exitCode!==0&&!Z.has(Te.exitCode))$e=!0;return!0},done:Re,result(){let Te=fe.filter((Me)=>!Me.timedOut&&!Me.timeSourceNoMatch),Be=Te.map((Me)=>ee?Me.reportedNs:Me.wallNs),Fe=[],De=fe.filter((Me)=>Me.timedOut).length;if(De>0)Fe.push({code:"timeout",message:`${De} of ${fe.length} trial(s) timed out after ${l.timeoutMs}ms.`,data:{timeoutMs:l.timeoutMs,trials:De}});let Ce=fe.filter((Me)=>Me.timeSourceNoMatch).length;if(Ce>0&&l.timeSource){let{pattern:Me}=l.timeSource;Fe.push({code:"time-source-no-match",message:`${Ce} of ${fe.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof Me==="string"?Me:Me.source,trials:Ce,...Pe!==void 0&&{output:Pe}}})}if(Be.length===0)return{trials:fe,warnings:Fe};let ve=h(Be);return Fe.push(...K(ve,Te.map((Me)=>Me.exitCode),ee?"reported":"subprocess",de)),{trials:fe,timing:ve,warnings:Fe}}}}async function Cn(l){await l.warmup();while(await l.step());}async function ae(l){let v=vn(l);return await Cn(v),v.result()}function G(l,v=[]){if(!l.timing)return!0;let M=new Set(v);return l.trials.some((N)=>N.exitCode!==void 0&&N.exitCode!==0&&!M.has(N.exitCode))}function hn(l,v){let M={samples:v.samples,minSamples:v.minSamples};for(let[N,A]of Object.entries(M))if(A!==void 0&&(!Number.isFinite(A)||A<1))throw RangeError(`${l}: ${N} must be >= 1, got ${A}`);if(v.budgetMs!==void 0&&!Number.isFinite(v.budgetMs))throw RangeError(`${l}: budgetMs must be finite, got ${v.budgetMs}`)}import{appendFileSync as At,existsSync as Tn,lstatSync as Ut,realpathSync as jt,renameSync as _t}from"fs";import{isAbsolute as Kn,relative as Lt,sep as Vt}from"path";class R extends Error{}var Ht=new URL("./runner.ts",import.meta.url).pathname,cn={base:"HEAD",rounds:15,thresholdPct:10,geomeanThresholdPct:1.5,confirm:2};function Jn(l,v){let M=Bun.spawnSync(["git",...l],{cwd:v,stdout:"pipe",stderr:"ignore"});return M.success?M.stdout.toString().trim():void 0}var Gt=`
|
|
3
|
-
;globalThis.__ostia_ab_base__;
|
|
4
|
-
`,zt="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function Kt(l){for await(let v of new Bun.Glob(zt).scan({cwd:l,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(v)||!Ut(v).isFile())continue;At(v,Gt)}}async function Jt(l,v,M){if(Tn(v))return;let N=`${v}.tmp-${process.pid}`;await Bun.spawn(["rm","-rf",N]).exited,await Bun.spawn(["mkdir","-p",N]).exited;let A=Bun.spawn(["git","archive","--format=tar",l],{cwd:M,stdout:"pipe",stderr:"pipe"}),ie=Bun.spawn(["tar","-x","-C",N],{stdin:A.stdout,stderr:"pipe"}),[ee,de]=await Promise.all([A.exited,ie.exited]);if(ee!==0||de!==0){let Z=await new Response(ee!==0?A.stderr:ie.stderr).text();throw await Bun.spawn(["rm","-rf",N]).exited,Error(`Could not extract ${l}: ${Z.trim()}`)}await Kt(N);try{_t(N,v)}catch{await Bun.spawn(["rm","-rf",N]).exited}}function Yt(l){return o(Float64Array.from(l).sort(),0.5)}function qt(l){if(!l.repeats?.length)return l.medianRatio;return Yt([l.medianRatio,...l.repeats.map((v)=>v.medianRatio)])}function Qt(l,v){let M=l.map((de)=>de.paired).filter((de)=>de!==void 0),N=0;for(let de of M)N+=Math.log(qt(de));let A=M.length>0?(Math.exp(N/M.length)-1)*100:null,ie=M.filter((de)=>de.verdict==="regressed").length,ee=M.filter((de)=>de.verdict==="improved").length;return{...v,matched:M.length,regressed:ie,improved:ee,unchanged:M.length-ie-ee,unconfirmed:M.filter((de)=>de.confirmed===!1).length,outputDiffers:M.filter((de)=>!de.sameOutput).length,geomeanPct:A,verdict:ie>0||A!==null&&A>v.geomeanThresholdPct?"fail":"pass"}}async function j(l){let v=l.base??cn.base,M=l.rounds??cn.rounds,N=l.thresholdPct??cn.thresholdPct,A=l.geomeanThresholdPct??cn.geomeanThresholdPct,ie=l.confirm??cn.confirm;if(!Number.isInteger(M)||M<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${M}`);if(!Number.isInteger(ie)||ie<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${ie}`);for(let[ve,Me]of Object.entries({thresholdPct:N,geomeanThresholdPct:A}))if(!Number.isFinite(Me)||Me<0)throw RangeError(`ab: ${ve} must be >= 0, got ${Me}`);let ee=l.cwd??process.cwd(),de=l.outDir??Ze,Z=Kn(de)?de:`${ee}/${de}`,fe=`${Z}/ab-tmp`,xe=Jn(["rev-parse","--show-toplevel"],ee);if(xe===void 0)throw new R(`${ee} is not inside a git repository.`);let ye=Jn(["rev-parse","--verify","--quiet",`${v}^{commit}`],ee);if(ye===void 0)throw new R(`"${v}" is not a commit in ${xe}.`);let $e=`${Z}/ab/${ye}`;await Jt(ye,$e,ee);let Pe=l.noiseCheck===!1?void 0:a(),Re=(ve)=>Kn(ve)?ve:`${ee}/${ve}`,Ie=l.suites.map(Re),Te=Ie.map((ve,Me)=>{if(!Tn(ve))throw Error(`Suite not found: ${l.suites[Me]}`);let Ne=Lt(xe,jt(ve));if(Ne===".."||Ne.startsWith(`..${Vt}`))throw new R(`${l.suites[Me]} is outside ${xe}.`);return Tn(`${$e}/${Ne}`)?`${$e}/${Ne}`:""}),Be=(l.preload??[]).map(Re),Fe=l.bunFlags??[],De=0,Ce=async(ve,Me={})=>{let Ne=`${fe}/${e("ab-run",Ie[ve],De++)}.json`,Ue={filter:l.filter,rounds:M,thresholdPct:N,preload:Be,...Me},Oe=D(l.timeoutMs,l.signal),_e=await Bun.spawn(["bun",...Fe,Ht,Ie[ve],Te[ve],Ne,JSON.stringify(Ue)],{cwd:ee,stdout:"inherit",stderr:"inherit",stdin:"ignore",...Oe.spawn}).exited;if(l.signal?.aborted)return;if(Oe.timedOut())throw Error(`A/B suite timed out after ${l.timeoutMs}ms: ${l.suites[ve]}`);if(_e!==0)throw Error(`A/B suite failed: ${l.suites[ve]} (runner exited ${_e})`);return s(Ne)};try{let ve=[],Me=[],Ne=new Map,Ue=[],Oe=[];for(let Se=0;Se<Ie.length;Se++){let Ee=await Ce(Se);if(!Ee)break;ve.push(...Ee.workloads),Me.push(...Ee.measurements);for(let Ve of Ee.measurements)Ne.set(Ve.workloadId,Se);Ue.push(...Ee.unmatched?.baseOnly??[]),Oe.push(...Ee.unmatched?.candOnly??[])}for(let Se of Me){let Ee=Se.paired;if(!Ee?.flagged||ie===0)continue;Ee.repeats=[];for(let Ve=0;Ve<ie&&!l.signal?.aborted;Ve++){let He=(await Ce(Ne.get(Se.workloadId),{workloadIds:[Se.workloadId]}))?.measurements[0]?.paired;if(!He)break;Ee.repeats.push({medianRatio:He.medianRatio,p25:He.p25,p75:He.p75,...He.flagged&&{flagged:He.flagged}})}Ee.confirmed=Ee.repeats.length===ie&&Ee.repeats.every((Ve)=>Ve.flagged===Ee.flagged),Ee.verdict=Ee.confirmed?Ee.flagged:"unchanged"}let Ae=Pe&&c(Pe);if(Ae&&Me.length>0)Me[0].warnings.push(Ae);if(l.signal?.aborted&&Me.length>0)Me[Me.length-1].warnings.push({code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites had already completed."});let _e=r(ve,Me,Pe);return _e.unmatched={baseOnly:Ue,candOnly:Oe},_e.ab=Qt(Me,{base:{ref:v,sha:ye},rounds:M,thresholdPct:N,geomeanThresholdPct:A}),_e}finally{await Bun.spawn(["rm","-rf",fe]).exited}}async function H(l,v){let M=new Set;for(let N of l)for await(let A of new Bun.Glob(N).scan({cwd:v,absolute:!1}))M.add(A);return[...M].sort()}var In=new URL("./runner.ts",import.meta.url).pathname;function se(){return Math.max(1,navigator.hardwareConcurrency||1)}async function F(l,v){return H(l,v)}function Xt(l){if(l===void 0)return;return l==="auto"?se():l}async function V(l,v,M=process.cwd()){return{suites:l.suites.length>0?l.suites:v?.suites?await F(v.suites,M):[],budgetMs:l.budgetMs??v?.budgetMs,samples:l.samples??v?.samples,minSamples:l.minSamples??v?.minSamples,jobs:l.jobs??Xt(v?.jobs),gc:l.gc??v?.gc??!1,cpu:l.cpu??v?.cpu??!1,cpuIntervalUs:l.cpuIntervalUs??v?.cpuIntervalUs,alloc:l.alloc??v?.alloc??!1,peakMem:l.peakMem??v?.peakMem??!1,filter:l.filter??v?.filter,isolate:l.isolate??v?.isolate??!1,preload:l.preload.length>0?l.preload:v?.preload??[],bunFlags:l.bunFlags.length>0?l.bunFlags:v?.bunFlags??[],outDir:l.outDir??v?.outDir,noiseCheck:l.noiseCheck,timeoutMs:l.timeoutMs??v?.timeoutMs,cwd:M}}var Zt=3,er=16777216;async function S(l){hn("bench",l);let v=l.cwd??process.cwd(),M=l.outDir??Ze,N=`${M.startsWith("/")?M:`${v}/${M}`}/bench-tmp`,A=Math.max(1,Math.floor(l.jobs??1)),ie={budgetMs:l.budgetMs,samples:l.samples,minSamples:l.minSamples,gc:l.gc,cpu:l.cpu,cpuIntervalUs:l.cpuIntervalUs,alloc:l.alloc,peakMem:l.peakMem,noiseCheck:!1},ee=l.noiseCheck===!1?void 0:a(),de=ee?c(ee):void 0,Z=(Pe)=>Pe.startsWith("/")?Pe:`${v}/${Pe}`,fe=l.suites.map(Z),xe=(l.preload??[]).map(Z),ye=l.bunFlags??[],$e=async(Pe,Re,Ie)=>{let Te=new Set,Be=0,Fe,De=async()=>{while(Fe===void 0&&!l.signal?.aborted&&Be<Pe.length){let Ce=Be++;try{let ve=D(l.timeoutMs,l.signal),Me=Bun.spawn(Pe[Ce],{cwd:v,...Ie&&{env:{...process.env,...Ie}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...ve.spawn});Te.add(Me);let Ne=await Me.exited;if(Te.delete(Me),l.signal?.aborted)return;if(ve.timedOut())throw Error(`Bench suite timed out after ${l.timeoutMs}ms: ${Re(Ce)}`);if(Ne!==0)throw Error(`Bench suite failed: ${Re(Ce)} (runner exited ${Ne})`)}catch(ve){Fe??=ve instanceof Error?ve:Error(String(ve));for(let Me of Te)Me.kill()}}};if(await Promise.all(Array.from({length:Math.min(A,Pe.length)},De)),Fe)throw Fe};try{let Pe=fe.map((Se)=>`${N}/${e("bench-plan",Se)}.json`),Re=fe.map((Se)=>`${N}/${e("bench-primary",Se)}.json`),Ie=fe.map((Se,Ee)=>["bun",...ye,In,Se,Re[Ee],JSON.stringify({...ie,filter:l.filter,isolate:l.isolate,preload:xe,planPath:Pe[Ee]})]);await $e(Ie,(Se)=>l.suites[Se]);let Te=await Promise.all(Pe.map(async(Se)=>{if(!await Bun.file(Se).exists())return[];let{tasks:Ee}=await Bun.file(Se).json();return Ee})),Be=await Promise.all(Re.map(async(Se)=>await Bun.file(Se).exists()?s(Se):void 0)),Fe=[];for(let Se=0;Se<Te.length;Se++)for(let Ee of Te[Se])if(Ee.isolate)Fe.push({suiteIndex:Se,taskIds:[Ee.id]});let De=Fe.map((Se,Ee)=>`${N}/${e("bench-item",fe[Se.suiteIndex],Ee)}.json`),Ce=Fe.map((Se,Ee)=>["bun",...ye,In,fe[Se.suiteIndex],De[Ee],JSON.stringify({...ie,taskIds:Se.taskIds,preload:xe,markIsolated:!0})]);await $e(Ce,(Se)=>l.suites[Fe[Se].suiteIndex]);let ve=await Promise.all(De.map(async(Se)=>await Bun.file(Se).exists()?s(Se):void 0)),Me=[];for(let Se=0;Se<Te.length;Se++)for(let Ee of Te[Se]){if(!Ee.peakMem)continue;for(let Ve=0;Ve<Zt;Ve++)Me.push({suiteIndex:Se,workloadId:Ee.workloadId})}let Ne=Me.map((Se,Ee)=>`${N}/${e("bench-peak",fe[Se.suiteIndex],Ee)}.json`);await $e(Me.map((Se,Ee)=>["bun",...ye,In,fe[Se.suiteIndex],Ne[Ee],JSON.stringify({filter:l.filter,preload:xe,peakMemFor:Se.workloadId})]),(Se)=>l.suites[Me[Se].suiteIndex],{OSTIA_PEAK_MEM:"1"});let Ue=new Map;for(let Se=0;Se<Me.length;Se++){let Ee=Bun.file(Ne[Se]);if(!await Ee.exists())continue;let Ve=Me[Se].workloadId,ze=Ue.get(Ve)??[];ze.push(await Ee.json()),Ue.set(Ve,ze)}let Oe=(Se)=>{let Ee=Ue.get(Se.id);if(!Ee?.length)return[];let Ve=(je)=>o(Float64Array.from(je).sort(),0.5),ze=Ve(Ee.map((je)=>je.peakBytes)),He=Math.max(...Ee.map((je)=>je.slackBytes)),We=He>=er&&He>ze/4?[{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${g(He)} the allocator still held (module-scope setup or before hooks that allocate), which the call could reuse without RSS rising: this reading can be low by up to that much. Skip that work when process.env.OSTIA_PEAK_MEM is set.`,data:{slackBytes:He,processes:Ee.length}}]:[];return[p({workload:Se,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:Ve(Ee.map((je)=>je.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:ze},warnings:We,artifacts:[]})]},Ae=[],_e=[];for(let Se=0;Se<Te.length;Se++){let Ee=Be[Se];if(!Ee)continue;let Ve=new Map;for(let Ke of Ee.measurements){let We=Ve.get(Ke.workloadId)??[];We.push(Ke),Ve.set(Ke.workloadId,We)}let ze=0,He=new Map;Fe.forEach((Ke,We)=>{let je=ve[We];if(Ke.suiteIndex===Se&&je)He.set(Ke.taskIds[0],je)});for(let Ke of Te[Se])if(Ke.isolate){let We=He.get(Ke.id);if(!We)continue;let je=We.workloads[0];Ae.push(je);for(let Ye of We.measurements)if(Ye.workloadId===je.id)_e.push(Ye);_e.push(...Oe(je))}else{let We=Ee.workloads[ze];Ae.push(We),ze++;for(let je of Ve.get(We.id)??[])_e.push(je);_e.push(...Oe(We))}}if(de&&_e.length>0)_e[0].warnings=[..._e[0].warnings,de];if(l.signal?.aborted&&_e.length>0){let Se=_e[_e.length-1];Se.warnings=[...Se.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return r(Ae,_e,ee)}finally{await Bun.spawn(["rm","-rf",N]).exited}}function ge(l,v,M=8){if(M<=1)throw RangeError(`range: multiplier must be > 1, got ${M}`);if(l<=0)throw RangeError(`range: start must be > 0, got ${l}`);let N=[];for(let A=l;A<=v;A*=M)N.push(A);if(!N.includes(v))N.push(v);return N}function Xe(l,v){if(v){let M=l.measurements.find((N)=>N.id===v);return M?.cpu?[M]:[]}return l.measurements.filter((M)=>M.phase==="cpu"&&M.cpu)}function nn(l){let v=l.nodes,M=v.length,N=nr(l),A=new Int32Array(M).fill(-1);for(let Z=0;Z<M;Z++)for(let fe of v[Z].children){let xe=N(fe);if(xe!==-1)A[xe]=Z}let ie=[];for(let Z=0;Z<M;Z++)if(A[Z]===-1)ie.push(Z);let ee=[],de=[];for(let Z=ie.length-1;Z>=0;Z--)de.push(ie[Z]);while(de.length>0){let Z=de.pop();ee.push(Z);for(let fe of v[Z].children){let xe=N(fe);if(xe!==-1&&A[xe]===Z)de.push(xe)}}return{count:M,indexOf:N,parentIx:A,roots:ie,order:ee}}function nr(l){let v=l.nodes,M=v.length,N=1/0,A=-1/0,ie=!0;for(let de=0;de<M;de++){let Z=v[de].id;if(!Number.isInteger(Z)){ie=!1;break}if(Z<N)N=Z;if(Z>A)A=Z}if(ie&&M>0&&A-N<M*4+64){let de=A-N+1,Z=new Int32Array(de).fill(-1);for(let fe=0;fe<M;fe++)Z[v[fe].id-N]=fe;return(fe)=>{let xe=fe-N;return xe>=0&&xe<de?Z[xe]:-1}}let ee=new Map;for(let de=0;de<M;de++)ee.set(v[de].id,de);return(de)=>ee.get(de)??-1}function Yn(l,v){let{count:M,indexOf:N,parentIx:A,order:ie}=v,ee=new Float64Array(M),de=new Float64Array(M),Z=l.samples?.nodeIds??[],fe=l.samples?.timeDeltasUs??[];for(let ye=0;ye<Z.length;ye++){let $e=N(Z[ye]);if($e===-1)continue;ee[$e]+=fe[ye]??0,de[$e]+=1}let xe=new Float64Array(M);for(let ye=ie.length-1;ye>=0;ye--){let $e=ie[ye];xe[$e]+=ee[$e];let Pe=A[$e];if(Pe>=0)xe[Pe]+=xe[$e]}return{selfUs:ee,totalUs:xe,samples:de}}var qn={name:"collapsed",async render(l,v={}){return{files:Xe(l,v.measurementId).map((A)=>{let ie=A.cpu,{nodes:ee,frames:de}=ie,Z=nn(ie),fe=Array(Z.count);for(let Re of Z.order){let Ie=de[ee[Re].frameIx].name||"(anonymous)",Te=Z.parentIx[Re];fe[Re]=Te===-1?Ie:`${fe[Te]};${Ie}`}let xe=new Float64Array(Z.count),ye=[],$e=ie.samples?.nodeIds??[];for(let Re=0;Re<$e.length;Re++){let Ie=Z.indexOf($e[Re]);if(Ie===-1)continue;if(xe[Ie]++===0)ye.push(Ie)}let Pe=Array(ye.length);for(let Re=0;Re<ye.length;Re++){let Ie=ye[Re];Pe[Re]=`${fe[Ie]} ${xe[Ie]}`}return{path:`${A.id}.collapsed.txt`,content:Pe.join(`
|
|
5
|
-
`)+(Pe.length>0?`
|
|
6
|
-
`:"")}})}}};var Qn={name:"cpuprofile",async render(l,v={}){let M=Xe(l,v.measurementId),N=[],A=[];for(let ie of M){if(ie.cpu?.origin!=="cpu-prof"&&ie.cpu?.origin!=="inspector"){A.push(`${ie.id} (origin ${ie.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let ee=ie.artifacts.find((Z)=>Z.kind==="cpuprofile");if(!ee){A.push(`${ie.id} (no cpuprofile artifact recorded on this run)`);continue}let de=Bun.file(ee.path);if(!await de.exists()){A.push(`${ie.id} (artifact missing on disk: ${ee.path})`);continue}N.push({path:`${ie.id}.cpuprofile`,content:await de.text()})}if(N.length===0&&A.length>0)return{text:`No .cpuprofile artifacts available:
|
|
7
|
-
${A.map((ie)=>` - ${ie}`).join(`
|
|
8
|
-
`)}
|
|
9
|
-
`};return{files:N}}};var Xn={name:"json",async render(l){return{text:P(l)}}};var Zn={name:"jsonl",async render(l){let{measurements:v,...M}=l;return{text:`${[C({kind:"document",...M}),...v.map((A)=>C({kind:"measurement",...A}))].join(`
|
|
10
|
-
`)}
|
|
11
|
-
`}}};function en(l){return l.measurements.filter((v)=>v.phase==="paired"&&v.timing!==void 0&&v.paired!==void 0)}function qe(l){let v=(l-1)*100;return`${v>=0?"+":""}${v.toFixed(1)}%`}function bn(l){if(!l.flagged)return"";let v=l.repeats?.length?` (repeats: ${l.repeats.map((M)=>qe(M.medianRatio)).join(", ")})`:"";if(l.confirmed===void 0)return`${l.flagged}${v}`;return`${l.confirmed?`${l.flagged}, confirmed`:`${l.flagged}? unconfirmed`}${v}`}function wn(l){return`working tree vs ${l.base.ref} (${l.base.sha.slice(0,7)}) \xB7 ${l.rounds} rounds \xB7 threshold ${l.thresholdPct}% \xB7 geomean threshold ${l.geomeanThresholdPct}%`}function yn(l){let v=l.geomeanPct===null?"Geomean -":`Geomean ${l.geomeanPct>=0?"+":""}${l.geomeanPct.toFixed(1)}% (threshold ${l.geomeanThresholdPct}%)`,M=l.unconfirmed>0?` (${l.unconfirmed} unconfirmed)`:"";return`${v} \xB7 ${l.regressed} regressed, ${l.improved} improved, ${l.unchanged} unchanged of ${l.matched}${M} \xB7 ${l.verdict}`}function kn(l){let v=new Map(l.workloads.map((N)=>[N.id,N])),M=(N)=>v.has(N)?t(v.get(N)):N;return{outputDiffers:en(l).filter((N)=>!N.paired.sameOutput).map((N)=>M(N.workloadId)),baseOnly:(l.unmatched?.baseOnly??[]).map(M),candOnly:(l.unmatched?.candOnly??[]).map(M)}}function dn(l){if(!l?.entry)return;if(l.entry.group!==void 0)return l.entry.group;let v=l.entry.task,M=v.lastIndexOf("/");return M===-1?void 0:v.slice(0,M)}function tn(l){let v=Math.min(...l.map((A)=>A.run.timing.median)),M=new Map;for(let A of l){let ie=dn(A.workload);if(ie===void 0)continue;let ee=M.get(ie);if(ee)ee.push(A);else M.set(ie,[A])}let N=new Map;for(let A of l){let ie=dn(A.workload);if(ie===void 0){N.set(A,v);continue}let ee=M.get(ie)??[A],de=ee.find((Z)=>Z.workload?.baseline);N.set(A,de?de.run.timing.median:Math.min(...ee.map((Z)=>Z.run.timing.median)))}return N}function rn(l){return l.measurements.filter((v)=>v.phase==="timing"&&v.timing!==void 0)}function sn(l,v){let M=new Set(v.map((N)=>N.workloadId));return l.workloads.filter((N)=>N.skipped&&!M.has(N.id))}function Pn(l){for(let v of l.comparisons??[]){let M=v.warnings?.find((N)=>N.code==="environment-mismatch");if(M)return M}return}function on(l){let v=new Map;for(let M of l.measurements){if(M.phase!=="memstats"||!M.memory)continue;let N=v.get(M.workloadId)??{warnings:[]};if(M.memory.bytesPerOp!==void 0)N.retained=M.memory.bytesPerOp;if(M.memory.peakBytes!==void 0)N.peak=M.memory.peakBytes;N.warnings.push(...M.warnings),v.set(M.workloadId,N)}return v}function et(l){return(l/1e6).toFixed(3)}function Sn(l){if(!l?.params)return"";return` (${Object.entries(l.params).map(([M,N])=>`${M}=${N}`).join(", ")})`}function Ge(l){return ce(String(l))}function tr(l){let v;for(let M of l){let N=M?.params?Object.keys(M.params):void 0;if(N?.length!==2)return;if(v===void 0)v=N;else if(N.length!==v.length||N.some((A,ie)=>A!==v[ie]))return}return v}function rr(l){let v=[...l.values()],M=[{name:"Retained/op",cell:(N)=>N?.retained===void 0?"-":g(N.retained)},{name:"Peak mem",cell:(N)=>N?.peak===void 0?"-":g(N.peak)}].filter((N,A)=>v.some((ie)=>A===0?ie.retained!==void 0:ie.peak!==void 0));return{columns:M.map((N)=>N.name),cells:(N)=>M.map((A)=>A.cell(l.get(N)))}}var nt=10,tt=10,rt={name:"markdown",async render(l){let v=new Map(l.workloads.map((Z)=>[Z.id,Z])),M=[];M.push("# Profile Report","");let N=l.git?` \xB7 ${w(l.git)}`:"";if(M.push(`Bun ${l.bunVersion} \xB7 ostia ${l.toolVersion} \xB7 ${l.platform.os}/${l.platform.arch} \xB7 ${l.createdAt}${N}`,""),l.environment)M.push(J(l.environment),"");let A=Pn(l);if(A)M.push(`> \u26A0 ${A.message}`,"");if(l.ab){let Z=en(l);if(M.push("## A/B",""),M.push(wn(l.ab),""),Z.length>0){M.push("| Task | Base | Candidate | Change | p25\u2026p75 | Verdict |","|---|---|---|---|---|---|");for(let xe of Z){let ye=v.get(xe.workloadId),$e=xe.paired,Pe=b(Math.min($e.baseMedianNs,xe.timing.median)),Re=bn($e);M.push(`| ${Ge(t(ye)+Sn(ye))} | ${n($e.baseMedianNs,Pe)} | ${n(xe.timing.median,Pe)} | ${qe($e.medianRatio)} | ${qe($e.p25)}\u2026${qe($e.p75)} | ${Re?`**${Ge(Re)}**`:""} |`)}M.push("")}let fe=kn(l);if(fe.outputDiffers.length>0)M.push(`Output differs from the base: ${fe.outputDiffers.map(Ge).join(", ")}`,"");if(fe.baseOnly.length>0)M.push(`Base only: ${fe.baseOnly.map(Ge).join(", ")}`,"");if(fe.candOnly.length>0)M.push(`Candidate only: ${fe.candOnly.map(Ge).join(", ")}`,"");for(let xe of Z){let ye=t(v.get(xe.workloadId));for(let $e of xe.warnings)M.push(`- **${ye}**: ${$e.message} (\`${$e.code}\`)`)}if(Z.some((xe)=>xe.warnings.length>0))M.push("");M.push(`**${yn(l.ab)}**`,"")}let ie=rn(l),ee=sn(l,ie),de=on(l);if(ie.length>0||ee.length>0){M.push("## Timing","");let Z=new Map,fe=[];for(let Pe of ie){let Re=v.get(Pe.workloadId)?.entry?.group;if(Re===void 0){fe.push(Pe);continue}let Ie=Z.get(Re);if(Ie)Ie.push(Pe);else Z.set(Re,[Pe])}let xe=new Map;for(let[Pe,Re]of Z){let Ie=tr(Re.map((Te)=>v.get(Te.workloadId)));if(Ie)xe.set(Pe,{keys:Ie,runs:Re});else fe.push(...Re)}if(fe.length>0||ee.length>0){let Pe=ie.map((Oe)=>({run:Oe,workload:v.get(Oe.workloadId)})),Re=Pe.length>1,Ie=Re?tn(Pe):void 0,Te=new Map(Pe.map((Oe)=>[Oe.run.id,Ie?.get(Oe)??Oe.run.timing.median])),Be=Re?" Relative |":"",Fe=Re?"---|":"",De=fe.some((Oe)=>k(Oe)),Ce=De?" User/Sys |":"",ve=De?"---|":"",Me=rr(de),Ne=Me.columns.map((Oe)=>` ${Oe} |`).join(""),Ue=Me.columns.map(()=>"---|").join("");M.push(`| Task | Median | Spread (p75\u2026p99) | Mean \xB1 SD | Range | MAD |${Ce}${Ne}${Be}`,`|---|---|---|---|---|---|${ve}${Ue}${Fe}`);for(let Oe of fe){let Ae=v.get(Oe.workloadId),_e=Ge(t(Ae)+Sn(Ae)),Se=Oe.timing,Ee=b(Se.median),Ve=k(Oe),ze=De?` ${Ve?q(Ve):"-"} |`:"",He=Re?` ${z(Se.median/(Te.get(Oe.id)??Se.median),!!Ae?.baseline)} |`:"",Ke=Me.cells(Oe.workloadId).map((We)=>` ${We} |`).join("");M.push(`| ${_e} | ${n(Se.median,Ee)} | ${n(Se.p75,Ee)}\u2026${n(Se.p99,Ee)} | ${n(Se.mean,Ee)} \xB1 ${n(Se.stddev,Ee)} | ${n(Se.min,Ee)}\u2026${n(Se.max,Ee)} | ${n(Se.mad,Ee)} |${ze}${Ke}${He}`)}for(let Oe of ee){let Ae=Ge(t(Oe)+Sn(Oe)),_e=Re?" - |":"",Se=De?" - |":"",Ee=Me.columns.map(()=>" - |").join("");M.push(`| ${Ae} | - skipped | - | - | - | - |${Se}${Ee}${_e}`)}M.push("")}for(let[Pe,{keys:Re,runs:Ie}]of xe){let[Te,Be]=Re,Fe=[],De=[],Ce=new Map;for(let ve of Ie){let Me=v.get(ve.workloadId).params,Ne=Me[Te],Ue=Me[Be];if(!Fe.includes(Ne))Fe.push(Ne);if(!De.includes(Ue))De.push(Ue);Ce.set(`${Ne}\x00${Ue}`,ve)}M.push(`### ${Ge(Pe)} (${Ge(Te)} \xD7 ${Ge(Be)})`,""),M.push(`| ${Ge(Te)} \\ ${Ge(Be)} | ${De.map(Ge).join(" | ")} |`,`|---|${De.map(()=>"---").join("|")}|`);for(let ve of Fe){let Me=De.map((Ne)=>{let Ue=Ce.get(`${ve}\x00${Ne}`);return Ue?n(Ue.timing.median):"-"});M.push(`| ${Ge(ve)} | ${Me.join(" | ")} |`)}M.push("")}let ye=(Pe)=>{let Re=de.get(Pe.workloadId)?.warnings;return Re?.length?[...Pe.warnings,...Re]:Pe.warnings},$e=ie.filter((Pe)=>ye(Pe).length>0);if($e.length>0){M.push("### Warnings","");for(let Pe of $e){let Re=t(v.get(Pe.workloadId));for(let Ie of ye(Pe))M.push(`- **${Re}**: ${Ie.message} (\`${Ie.code}\`)`)}M.push("")}}for(let Z of l.measurements){if(Z.phase!=="cpu"&&Z.phase!=="heap")continue;let fe=t(v.get(Z.workloadId));if(Z.phase==="cpu"){if(M.push(`## CPU capture - ${fe}`,""),M.push(`instrumented, diagnostic wall ${et(Z.diagnosticWallNs??0)}ms`,""),Z.cpu){M.push(`origin: \`${Z.cpu.origin}\`, interval: ${Z.cpu.samplingIntervalUs}\xB5s, samples: ${O(Z.cpu)}`,""),M.push("| Self % | Self (ms) | Total (ms) | Frame |","|---|---|---|---|");let xe=Z.cpu.totals.reduce((ye,$e)=>ye+$e.selfUs,0)||1;for(let ye of Z.cpu.totals.slice(0,nt)){let $e=Z.cpu.frames[ye.frameIx],Pe=(ye.selfUs/xe*100).toFixed(1);M.push(`| ${Pe}% | ${(ye.selfUs/1000).toFixed(2)} | ${(ye.totalUs/1000).toFixed(2)} | ${Ge($e?.name||"(anonymous)")} |`)}if(M.push(""),Z.jit){let ye=Z.jit.tiers;M.push(`JIT tiers: LLInt ${ye.llint} \xB7 Baseline ${ye.baseline} \xB7 DFG ${ye.dfg} \xB7 FTL ${ye.ftl}`,"")}}}else if(M.push(`## Heap snapshot - ${fe}`,""),M.push(`instrumented, diagnostic wall ${et(Z.diagnosticWallNs??0)}ms`,""),Z.heap){M.push(`${Z.heap.objectCount??"?"} objects, ${((Z.heap.heapSizeBytes??0)/1e6).toFixed(2)}MB`,""),M.push("| Count | Type |","|---|---|");for(let xe of Z.heap.typeCounts.slice(0,tt))M.push(`| ${xe.count} | ${Ge(xe.type)} |`);M.push("")}for(let xe of Z.artifacts)M.push(`- artifact: \`${xe.path}\``);for(let xe of Z.warnings)M.push(`- ! ${xe.message} (\`${xe.code}\`)`);if(Z.artifacts.length>0||Z.warnings.length>0)M.push("")}if(l.comparisons&&l.comparisons.length>0){M.push("## Comparisons","");for(let Z of l.comparisons){let fe=l.measurements.find((ye)=>ye.id===Z.candidateMeasurementId),xe=t(fe?v.get(fe.workloadId):v.get(Z.candidateMeasurementId));if(M.push(`### ${Z.verdict==="pass"?"\u2713":"\u2717"} ${xe}`,""),Z.timing){let ye=Z.timing.medianDeltaPct>0?"+":"",$e=Z.timing.verdict==="unchanged"&&Z.timing.pValue!==void 0&&Z.timing.pValue>=Z.thresholds.alpha?"~":"",Pe=[];if(fe?.timing)Pe.push(`n=${fe.timing.samples.length}`);if(Z.timing.ci95)Pe.push(`95% CI [${Z.timing.ci95[0]>0?"+":""}${Z.timing.ci95[0].toFixed(1)}%, ${Z.timing.ci95[1]>0?"+":""}${Z.timing.ci95[1].toFixed(1)}%]`);if(Z.timing.pValue!==void 0)Pe.push(`p=${Z.timing.pValue.toFixed(4)}`);Pe.push(`threshold ${Z.thresholds.effectiveTimingPct.toFixed(1)}%`),M.push(`- timing: ${$e}${ye}${Z.timing.medianDeltaPct.toFixed(1)}% median, ${Pe.join(", ")} (**${Z.timing.verdict}**)`)}for(let ye of Z.frames?.slice(0,nt)??[]){if(Math.abs(ye.deltaPct)<I)continue;let $e=ye.deltaPct>0?"+":"";M.push(`- frame \`${Ge(ye.name)}\`: ${$e}${ye.deltaPct.toFixed(1)}% self-time (${(ye.baseSelfUs/1000).toFixed(2)}ms \u2192 ${(ye.candSelfUs/1000).toFixed(2)}ms)`)}for(let ye of Z.heapTypes?.slice(0,tt)??[]){if(Math.abs(ye.deltaPct)<I)continue;let $e=ye.deltaPct>0?"+":"";M.push(`- heap \`${Ge(ye.type)}\`: ${$e}${ye.deltaPct.toFixed(1)}% count (${ye.baseCount} \u2192 ${ye.candCount})`)}for(let ye of Z.warnings??[]){if(ye.code==="environment-mismatch")continue;M.push(`- ! ${ye.message} (\`${ye.code}\`)`)}M.push("")}}return{text:M.join(`
|
|
12
|
-
`)}}};var sr=15;function On(l){return`n${l}`}function ir(l,v,M){return`${(l||"(anonymous)").replace(/"/g,"'")} (self ${(v/1000).toFixed(2)}ms, total ${(M/1000).toFixed(2)}ms)`}function or(l,v,M,N){let A=[];if(N<=0)return A;for(let ie=0;ie<v;ie++){if(ie===M)continue;let ee=l[ie];if(A.length===N&&ee<=l[A[N-1]])continue;let de=A.length;while(de>0&&l[A[de-1]]<ee)de--;if(A.splice(de,0,ie),A.length>N)A.pop()}return A}var st={name:"mermaid",async render(l,v={}){let M=v.topN??sr;return{files:Xe(l,v.measurementId).map((ie)=>{let ee=ie.cpu,{nodes:de,frames:Z}=ee,fe=nn(ee),{selfUs:xe,totalUs:ye}=Yn(ee,fe),{parentIx:$e}=fe,Pe=fe.roots[0]??-1,Re=or(xe,fe.count,Pe,M),Ie=new Set(Pe!==-1?[Pe]:[]),Te=[];for(let Fe of Re){Te.length=0;for(let De=Fe;De!==-1;De=$e[De])Te.push(De);for(let De=Te.length-1;De>=0;De--)Ie.add(Te[De])}let Be=["graph TD"];for(let Fe of Ie){let De=de[Fe].id;Be.push(` ${On(De)}["${ir(Z[de[Fe].frameIx].name,xe[Fe],ye[Fe])}"]`)}for(let Fe of Ie){let De=$e[Fe];if(De!==-1&&Ie.has(De))Be.push(` ${On(de[De].id)} --> ${On(de[Fe].id)}`)}return{path:`${ie.id}.mermaid.md`,content:`${Be.join(`
|
|
13
|
-
`)}
|
|
14
|
-
`}})}}};var f=1;function Le(l){return Number.isFinite(l)?Number(l.toPrecision(6)):l}function Dn(l,v){return l?.entry?.task??l?.label??l?.command?.join(" ")??v}function it(l,v){if(v?.entry?.group!==void 0)l.group=v.entry.group;if(v?.description!==void 0)l.description=v.description;if(v?.groupDescription!==void 0)l.groupDescription=v.groupDescription;if(v?.params!==void 0)l.params=v.params}function ot(l){if(!l?.timing)return;let v={medianPct:Le(l.timing.medianDeltaPct),meanPct:Le(l.timing.meanDeltaPct),verdict:l.timing.verdict,pass:l.verdict==="pass",effectiveTimingPct:Le(l.thresholds.effectiveTimingPct),matched:!0};if(l.timing.ci95)v.ci95=[Le(l.timing.ci95[0]),Le(l.timing.ci95[1])];if(l.timing.pValue!==void 0)v.pValue=Le(l.timing.pValue);return v}function ar(l,v,M,N){let A={event:"run",protocolVersion:f,schemaVersion:l.schemaVersion,workloadId:v.id,task:Dn(v,v.id),skipped:!0,batch:1,warnings:(M?.warnings??[]).map((ee)=>ee.data?{code:ee.code,data:ee.data}:{code:ee.code})};if(it(A,v),N!==void 0)A.noiseFloorPct=Le(N);let ie=ot(M);if(ie)A.delta=ie;return A}function mr(l){let v=new Map(l.workloads.map((ye)=>[ye.id,ye])),M=l.environment?.noise.floorPct,N=rn(l).map((ye)=>({run:ye,workload:v.get(ye.workloadId)})),A=N.length>1?tn(N):void 0,ie=[...N,...en(l).map((ye)=>({run:ye,workload:v.get(ye.workloadId)}))],ee=new Map((l.comparisons??[]).map((ye)=>[ye.candidateMeasurementId,ye])),de=on(l),Z=new Map;for(let ye of l.measurements){if(ye.phase!=="cpu"||ye.warnings.length===0)continue;let $e=Z.get(ye.workloadId)??[];Z.set(ye.workloadId,[...$e,...ye.warnings])}let fe=sn(l,ie.map((ye)=>ye.run)).map((ye)=>ar(l,ye,ee.get(ye.id),M));return[...ie.map((ye)=>{let{run:$e,workload:Pe}=ye,Re=$e.timing,Ie=ee.get($e.id),Te={event:"run",protocolVersion:f,schemaVersion:l.schemaVersion,workloadId:$e.workloadId,task:Dn(Pe,$e.workloadId),unit:"ns",samples:Re.samples.length,batch:Re.batch??1,mean:Le(Re.mean),median:Le(Re.median),stddev:Le(Re.stddev),stddevPct:Le(Re.mean===0?0:Re.stddev/Re.mean*100),min:Le(Re.min),max:Le(Re.max),warnings:[...$e.warnings,...Z.get($e.workloadId)??[],...de.get($e.workloadId)?.warnings??[],...Ie?.warnings??[]].map((Me)=>Me.data?{code:Me.code,data:Me.data}:{code:Me.code})};Te.p75=Le(Re.p75),Te.p99=Le(Re.p99),Te.mad=Le(Re.mad);let Be=k($e);if(Be)Te.userNs=Le(Be.userNs),Te.systemNs=Le(Be.systemNs);let Fe=de.get($e.workloadId);if(Fe?.retained!==void 0)Te.retainedBytesPerOp=Math.round(Fe.retained);if(Fe?.peak!==void 0)Te.peakBytes=Math.round(Fe.peak);it(Te,Pe);let De=A?.get(ye);if(De!==void 0)Te.relative=Le(Re.median/De);if(Pe?.baseline)Te.baseline=!0;if(M!==void 0)Te.noiseFloorPct=Le(M);let Ce=ot(Ie);if(Ce)Te.delta=Ce;let ve=$e.paired;if(ve)Te.paired={baseMedian:Le(ve.baseMedianNs),medianRatio:Le(ve.medianRatio),p25:Le(ve.p25),p75:Le(ve.p75),rounds:ve.rounds,verdict:ve.verdict,...ve.flagged&&{flagged:ve.flagged},...ve.confirmed!==void 0&&{confirmed:ve.confirmed},...ve.repeats&&{repeats:ve.repeats.map((Me)=>Le(Me.medianRatio))},sameOutput:ve.sameOutput};return Te}),...fe]}function ur(l){if(!l.unmatched)return[];let v=(M,N)=>({event:"unmatched",protocolVersion:f,workloadId:M.id,task:Dn(M,M.id),side:N});return[...l.unmatched.baseOnly.map((M)=>v(M,"base")),...l.unmatched.candOnly.map((M)=>v(M,"cand"))]}function cr(l,v){let M=v.command==="ab"&&l.ab?{...l.ab,effectiveTimingPct:l.ab.thresholdPct}:l.comparisonSummary,N=(v.unmatched?.baseOnly.length??0)+(v.unmatched?.candOnly.length??0),A={event:"summary",protocolVersion:f,command:v.command,matched:M?.matched??0,regressed:M?.regressed??0,improved:M?.improved??0,unchanged:M?.unchanged??0,unmatched:N,geomeanPct:M?.geomeanPct!==void 0?M.geomeanPct:null,effectiveTimingPct:Le(M?.effectiveTimingPct??0),verdict:v.exitCode===0?"pass":"fail",exitCode:v.exitCode};if(v.command==="ci"){if(A.cached=v.cached??0,A.executed=v.executed??0,A.failed=v.failed??0,A.missingBaseline=v.missingBaseline??0,v.baseline)A.baseline=v.baseline}if(v.command==="ab"&&l.ab)A.base=l.ab.base,A.geomeanThresholdPct=l.ab.geomeanThresholdPct,A.unconfirmed=l.ab.unconfirmed,A.outputDiffers=l.ab.outputDiffers;if(l.environment)A.noiseFloorPct=Le(l.environment.noise.floorPct);if(v.baseGit||v.candGit)A.git={...v.baseGit&&{base:v.baseGit},...v.candGit&&{cand:v.candGit}};if(v.exportedTo)A.exportedTo=v.exportedTo;return A}var at={name:"minimal",async render(l,v={}){let M=[...mr(l)];if(v.protocol)M.push(...ur(v.protocol)),M.push(cr(l,v.protocol));let N=M.map((A)=>JSON.stringify(A));return{text:N.length>0?`${N.join(`
|
|
15
|
-
`)}
|
|
16
|
-
`:""}}};var dr="https://www.speedscope.app/file-format-schema.json";function mt(l){return l?.label??l?.command?.join(" ")??l?.entry?.task??"profile"}var ut={name:"speedscope",async render(l,v={}){let M=Xe(l,v.measurementId),N=new Map(l.workloads.map((ie)=>[ie.id,ie]));return{files:M.map((ie)=>{let ee=ie.cpu,{nodes:de}=ee,Z=nn(ee),fe=ee.samples?.nodeIds??[],xe=ee.samples?.timeDeltasUs??[],ye=Array(Z.count);for(let Ie of Z.order){let Te=Z.parentIx[Ie],Be=de[Ie].frameIx;ye[Ie]=Te===-1?[Be]:[...ye[Te],Be]}let $e=Array(fe.length);for(let Ie=0;Ie<fe.length;Ie++){let Te=Z.indexOf(fe[Ie]);$e[Ie]=Te===-1?[]:ye[Te]}let Pe=0;for(let Ie=0;Ie<xe.length;Ie++)Pe+=xe[Ie];let Re={$schema:dr,exporter:"ostia",name:mt(N.get(ie.workloadId)),activeProfileIndex:0,shared:{frames:ee.frames.map((Ie)=>({name:Ie.name||"(anonymous)",file:Ie.url,line:Ie.line!==void 0?Ie.line+1:void 0}))},profiles:[{type:"sampled",name:mt(N.get(ie.workloadId)),unit:"microseconds",startValue:0,endValue:Pe,samples:$e,weights:xe}]};return{path:`${ie.id}.speedscope.json`,content:`${JSON.stringify(Re,null,2)}
|
|
17
|
-
`}})}}};function lr(l){return(l/1e6).toFixed(3)}var dt={name:"table",async render(l){let v=rn(l),M=new Map(l.workloads.map((We)=>[We.id,We])),N=l.environment?[J(l.environment),""]:[];if(l.ab)return{text:pr(l,en(l),N)};let A=sn(l,v);if(v.length===0&&A.length===0){let We=ct(l,M);return{text:We.length>0?`${[...N,...We].join(`
|
|
18
|
-
`)}
|
|
19
|
-
`:`(no timing runs)
|
|
20
|
-
`}}let ie=new Map(v.map((We)=>[We.workloadId,We])),ee=[],de=[];for(let We of l.workloads){let je=ie.get(We.id),Ye=t(We);if(je){let an={kind:"measured",run:je,workload:We,label:Ye};ee.push(an),de.push(an)}else if(We.skipped)ee.push({kind:"skipped",workload:We,label:Ye})}let Z=on(l),fe=!1,xe=!1;for(let We of Z.values()){if(We.retained!==void 0)fe=!0;if(We.peak!==void 0)xe=!0}let ye=(We)=>{let je=Z.get(We.workloadId)?.warnings;return je?.length?[...We.warnings,...je]:We.warnings},$e=new Map(de.map((We)=>[We,k(We.run)])),Pe=[...$e.values()].some(Boolean),Re=de.length>1,Ie=tn(de),Te=new Map,Be=new Map,Fe;for(let We of ee){let je=dn(We.workload);if(je!==Fe){if(je!==void 0)Be.set(We,je);Fe=je}Te.set(We,je!==void 0?" ":"")}let De=Math.max(4,...ee.map((We)=>Te.get(We).length+We.label.length)),Ce=10,ve=18,Me=18,Ne=11,Ue=10,Oe=18,Ae=[...N],_e=fe?` ${"Retained/op".padEnd(Ne)}`:"",Se=xe?` ${"Peak mem".padEnd(Ue)}`:"",Ee=Pe?` ${"User/Sys".padEnd(Oe)}`:"",Ve=`${"Task".padEnd(De)} ${"Median".padEnd(Ce)} ${"Spread".padEnd(ve)} ${"Range".padEnd(Me)}${Ee}${_e}${Se}${Re?" Relative":""}`;Ae.push(Ve),Ae.push("-".repeat(Ve.length));let ze=[];for(let We of ee){let je=Be.get(We);if(je!==void 0)Ae.push(`${je}:`);let Ye=Te.get(We);if(We.kind==="skipped"){Ae.push(`${(Ye+We.label).padEnd(De)} - skipped`);continue}let{run:an,label:ht,workload:$n}=We,Qe=an.timing,mn=b(Qe.median),bt=n(Qe.median,mn),wt=`${n(Qe.p75,mn)}\u2026${n(Qe.p99,mn)}`,yt=`${n(Qe.min,mn)}\u2026${n(Qe.max,mn)}`,un=`${(Ye+ht).padEnd(De)} ${bt.padEnd(Ce)} ${wt.padEnd(ve)} ${yt.padEnd(Me)}`;if(Pe){let Je=$e.get(We);un+=` ${(Je?q(Je):"").padEnd(Oe)}`}let En=$n?Z.get($n.id):void 0;if(fe){let Je=En?.retained,xn=Je!==void 0?g(Je):"";un+=` ${xn.padEnd(Ne)}`}if(xe){let Je=En?.peak,xn=Je!==void 0?g(Je):"";un+=` ${xn.padEnd(Ue)}`}if(Re){let Je=Qe.median/(Ie.get(We)??Qe.median);un+=` ${z(Je,!!$n?.baseline)}`}Ae.push(un);let Wn=ye(an);if(Wn.length>0)Ae.push(`${" ".repeat(Ye.length)} ! ${Wn.map((Je)=>Je.code).join(", ")}`),ze.push(We)}if(ze.length>0){Ae.push(""),Ae.push("Warnings:");for(let We of ze)for(let je of ye(We.run))Ae.push(` ${We.label}: ${je.message}`)}let He=fr(l,M);if(He.length>0)Ae.push(""),Ae.push(...He);let Ke=ct(l,M);if(Ke.length>0)Ae.push(""),Ae.push(...Ke);return{text:`${Ae.map((We)=>We.trimEnd()).join(`
|
|
21
|
-
`)}
|
|
22
|
-
`}}};function pr(l,v,M){let N=new Map(l.workloads.map((Z)=>[Z.id,Z])),A=[...M];if(l.ab)A.push(`A/B: ${wn(l.ab)}`,"");let ie=v.map((Z)=>{let fe=N.get(Z.workloadId),xe=Z.paired,ye=b(Math.min(xe.baseMedianNs,Z.timing.median));return{run:Z,group:dn(fe),label:t(fe),cells:[n(xe.baseMedianNs,ye),n(Z.timing.median,ye),qe(xe.medianRatio),`${qe(xe.p25)}\u2026${qe(xe.p75)}`],verdict:bn(xe)}});if(ie.length>0){let Z=Math.max(4,...ie.map(($e)=>($e.group!==void 0?2:0)+$e.label.length)),fe=[10,10,9,18],xe=`${"Task".padEnd(Z)} ${["Base","Candidate","Change","p25\u2026p75"].map(($e,Pe)=>$e.padEnd(fe[Pe])).join(" ")} Verdict`;A.push(xe,"-".repeat(xe.length));let ye;for(let $e of ie){if($e.group!==ye&&$e.group!==void 0)A.push(`${$e.group}:`);ye=$e.group;let Pe=$e.group!==void 0?" ":"";if(A.push(`${(Pe+$e.label).padEnd(Z)} ${$e.cells.map((Re,Ie)=>Re.padEnd(fe[Ie])).join(" ")} ${$e.verdict}`),$e.run.warnings.length>0)A.push(`${Pe} ! ${$e.run.warnings.map((Re)=>Re.code).join(", ")}`)}}let ee=kn(l);if(ee.outputDiffers.length>0){A.push("",`Output differs from the base (${ee.outputDiffers.length}):`);for(let Z of ee.outputDiffers)A.push(` ${Z}`)}if(ee.baseOnly.length>0||ee.candOnly.length>0){if(A.push("","Unmatched:"),ee.baseOnly.length>0)A.push(` base only: ${ee.baseOnly.join(", ")}`);if(ee.candOnly.length>0)A.push(` candidate only: ${ee.candOnly.join(", ")}`)}let de=ie.filter((Z)=>Z.run.warnings.length>0);if(de.length>0){A.push("","Warnings:");for(let Z of de)for(let fe of Z.run.warnings)A.push(` ${Z.label}: ${fe.message}`)}if(l.ab)A.push("",yn(l.ab));return`${A.map((Z)=>Z.trimEnd()).join(`
|
|
23
|
-
`)}
|
|
24
|
-
`}function ct(l,v){if(!l.comparisons||l.comparisons.length===0)return[];let M=[],N=new Map(l.measurements.map((ee)=>[ee.id,ee])),A=Pn(l);if(A)M.push(`\u26A0 ${A.message}`,"");let ie=[];for(let ee of l.comparisons){let de=N.get(ee.candidateMeasurementId),Z=v.get(de?.workloadId??ee.candidateMeasurementId),fe=Z?t(Z):ee.candidateMeasurementId,xe=ee.verdict==="pass"?"\u2713":"\u2717";if(M.push(`${xe} ${fe}`),ee.timing){let $e=(Pe)=>`${Pe>=0?"+":""}${Pe.toFixed(1)}%`;if(ee.timing.ci95&&ee.timing.pValue!==void 0){let Pe=ee.timing.pValue<0.001?"p<0.001":`p=${ee.timing.pValue.toFixed(3)}`;M.push(` timing: ${$e(ee.timing.medianDeltaPct)} median, 95% CI [${$e(ee.timing.ci95[0])}, ${$e(ee.timing.ci95[1])}], ${Pe} (${ee.timing.verdict})`)}else M.push(` timing: ${$e(ee.timing.medianDeltaPct)} median (${ee.timing.verdict})`)}if(ee.frames)for(let $e of ee.frames.slice(0,lt)){if(Math.abs($e.deltaPct)<I)continue;let Pe=$e.deltaPct>0?"+":"";M.push(` frame ${$e.name}: ${Pe}${$e.deltaPct.toFixed(1)}% self-time (${($e.baseSelfUs/1000).toFixed(2)}ms -> ${($e.candSelfUs/1000).toFixed(2)}ms)`)}if(ee.heapTypes)for(let $e of ee.heapTypes.slice(0,pt)){if(Math.abs($e.deltaPct)<I)continue;let Pe=$e.deltaPct>0?"+":"";M.push(` heap ${$e.type}: ${Pe}${$e.deltaPct.toFixed(1)}% count (${$e.baseCount} -> ${$e.candCount})`)}let ye=(ee.warnings??[]).filter(($e)=>$e.code!=="environment-mismatch");if(ye.length>0){M.push(` ! ${ye.map(($e)=>$e.code).join(", ")}`);for(let $e of ye)ie.push({label:fe,message:$e.message})}}if(ie.length>0){M.push("","Comparison warnings:");for(let ee of ie)M.push(` ${ee.label}: ${ee.message}`)}return M}var lt=5,pt=5;function fr(l,v){let M=[];for(let N of l.measurements){if(N.phase!=="cpu"&&N.phase!=="heap")continue;let A=v.get(N.workloadId),ie=A?t(A):N.workloadId;if(N.phase==="cpu")if(N.cpu){M.push(`CPU capture - ${ie} (instrumented, ${N.cpu.samplingIntervalUs}\xB5s interval, ${O(N.cpu)} samples, diagnostic wall ${lr(N.diagnosticWallNs??0)}ms)`);let ee=N.cpu.totals.reduce((de,Z)=>de+Z.selfUs,0)||1;for(let de of N.cpu.totals.slice(0,lt)){let Z=N.cpu.frames[de.frameIx],fe=(de.selfUs/ee*100).toFixed(1);M.push(` ${fe.padStart(5)}% ${(de.selfUs/1000).toFixed(2).padStart(8)}ms self ${Z?.name??"?"}`)}}else M.push(`CPU capture - ${ie} (instrumented, no evidence captured)`);else if(N.heap){let ee=((N.heap.heapSizeBytes??0)/1e6).toFixed(2);M.push(`Heap snapshot - ${ie} (instrumented, ${N.heap.objectCount??"?"} objects, ${ee}MB)`);for(let de of N.heap.typeCounts.slice(0,pt))M.push(` ${String(de.count).padStart(6)} ${de.type}`)}else M.push(`Heap snapshot - ${ie} (instrumented, no evidence captured)`);for(let ee of N.artifacts)M.push(` artifact: ${ee.path}`);for(let ee of N.warnings)M.push(` ! ${ee.message}`)}return M}var m={table:dt,json:Xn,markdown:rt,jsonl:Zn,minimal:at,collapsed:qn,mermaid:st,speedscope:ut,cpuprofile:Qn};async function he(l={}){let v=W();if(v.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let M=Bun.main,N;try{N=U(v,l.filter,M)}catch(ie){throw Error(`run(): ${ie.message}`)}let A=await _(M,N,l);if(!l.quiet){let ie=l.format??"table",{text:ee}=await m[ie].render(A,{});if(ee)process.stdout.write(ee)}return A}function be(l,v){let M=Object.keys(l),N=(A,ie)=>{if(A===M.length){pe(ie,()=>v(ie));return}let ee=M[A];for(let de of l[ee])N(A+1,{...ie,[ee]:de})};N(0,{})}function we(l){return l}var Nn=1000;async function oe(l){if(hn("time",l),l.warmup!==void 0&&(!Number.isFinite(l.warmup)||l.warmup<0))throw RangeError(`time: warmup must be >= 0, got ${l.warmup}`);let v=i({samples:l.samples??null,budgetMs:l.budgetMs??null,minSamples:l.minSamples??null,warmup:l.warmup??null,cpu:l.cpu??!1,heap:l.heap??!1,cpuIntervalUs:l.cpuIntervalUs??Nn}),N=`${l.outDir??Ze}/artifacts`,A=l.noiseCheck===!1?void 0:a(),ie=A?c(A):void 0,ee=[],de=[],Z=l.commands.map((Pe)=>{let Re=typeof Pe==="string"||Array.isArray(Pe)?{command:Pe}:Pe,Ie=Array.isArray(Re.command)?Re.command:y(Re.command),Te=Re.prepare??l.prepare,Be=Re.timeSource??l.timeSource,Fe=Re.timeoutMs??l.timeoutMs,De=Re.ignoreExitCodes??l.ignoreExitCodes,Ce=B(Ie,Re.label??(Array.isArray(Re.command)?void 0:Re.command),{prepare:Te,timeSource:Be});return{argv:Ie,workload:Ce,prepare:Te,timeSource:Be,timeoutMs:Fe,ignoreExitCodes:De}}),fe=(l.interleave??!0)&&Z.length>1,xe=(Pe)=>({argv:Pe.argv,cwd:l.cwd,env:l.env,samples:l.samples,budgetMs:l.budgetMs,minSamples:l.minSamples,warmup:l.warmup,prepare:Pe.prepare,timeSource:Pe.timeSource,timeoutMs:Pe.timeoutMs,ignoreExitCodes:Pe.ignoreExitCodes,signal:l.signal}),ye=Z.map((Pe)=>vn(xe(Pe))),$e=async(Pe)=>{let{argv:Re,workload:Ie,prepare:Te}=Z[Pe];ee.push(Ie);let Be=ye[Pe].result(),Fe=x({workload:Ie,configFingerprint:v,trials:Be.trials,timing:Be.timing,warnings:ie&&de.length===0?[...Be.warnings,ie]:Be.warnings,interleaved:fe?!0:void 0});if(de.push(Fe),!l.signal?.aborted)de.push(...await gr({workload:Ie,argv:Re,timingMeasurementId:Fe.id,cfgFp:v,opts:l,artifactDir:N,prepare:Te}))};if(fe){for(let Re of ye)await Re.warmup();let Pe=!0;while(Pe){Pe=!1;for(let Re of ye)if(await Re.step())Pe=!0}for(let Re=0;Re<Z.length;Re++)await $e(Re)}else for(let Pe=0;Pe<Z.length;Pe++)await Cn(ye[Pe]),await $e(Pe);if(l.signal?.aborted&&de.length>0){let Pe=de[de.length-1];Pe.warnings=[...Pe.warnings,gt()]}return r(ee,de,A)}function gt(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function gr({workload:l,argv:v,timingMeasurementId:M,cfgFp:N,opts:A,artifactDir:ie,prepare:ee}){let de=[],Z=async(fe)=>{if(ee)await X(ee,{phase:fe,index:0},{cwd:A.cwd,env:A.env})};if(A.cpu){await Z("cpu");let fe=`${M}-cpu.cpuprofile`,xe=await Fn({argv:v,cwd:A.cwd,env:A.env,artifactDir:ie,fileName:fe,intervalUs:A.cpuIntervalUs??Nn});de.push(await ft({workload:l,phase:"cpu",configFingerprint:N,diagnosticWallNs:xe.diagnosticWallNs,exitCode:xe.exitCode,cpu:xe.cpu,artifactPath:xe.artifactPath,artifactKind:"cpuprofile",warnings:xe.warnings}))}if(A.heap){await Z("heap");let fe=`${M}-heap.heapsnapshot`,xe=await An({argv:v,cwd:A.cwd,env:A.env,artifactDir:ie,fileName:fe});de.push(await ft({workload:l,phase:"heap",configFingerprint:N,diagnosticWallNs:xe.diagnosticWallNs,exitCode:xe.exitCode,heap:xe.heap,artifactPath:xe.artifactPath,artifactKind:"heapsnapshot",warnings:xe.warnings}))}return de}async function ft(l){let v=`${l.workload.id}-${l.phase}-${l.configFingerprint}`,M=l.artifactPath?[await le(v,l.artifactKind,l.artifactPath)]:[];return p({workload:l.workload,phase:l.phase,configFingerprint:l.configFingerprint,diagnosticWallNs:l.diagnosticWallNs,exitCode:l.exitCode,cpu:l.cpu,heap:l.heap,warnings:l.warnings,artifacts:M})}async function ke(l,v={}){let M=me(l),N=i({intervalUs:v.intervalUs??Nn,origin:v.origin??"inspector"}),A=(de)=>de.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];if(v.signal?.aborted){let de=Bun.nanoseconds(),Z=await l(),fe=p({workload:M,phase:"cpu",configFingerprint:N,diagnosticWallNs:Bun.nanoseconds()-de,warnings:[gt()],artifacts:[]});return{result:Z,measurement:fe,document:r([M],[fe])}}let ie=v.origin==="jsc"?await Q(l,v):{...await Un(l,v),jit:void 0},ee=p({workload:M,phase:"cpu",configFingerprint:N,diagnosticWallNs:ie.diagnosticWallNs,cpu:ie.cpu,jit:ie.jit,warnings:A(ie.cpu),artifacts:[]});return{result:ie.result,measurement:ee,document:r([M],[ee])}}
|
|
25
|
-
export{d,ne,te,L,T,E,u,re,R,j,H,ae,G,se,F,V,S,ge,f,m,he,be,we,oe,ke};
|