ostia 0.2.10 → 0.2.11
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/README.md +7 -3
- package/ab-runner.ts +6 -6
- package/chunk-5m601yfv.js +15 -0
- package/chunk-82vs1rw1.js +2 -0
- package/chunk-dvqggjkn.js +14 -0
- package/chunk-fc36fd0b.js +3 -0
- package/chunk-pdv5zb3w.js +27 -0
- package/chunk-r6hwb84z.js +25 -0
- package/{chunk-qwhvzj0v.js → chunk-scvezzm9.js} +13 -11
- package/cli.js +1 -1
- package/index.d.ts +82 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/runner.ts +5 -5
- package/chunk-9cr8k2g1.js +0 -2
- package/chunk-jvjh4223.js +0 -27
- package/chunk-jzfv4c07.js +0 -15
- package/chunk-rhk7gwaa.js +0 -28
- package/chunk-w9pvsd7y.js +0 -14
- package/chunk-zf3y6chk.js +0 -3
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ ostia is a profiling and benchmarking toolkit for Bun. It times subprocess comma
|
|
|
5
5
|
profiles, heap snapshots, JIT tiers, retained heap and peak memory, and writes everything
|
|
6
6
|
to one schema-versioned JSON document (`ProfileDocument`). Two documents compare with a
|
|
7
7
|
bootstrap confidence interval and a Mann-Whitney test, with the regression threshold
|
|
8
|
-
widened
|
|
8
|
+
widened by the machine's measured noise and drift. `ostia ab` pairs the working tree against
|
|
9
9
|
a git ref in one process, which holds up on machines too noisy for that. `ostia ci` gates
|
|
10
10
|
a config file of workloads against a saved baseline, and `--format minimal` gives scripts
|
|
11
11
|
and LLM agents a compact JSON line protocol. The CLI is a thin wrapper over the library, so anything
|
|
@@ -122,7 +122,7 @@ ostia ci # on your change: exit 1 on a regression
|
|
|
122
122
|
Profile CI: ✗
|
|
123
123
|
...
|
|
124
124
|
✗ work
|
|
125
|
-
timing: +44.1% median, 95% CI [+41.4%, +45.6%], p<0.001 (regressed)
|
|
125
|
+
timing: 14.57 ms -> 21.00 ms, +44.1% median, 95% CI [+41.4%, +45.6%], p<0.001 (regressed)
|
|
126
126
|
```
|
|
127
127
|
|
|
128
128
|
Scratch output (cache, artifacts) goes to `node_modules/.cache/ostia`. Baselines go to
|
|
@@ -271,9 +271,13 @@ ostia compare before.json after.json --format markdown
|
|
|
271
271
|
|
|
272
272
|
```
|
|
273
273
|
✗ bun fixtures/work.ts
|
|
274
|
-
timing: +23.8% median, 95% CI [+18.3%, +30.1%], p<0.001 (regressed)
|
|
274
|
+
timing: 31.2 ms -> 38.6 ms, +23.8% median, 95% CI [+18.3%, +30.1%], p<0.001 (regressed)
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
+
`--format json` adds a flat `compared` array, one row per task, for scripts. A task on only
|
|
278
|
+
one side is listed under "Not compared"; a renamed suite task still compares when it lists
|
|
279
|
+
its old name in `aliases`.
|
|
280
|
+
|
|
277
281
|
A regression needs the whole 95% CI above the threshold and a Mann-Whitney p-value below
|
|
278
282
|
`alpha` (default 0.01). Thresholds come from the config file when one exists, otherwise
|
|
279
283
|
the defaults (`timingPct: 5`). The bootstrap is seeded from the samples, so the same two
|
package/ab-runner.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{c,
|
|
4
|
-
`).slice(0,
|
|
5
|
-
`)}async function
|
|
6
|
-
`),await Bun.write(`${
|
|
7
|
-
candidate: ${
|
|
8
|
-
`),2;let
|
|
3
|
+
import{c,S,r,Xe,i,u,f,D,ue,F,_e,We,de,Le,g,tn,B,le,U}from"./chunk-5m601yfv.js";import{H,G,ne}from"./chunk-dvqggjkn.js";import{y,se,un,ie}from"./chunk-fc36fd0b.js";function E(e,l=F(e)){return`${l}\x00${S(e.params??null)}`}function _(e){return[F(e),..._e(e)].map((l)=>E(e,l))}async function q(e){return ue(),await import(e),[...D()]}var X=5;function O(e){return(e instanceof Error?e.message:String(e)).split(`
|
|
4
|
+
`).slice(0,X).join(`
|
|
5
|
+
`)}async function N(e,l,m){if(process.stderr.write(`ab runner: ${l}
|
|
6
|
+
`),await Bun.write(`${e}.error`,l),m)await Bun.write(`${e}.side`,m);return 2}async function Y(e,l,m,P){let t={base:e,cand:l},d=new Map,w=(a,k)=>{if(!d.has(a))d.set(a,k)},h=new Set;for(let a of P)try{await t[a].opts?.before?.(),h.add(a)}catch(k){w(a,k)}let T,o;if(h.size===2)try{T=await un(e.fn,l.fn,{rounds:m,candFirst:P[0]==="cand"})}catch(a){if(a instanceof se)w(a.side,a.cause);else o={err:a}}if(d.size===1){let a=d.has("base")?"cand":"base";if(h.has(a))try{await t[a].fn()}catch(k){w(a,k)}}for(let a of P.toReversed()){if(!h.has(a))continue;try{await t[a].opts?.after?.()}catch(k){w(a,k)}}if(o)throw o.err;let p=d.get("base"),A=d.get("cand");if(d.size===2)return{threw:{side:"both",message:`base: ${O(p)}
|
|
7
|
+
candidate: ${O(A)}`}};if(d.has("base"))return{threw:{side:"base",message:O(p)}};if(d.has("cand"))return{threw:{side:"cand",message:O(A)}};return{result:T}}async function Z(e,l,m,P,t){let{workloadId:d,side:w}=P,h=P.peakMem?await G():void 0;await import("./index.js");let T=H(),o;try{for(let p of t)await import(p);o=(await q(e)).find((p)=>U(l,p).id===d)}catch(p){return N(m,`the ${y(w)} side failed to load ${e}: ${O(p)}`,w)}if(!o)return N(m,`no task with workload id ${d} in ${e}.`);try{let p={};if(await g(o,"before"),await o.opts?.before?.(),h)p.peak=await ne(o.fn,T,h);if(P.alloc){await le(o.fn);let{memory:A,calls:a}=await le(o.fn);p.alloc={bytesPerOp:A.bytesPerOp,calls:a}}return await o.opts?.after?.(),await g(o,"after"),await Bun.write(m,JSON.stringify(p)),0}catch(p){return N(m,`${F(o)} threw on the ${y(w)} side while measuring memory: ${O(p)}`,w)}}async function ee(){let[e,l,m,P]=process.argv.slice(2);if(!e||l===void 0||!m||!P)return process.stderr.write(`ab runner: usage: ab-runner.ts <candSuite> <baseSuite|''> <outputPath> <optsJson>
|
|
8
|
+
`),2;let t=JSON.parse(P);if(t.memoryFor)return Z(t.memoryFor.side==="base"?l:e,e,m,t.memoryFor,t.preload??[]);for(let s of t.preload??[])await import(s);let d=t.candFirst?["cand","base"]:["base","cand"],w=[],h=[];for(let s of d){let n=s==="base"?l:e;if(!n)continue;try{let R=await q(n);if(s==="base")w=R;else h=R}catch(R){return N(m,`the ${y(s)} side failed to load ${n}: ${O(R)}`,s)}}if(h.length===0)return N(m,`${e} registered no tasks (no task() calls found).`,"cand");let T;try{T=B(h,t.filter,e,!t.workloadIds)}catch(s){return N(m,s.message)}let o=t.workloadIds&&new Set(t.workloadIds),p=new Map(w.map((s)=>[E(s),s])),A=new Set(h.flatMap(_)),a=[],k=[],v=[];for(let s of T){let n=U(e,s);if(o&&!o.has(n.id))continue;if(a.push(n),s.skipped)continue;let R=_(s).map((M)=>p.get(M)).find((M)=>M!==void 0);if(R&&!R.skipped)k.push({workload:n,base:R,cand:s});else v.push(n.id)}let W=[];if(!o&&!h.some((s)=>s.only))for(let s of tn(w,t.filter)){if(s.skipped||A.has(E(s)))continue;let n=U(e,s);a.push(n),W.push(n.id)}let C=Le(k.map((s)=>s.cand));if(t.planPath){let s={memory:k.map((n)=>({workloadId:n.workload.id,alloc:We(n.cand,t.alloc??!1),peakMem:de(n.cand,t.peakMem??!1)})).filter((n)=>n.alloc||n.peakMem)};await Bun.write(t.planPath,JSON.stringify(s))}let J=i({rounds:t.rounds,thresholdPct:t.thresholdPct}),I=[];for(let s=0;s<k.length;s++){let{workload:n,base:R,cand:M}=k[s],{enter:Q,leave:V}=C(s);if(t.progress)process.send?.({task:s+1,tasks:k.length,label:F(M)});let z={base:R,cand:M};for(let b of d)await g(z[b],"before",Q);let x=await Y(R,M,t.rounds,d);if("threw"in x)I.push(Xe({workload:n,configFingerprint:J,threw:x.threw,diagnosticWallNs:0,warnings:[]}));else{let{result:b}=x,L=ie(b.ratios,t.thresholdPct),j=c(b.candSamples);if(b.batch>1)j.batch=b.batch;I.push(Xe({workload:n,configFingerprint:J,timing:j,diagnosticWallNs:b.diagnosticWallNs,warnings:[],paired:{rounds:b.rounds,batch:b.batch,baseSamples:b.baseSamples,baseMedianNs:f(b.baseSamples),ratios:b.ratios,...L,verdict:L.flagged??"unchanged",sameOutput:b.sameOutput}}))}for(let b of d.toReversed())await g(z[b],"after",V)}let K=r(a,I);return K.unmatched={baseOnly:W,candOnly:v},await u(K,m),0}ee().then((e)=>process.exit(e));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{statSync as ht}from"fs";import{rm as kt}from"fs/promises";import{isAbsolute as yt}from"path";function T(d){return d instanceof Error?d.message:String(d)}class l extends Error{}import{rename as it,rm as st}from"fs/promises";import{isAbsolute as at,relative as ut}from"path";class on extends Error{}var Rn=new WeakMap;function vn(d){if(typeof d.pattern!=="string")return d.pattern;let h=Rn.get(d);if(!h)h=new RegExp(d.pattern),Rn.set(d,h);return h}function we(d){let h=vn(d);if(/[gyd]/.test(h.flags))throw RangeError("timeSource pattern must not use the g, y or d flag")}var qn={ns:1,us:1000,ms:1e6,s:1e9};function qe(d,h){let y=d!==void 0?AbortSignal.timeout(d):void 0,x=y&&h?AbortSignal.any([y,h]):y??h;return{spawn:x?{signal:x,killSignal:"SIGKILL"}:{},timedOut:()=>y?.aborted??!1}}async function ln(d){let h=d.timeSource!==void 0,y=Bun.nanoseconds(),x=qe(d.timeoutMs,d.signal),M=Bun.spawn(d.argv,{cwd:d.cwd,env:d.env,stdout:h?"pipe":"ignore",stderr:h?"pipe":"ignore",stdin:"ignore",...x.spawn}),A=h?Promise.all([new Response(M.stdout).text(),new Response(M.stderr).text()]):void 0,I=await M.exited,G=Bun.nanoseconds(),_=M.resourceUsage?.(),J=x.timedOut(),H={wallNs:G-y,exitCode:J?null:I,userNs:_?Number(_.cpuTime.user)*1000:void 0,systemNs:_?Number(_.cpuTime.system)*1000:void 0,maxRssBytes:_?.maxRSS,...J&&{timedOut:!0}};if(A){let[ne,oe]=await A;if(d.timeSource&&!J)try{H.reportedNs=Yn(d.timeSource,ne,oe,d.argv)}catch(be){if(!(be instanceof on))throw be;H.timeSourceNoMatch=!0,H.timeSourceMissOutput=Zn(ne,oe)}}return H}function Yn(d,h,y,x=[]){let M=vn(d),A=d.group??1,I=M.exec(h)??M.exec(y),G=x.length>0?` for "${x.join(" ")}"`:"";if(!I)throw new on(`timeSource pattern ${M} did not match the output${G}. Output was:
|
|
3
|
+
${Pn(h,y)}`);let _=I[A];if(_===void 0)throw Error(`timeSource pattern ${M} matched${G} but has no capture group ${A} (matched text: "${I[0]}").`);let J=Number(_);if(!Number.isFinite(J))throw Error(`timeSource pattern ${M} group ${A} captured "${_}"${G}, which is not a number.`);return J*qn[d.unit??"ms"]}function Pn(d,h){let x=(A)=>A.length>800?`${A.slice(0,800)}\u2026(${A.length-800} more)`:A,M=[];if(d.trim())M.push(`--- stdout ---
|
|
4
|
+
${x(d.trimEnd())}`);if(h.trim())M.push(`--- stderr ---
|
|
5
|
+
${x(h.trimEnd())}`);return M.length>0?M.join(`
|
|
6
|
+
`):"(empty)"}var rn=2048;function Zn(d,h){let y=Pn(d,h);if(Buffer.byteLength(y,"utf8")<=rn)return y;let x=y.slice(0,rn);while(Buffer.byteLength(x,"utf8")>rn)x=x.slice(0,-1);return`${x}\u2026`}var Xn=1048576;async function Qn(d,h=Xn){let y=Math.floor(h/2),x=d.getReader(),M=[],A=0,I=[],G=0,_=0;try{for(;;){let{done:be,value:ee}=await x.read();if(be)break;if(!ee||ee.byteLength===0)continue;_+=ee.byteLength;let re=ee;if(A<y){let te=y-A;if(re.byteLength<=te){M.push(re),A+=re.byteLength;continue}M.push(re.subarray(0,te)),A+=te,re=re.subarray(te)}I.push(re),G+=re.byteLength;while(G>y&&I.length>0){let te=I[0],se=G-y;if(te.byteLength<=se)I.shift(),G-=te.byteLength;else I[0]=te.subarray(se),G-=se}}}finally{x.releaseLock()}let J=new TextDecoder,H=J.decode(Buffer.concat(M));if(_<=A+G)return H;let ne=J.decode(Buffer.concat(I)),oe=_-A-G;return`${H}
|
|
7
|
+
\u2026(${oe} bytes elided)\u2026
|
|
8
|
+
${ne}`}async function ye(d,h,y){if(typeof d==="function"){await d(h);return}let x=sn(d),M=qe(y.timeoutMs,y.signal),A=Bun.spawn(x,{cwd:y.cwd,env:y.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...M.spawn}),I=Qn(A.stderr).catch(()=>""),G=await A.exited,_=M.timedOut();if(!_&&y.signal?.aborted)return;if(!_&&G===0)return;let J=_?`timed out after ${y.timeoutMs}ms`:`exited with code ${G}`,H=(await I).trim();throw Error(`prepare command "${x.join(" ")}" ${J} before ${h.phase} trial ${h.index}.${H?`
|
|
9
|
+
${H}`:""}`)}function sn(d){if(d===void 0||typeof d==="function")return;return Array.isArray(d)?d:q(d)}function En(d){if(d===void 0)return;return{pattern:typeof d.pattern==="string"?d.pattern:d.pattern.source,...d.group!==void 0&&{group:d.group},...d.unit!==void 0&&{unit:d.unit}}}function q(d){return d.trim().split(/\s+/).filter(Boolean)}var et={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function R(d){let h=Math.abs(d);if(h>=1e9)return"s";if(h>=1e6)return"ms";if(h>=1000)return"\xB5s";return"ns"}function nt(d){let h=Math.floor(Math.log10(Math.max(Math.abs(d),1)))+1;return Math.max(1,3-h)}function e(d,h=R(d)){let y=d/et[h];return`${y.toFixed(nt(y))} ${h}`}function c(d){if(d.length===0)throw Error("computeTimingStats: samples must be non-empty");let h=d.length,y=k(d),x=0;for(let V=0;V<h;V++)x+=d[V];let M=x/h,A=o(y,0.5),I=0;for(let V=0;V<h;V++){let ie=d[V]-M;I+=ie*ie}let G=Math.sqrt(I/h),_=y[0],J=y[h-1],H=o(y,0.25),ne=o(y,0.75),oe=ne-H,be=H-1.5*oe,ee=ne+1.5*oe,re=H-3*oe,te=ne+3*oe,se=0,fe=0;for(let V=0;V<h;V++){let ie=d[V];if(ie<re||ie>te)fe++;else if(ie<be||ie>ee)se++}let he=o(y,0.99),K=new Float64Array(h);for(let V=0;V<h;V++)K[V]=Math.abs(d[V]-A);K.sort();let z=o(K,0.5);return{unit:"ns",samples:d,mean:M,median:A,stddev:G,min:_,max:J,outliers:{mild:se,severe:fe},p25:H,p75:ne,p99:he,mad:z}}function k(d){let h=new Float64Array(d.length);return h.set(d),h.sort(),h}function o(d,h){let y=d.length;if(y===1)return d[0];let x=h*(y-1),M=Math.floor(x),A=Math.ceil(x);if(M===A)return d[M];let I=x-M;return d[M]*(1-I)+d[A]*I}var tt=5000000;function ke(d,h,y="subprocess",x=[]){let M=[],A=d.samples[0];if(A!==void 0){let _=d.p75-d.p25;if(A>d.median+3*_&&A>2*d.median&&_>0)M.push({code:"slow-first-run",message:`First run took ${e(A)}, much slower than the median ${e(d.median)}. Consider more warmup.`,data:{firstNs:A,medianNs:d.median}})}if(y!=="inprocess"&&d.outliers.mild+d.outliers.severe>0)M.push({code:"outliers-detected",message:`${d.outliers.mild+d.outliers.severe} outlier(s) detected (${d.outliers.severe} severe, ${d.outliers.mild} mild).`,data:d.outliers});if(y==="subprocess"&&d.median<tt)M.push({code:"fast-command",message:`Median run time (${(d.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:d.median}});let I=new Set(x),G=h.filter((_)=>_!==void 0&&_!==0&&!I.has(_));if(G.length>0)M.push({code:"nonzero-exit",message:`${G.length} of ${h.length} trial(s) exited non-zero.`,data:{exitCodes:G}});return M}var Nn={name:"ostia",version:"0.2.11",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:"bun check","typecheck:package":"bun check -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 ae=Nn.version;function S(d,h){return JSON.stringify(an(d),null,h)}function an(d){if(Array.isArray(d))return d.some((y)=>y!==null&&typeof y==="object")?d.map(an):d;if(d!==null&&typeof d==="object"){let h=d,y={};for(let x of Object.keys(h).sort())y[x]=an(h[x]);return y}return d}function n(d,...h){let y=Bun.CryptoHasher.hash("sha256",S(h),"hex");return`${d}_${y.slice(0,16)}`}var Fn;function un(d){let h=Bun.spawnSync(["git",...d],{timeout:200,stdout:"pipe",stderr:"ignore"});return h.success?h.stdout.toString().trim():void 0}function ot(){try{let d=un(["rev-parse","--short","HEAD"]);if(d===void 0)return;return{sha:d,branch:un(["rev-parse","--abbrev-ref","HEAD"])??"HEAD",dirty:(un(["status","--porcelain"])?.length??0)>0}}catch{return}}function An(){return Fn??={git:ot()},Fn.git}function Ve(d){return Object.fromEntries(Object.entries(d).filter(([,h])=>h!==void 0))}function cn(d,h,y){return n("run",d,h,y,Bun.version,ae)}function r(d,h,y){let x=An();return{schemaVersion:2,toolVersion:ae,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:d,measurements:h,...Ve({environment:y,git:x})}}function me(d,h,y={}){if(y.timeSource)we(y.timeSource);let x=sn(y.prepare),M=En(y.timeSource),A=typeof y.prepare==="function"?y.prepare.toString():x;return{id:n("wl","subprocess",d,...A!==void 0||M!==void 0?[A??null,M??null]:[]),kind:"subprocess",command:d,label:h,...Ve({prepare:x,timeSource:M})}}function pn(d,h){return{id:h===void 0?n("wl","inprocess",d.name,d.toString()):n("wl","inprocess-named",h),kind:"inprocess",label:h}}function mn(d,h,y={}){let x=at(d)?ut(process.cwd(),d):d,M=y.params!==void 0?n("wl","inprocess-entry",x,h,y.params):n("wl","inprocess-entry",x,h),{group:A,...I}=y;return{id:M,kind:"inprocess",entry:{file:d,task:h,...Ve({group:A})},...Ve(I)}}function W(d){return{id:cn(d.workload.id,"timing",d.configFingerprint),workloadId:d.workload.id,phase:"timing",instrumented:!1,configFingerprint:d.configFingerprint,trials:d.trials,timing:d.timing,warnings:d.warnings,artifacts:[],memory:d.heapUsed?{origin:"heapStats",heapUsedBeforeBytes:d.heapUsed.beforeBytes,heapUsedAfterBytes:d.heapUsed.afterBytes}:ct(d.trials),...Ve({interleaved:d.interleaved})}}function ct(d){let h=d.map((y)=>y.maxRssBytes).filter((y)=>y!==void 0);if(h.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...h)}}function P(d){return{id:cn(d.workload.id,d.phase,d.configFingerprint),workloadId:d.workload.id,phase:d.phase,instrumented:!0,configFingerprint:d.configFingerprint,trials:[{i:0,wallNs:d.diagnosticWallNs,exitCode:d.exitCode}],diagnosticWallNs:d.diagnosticWallNs,cpu:d.cpu,heap:d.heap,memory:d.memory,jit:d.jit,warnings:d.warnings,artifacts:d.artifacts}}function Xe(d){return{id:cn(d.workload.id,"paired",d.configFingerprint),workloadId:d.workload.id,phase:"paired",instrumented:!1,configFingerprint:d.configFingerprint,trials:[],..."threw"in d?{threw:d.threw}:{timing:d.timing,paired:d.paired},diagnosticWallNs:d.diagnosticWallNs,warnings:d.warnings,artifacts:[]}}async function fn(d,h,y){let x=await Bun.file(y).arrayBuffer();return{id:n("art",d,h,y),kind:h,path:y,sha256:Bun.CryptoHasher.hash("sha256",x,"hex"),bytes:x.byteLength}}function i(d){return n("cfg",d)}function Y(d){return`${S(d,2)}
|
|
10
|
+
`}async function Qe(d,h){let y=`${h}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;try{await Bun.write(y,d),await it(y,h)}catch(x){throw await st(y,{force:!0}),x}}async function u(d,h){await Qe(Y(d),h)}class E extends Error{code;path;schemaVersion;constructor(d,h,y={}){super(h);this.name="OstiaDocumentError",this.code=d,this.path=y.path,this.schemaVersion=y.schemaVersion}}async function a(d){let h=await Bun.file(d).text(),y;try{y=JSON.parse(h)}catch(M){let A=T(M);throw new E("invalid-json",`${d}: invalid JSON (${A})`,{path:d})}let x=y!==null&&typeof y==="object"?y.schemaVersion:void 0;if(typeof x!=="number")throw new E("not-a-document",`${d}: not a ProfileDocument (missing schemaVersion)`,{path:d});if(x!==2)throw new E("unsupported-schema",`${d}: unsupported ProfileDocument schemaVersion ${x} (this ostia reads 2)`,{path:d,schemaVersion:x});return mt(y,d),lt(pt(y))}var In=(d)=>typeof d==="object"&&d!==null&&!Array.isArray(d);function mt(d,h){let y=(x)=>new E("not-a-document",`${h}: malformed document: ${x}`,{path:h});if(!Array.isArray(d.workloads))throw y('"workloads" must be an array');if(!Array.isArray(d.measurements))throw y('"measurements" must be an array');d.workloads.forEach((x,M)=>{if(!In(x)||typeof x.id!=="string")throw y(`workloads[${M}] must be an object with a string "id"`)}),d.measurements.forEach((x,M)=>{if(!In(x)||typeof x.id!=="string"||typeof x.workloadId!=="string"||typeof x.phase!=="string")throw y(`measurements[${M}] must be an object with string "id", "workloadId" and "phase"`);for(let A of["trials","warnings","artifacts"])if(!Array.isArray(x[A]))throw y(`measurements[${M}].${A} must be an array`)})}function lt(d){let h=(y)=>{if(y.ratioP25!==void 0||y.p25===void 0)return;y.ratioP25=y.p25,y.ratioP75=y.p75,delete y.p25,delete y.p75};for(let y of d.measurements){if(!y.paired)continue;h(y.paired);for(let x of y.paired.repeats??[])h(x)}return d}function pt(d){for(let h of d.measurements){let y=h.timing;if(!y||y.mad!==void 0||y.samples.length===0)continue;h.timing={...c(y.samples),...y.batch!==void 0&&{batch:y.batch}}}return d}import bn from"os";var dt=200,$n=64,ft=(()=>{let d=new Uint8Array(4096);for(let h=0;h<d.length;h++)d[h]=h*2654435761&255;return d})();function gt(d,h){let y=h;for(let x=0;x<d.length;x++)y^=d[x],y=Math.imul(y,16777619);return y>>>0}function bt(d){let h=c(d);return{floorPct:h.median===0?0:h.mad/h.median*100,referenceMedianNs:h.median,samples:d.length}}function dn(d=dt){let h=d*1e6,y=[],x=0,M=Bun.nanoseconds();while(Bun.nanoseconds()-M<h){let A=Bun.nanoseconds();for(let I=0;I<$n;I++)x^=gt(ft,I);y.push((Bun.nanoseconds()-A)/$n)}return bt(y)}var Bn=0.75;function Pe(){let[d=0,h=0]=bn.loadavg();return{cpuModel:bn.cpus()[0]?.model??"unknown",cores:bn.availableParallelism(),loadAvg1:d,loadAvg5:h,noise:dn()}}function v(d){if(!d)return;let h=d.noise.referenceMedianNs,y=dn().referenceMedianNs;d.noise.driftPct=h>0?(y/h-1)*100:0}function xe(d){if(d.loadAvg1<=d.cores*Bn)return;return{code:"noisy-machine",message:`Load average ${d.loadAvg1.toFixed(2)} exceeds ${Bn*100}% of ${d.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:d.loadAvg1,cores:d.cores}}}function Z(d,h,y){return`${e(d,y)}\u2026${e(h,y)}`}function Me(d){return(d/1e6).toFixed(3)}function p(d){return(d/1000).toFixed(2)}function b(d){if(d<1024)return`${d.toFixed(0)}B`;if(d<1048576)return`${(d/1024).toFixed(2)}KiB`;return`${(d/1048576).toFixed(2)}MiB`}function N(d){return d?.name||"(anonymous)"}function Te(d,h){let y=d.totals.reduce((x,M)=>x+M.selfUs,0)||1;return d.totals.slice(0,h).map((x)=>({frame:d.frames[x.frameIx],selfUs:x.selfUs,totalUs:x.totalUs,pct:(x.selfUs/y*100).toFixed(1)}))}function Re(d){return`${d.objectCount??"?"} objects, ${b(d.heapSizeBytes??0)}`}function Se(d){return`${d.cpuModel} \xB7 ${d.cores} cores \xB7 load ${d.loadAvg1.toFixed(1)} \xB7 noise floor ${d.noise.floorPct.toFixed(1)}%`}function L(d){return`${d.sha} (${d.branch}${d.dirty?", dirty":""})`}function m(d){return d.label??d.command?.join(" ")??d.entry?.task??d.id}function s(d,h){return d?m(d):h}function ve(d,h){if(d===1)return h?"1.00\xD7 (baseline)":"1.00\xD7";if(d>1)return`${d.toFixed(2)}\xD7 slower`;return`${(1/d).toFixed(2)}\xD7 faster`}function gn(d){return d.replace(/\|/g,"\\|").replace(/</g,"<").replace(/>/g,">").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function X(d){let h=[],y=[];for(let x of d.trials){if(x.timedOut||x.timeSourceNoMatch)continue;if(x.userNs===void 0||x.systemNs===void 0)continue;h.push(x.userNs),y.push(x.systemNs)}if(h.length===0)return;return{userNs:o(k(h),0.5),systemNs:o(k(y),0.5)}}function Ce(d){return`${e(d.userNs)}/${e(d.systemNs)}`}function t(d){let h=d.toFixed(1);if(Number(h)===0)return"0.0%";return`${d>0?"+":""}${h}%`}function C(d,h){return yt(h)?h:`${d}/${h}`}class On extends l{}function $e(d,h){if(!ht(h,{throwIfNoEntry:!1})?.isFile())throw new On(`Suite not found: ${d}`)}function Oe(d,h){return`${d}/${h}-tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`}function f(d){return o(Float64Array.from(d).sort(),0.5)}function w(d){return kt(d,{recursive:!0,force:!0})}async function en(d){return await Bun.file(d).exists()?a(d):void 0}var ce=3,wt=16777216;function Ae(d){let h=f(d.map((x)=>x.peakBytes)),y=Math.max(...d.map((x)=>x.slackBytes));if(y<wt||y<=h/4)return;return{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${b(y)} 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:y,processes:d.length}}}function O(d){let h=d===!1?void 0:Pe();return{environment:h,noiseWarning:h&&xe(h)}}function Ie(d,h,y){let x=d[0],M=d[d.length-1];if(!x||!M)return;if(h)x.warnings.push(h);if(y)M.warnings.push({code:"aborted",message:y})}async function Ee(d,h){let y=qe(h.timeoutMs,h.signal),x=Bun.spawn(d,{cwd:h.cwd,...h.env&&{env:{...process.env,...h.env}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...h.ipc&&{ipc:h.ipc},...y.spawn});h.inFlight?.add(x);let M;try{M=await x.exited}finally{h.inFlight?.delete(x)}if(h.signal?.aborted)return!1;if(y.timedOut())throw Error(`${h.label} timed out after ${h.timeoutMs}ms: ${h.name}`);if(M!==0){let A=h.errorFile&&Bun.file(h.errorFile);throw Error(A&&await A.exists()?`${h.label} failed: ${h.name}: ${await A.text()}`:`${h.label} failed: ${h.name} (runner exited ${M})`)}return!0}function j(d){return d!==null&&typeof d==="object"&&typeof d.then==="function"}var xt=(async()=>{}).constructor,Tt=0,Un=256;function Ne(d,h){let y=`/* ostia task loop ${Tt++} */
|
|
11
|
+
const t0 = Bun.nanoseconds()
|
|
12
|
+
for (let b = 0; b < n; b++) sink[b & ${Un-1}] = ${h?"await ":""}fn()
|
|
13
|
+
return Bun.nanoseconds() - t0`,x=(h?xt:Function)("fn","sink","n",y),M=Array(Un);return(A)=>x(d,M,A)}async function De(d){let h=Bun.nanoseconds(),y=d(),x=j(y),M=x?await y:y;return{isAsync:x,result:M,ns:Math.max(1,Bun.nanoseconds()-h)}}var wn=[],ge,Je;function kn(d,h,y,x){let M=ge,A=M?`${M.path}/${d}`:d;ge={path:A,chain:[...M?.chain??[],{path:A,before:y?.before,after:y?.after}],description:y?.description??M?.description,isolate:y?.isolate??M?.isolate,gc:y?.gc??M?.gc,cpu:y?.cpu??M?.cpu,alloc:y?.alloc??M?.alloc,peakMem:y?.peakMem??M?.peakMem,skip:x.skip||M?.skip,only:x.only||M?.only};try{h()}finally{ge=M}}var xn=Object.assign((d,h,y)=>kn(d,h,y,{}),{skip:(d,h,y)=>kn(d,h,y,{skip:!0}),only:(d,h,y)=>kn(d,h,y,{only:!0})});function yn(d,h,y,x){let M=Je!==void 0||y?.params!==void 0?{...Je,...y?.params}:void 0;wn.push({groupName:ge?.path,groupChain:ge?.chain,groupDescription:ge?.description,groupIsolate:ge?.isolate,groupGc:ge?.gc,groupCpu:ge?.cpu,groupAlloc:ge?.alloc,groupPeakMem:ge?.peakMem,name:d,fn:h,baseline:y?.baseline,params:M,skipped:x.skip||ge?.skip,only:x.only||ge?.only,opts:y})}var Mn=Object.assign((d,h,y)=>yn(d,h,y,{}),{skip:(d,h,y)=>yn(d,h,y,{skip:!0}),only:(d,h,y)=>yn(d,h,y,{only:!0})});function D(){return wn}function ue(){wn.length=0,ge=void 0,Je=void 0}function hn(d,h){let y=Je;Je=d;try{return h()}finally{Je=y}}function F(d){return d.groupName?`${d.groupName}/${d.name}`:d.name}function _e(d){return(d.opts?.aliases??[]).map((h)=>d.groupName?`${d.groupName}/${h}`:h)}function nn(d,h){return d.opts?.isolate??d.groupIsolate??h}function Cn(d,h){return d.opts?.gc??d.groupGc??h}function _n(d,h){return d.opts?.cpu??d.groupCpu??h}function We(d,h){return d.opts?.alloc??d.groupAlloc??h}function de(d,h){return d.opts?.peakMem??d.groupPeakMem??h}function Le(d){let h=new Map,y=new Map;return d.forEach((x,M)=>{if(x.skipped)return;for(let{path:A}of x.groupChain??[]){if(!h.has(A))h.set(A,M);y.set(A,M)}}),(x)=>{let M=(d[x].groupChain??[]).map((A)=>A.path);return{enter:M.filter((A)=>h.get(A)===x),leave:M.filter((A)=>y.get(A)===x).reverse()}}}async function g(d,h,y){let x=d.groupChain??[],M=y??(h==="before"?x:[...x].reverse()).map((A)=>A.path);for(let A of M)await x.find((I)=>I.path===A)?.[h]?.()}function tn(d,h){if(!h)return[...d];let y=new RegExp(h);return d.filter((x)=>y.test(F(x)))}function B(d,h,y,x=!0){let M=d.filter((G)=>G.only),A=M.length>0?M:d;if(x&&M.length>0)process.stderr.write(`bench: ${M.length} task(s) selected by .only
|
|
14
|
+
`);let I=tn(A,h);if(I.length===0)throw Error(`filter ${JSON.stringify(h)} matched zero of ${A.length} registered task(s) in ${y}.`);return I}function Q(d){return d.samples?.nodeIds.length??d.totals.reduce((h,y)=>h+y.samples,0)}import{heapSize as zn}from"bun:jsc";import{heapStats as Dn}from"bun:jsc";var St=100,Mt=1000;async function le(d,h=St,y=Mt){let x=Bun.nanoseconds();Bun.gc(!0);let M=Dn().heapSize,A=Bun.nanoseconds()+y*1e6,I=0;while(I<h&&(I===0||Bun.nanoseconds()<A)){let J=d();if(j(J))await J;I++}Bun.gc(!0);let G=Dn().heapSize,_=Bun.nanoseconds()-x;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(G-M)/I)},calls:I,diagnosticWallNs:_}}import{profile as vt}from"bun:jsc";var je=1000;function Fe(){let d=new Map,h=[];return{frames:h,intern(y,x,M,A){let I=d.get(y);if(I===void 0)I=new Map,d.set(y,I);let G=x??"",_=I.get(G);if(_===void 0)_=h.length,I.set(G,_),h.push({key:n("fr",y,G),name:y,url:x,line:M,col:A});return _}}}function Be(d,h,y,x,M){let A=d.get(h);if(A)A.selfUs+=y,A.totalUs+=x,A.samples+=M;else d.set(h,{frameIx:h,selfUs:y,totalUs:x,samples:M})}function Ue(d){return[...d.values()].sort((h,y)=>y.selfUs-h.selfUs)}var Rt=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Wn=4294967295;function Ln(d,h){let y=h??d.interval*1e6,{frames:x,intern:M}=Fe();function A(K){let z=K.line===Wn,V=z?void 0:K.line-1,ie=z||K.column===Wn?void 0:K.column-1;return M(K.name,K.sourceURL,V,ie)}let I=[];function G(K){let z={id:I.length,frameIx:K,children:new Map,selfUs:0,samples:0,totalUs:0};return I.push(z),z}let _=G(M("(root)",void 0,void 0,void 0)),J={llint:0,baseline:0,dfg:0,ftl:0},H=new Map,ne=[],oe=[];for(let K of d.traces){let z=K.frames,V=_;for(let Ge=z.length-1;Ge>=0;Ge--){let Ze=A(z[Ge]),ze=V.children.get(Ze);if(!ze)ze=G(Ze),V.children.set(Ze,ze);V=ze}V.selfUs+=y,V.samples+=1,ne.push(V.id),oe.push(y);let ie=z[0],Ke=ie&&Rt.get(ie.category);if(Ke){J[Ke]++;let Ge=H.get(Ke)??new Map;Ge.set(V.frameIx,(Ge.get(V.frameIx)??0)+1),H.set(Ke,Ge)}}function be(K){let z=K.selfUs;for(let V of K.children.values())z+=be(V);return K.totalUs=z,z}be(_);let ee=new Map;function re(K){Be(ee,K.frameIx,K.selfUs,K.totalUs,K.samples);for(let z of K.children.values())re(z)}re(_);let te=I.map((K)=>({id:K.id,frameIx:K.frameIx,children:[...K.children.values()].map((z)=>z.id)})),se={origin:"jsc-profile",samplingIntervalUs:y,frames:x,nodes:te,totals:Ue(ee),samples:{nodeIds:ne,timeDeltasUs:oe}},fe=[...H.entries()].flatMap(([K,z])=>[...z.entries()].sort((V,ie)=>ie[1]-V[1]).slice(0,3).map(([V,ie])=>({tier:K,frameKey:x[V].key,samples:ie})));return{cpu:se,jit:{origin:"jsc-profile",tiers:J,topFramesByTier:fe}}}async function He(d,h={}){let y=h.intervalUs??je,x,M=Bun.nanoseconds(),A=await vt(async()=>(x=await d(),x),y),I=Bun.nanoseconds()-M,{cpu:G,jit:_}=Ln(A.stackTraces,y);return{result:x,cpu:G,jit:_,diagnosticWallNs:I}}var Sn=100,Ye=2000,Pt=2,Et=200,Nt=1e4,Ft=Ye/2,At=20;function It(d){let h=Ye*Pt*d/1000;return Math.min(Nt,Math.max(Et,h))}async function Gn(d,h={}){let y=h.intervalUs??Sn,x=It(y)*1e6,M=async()=>{let J=Bun.nanoseconds();do{let H=d();if(j(H))await H}while(Bun.nanoseconds()-J<x)},{cpu:A,jit:I,diagnosticWallNs:G}=await He(M,{intervalUs:y}),_=[$t(A),Bt(I)].filter((J)=>J!==void 0);return{cpu:A,jit:I,diagnosticWallNs:G,warnings:_}}function $t(d){let h=Q(d);if(h>=Ft)return;return{code:"low-sample-count",message:`Only ${h} CPU sample(s) at ${d.samplingIntervalUs}\xB5s (target ${Ye}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:h,target:Ye,intervalUs:d.samplingIntervalUs}}}function Bt(d){let{llint:h,baseline:y,dfg:x,ftl:M}=d.tiers,A=h+y+x+M;if(A===0)return;let I=h/A*100,G=y/A*100,_=x/A*100,J=M/A*100;if(I+G<=At)return;return{code:"jit-cold",message:`${(I+G).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:I,baselinePct:G,dfgPct:_,ftlPct:J}}}var Ot=500,Ut=20,jn=3,Ct=10,_t=2,Dt=0.1,Wt=1000,Jn=1e4,Lt=2*Jn,Gt=1e6,jt=5;function Vn(d){let h=Math.log10(Math.max(1,d)/1e6),y=Math.round(jn+_t*h);return Math.min(Ct,Math.max(jn,y))}function Ht(d,h){let y=Math.floor(h/d);return Math.min(Ut,Math.max(y,Vn(d)))}var Jt;function Tn(d){Jt=d}function Hn(d,h){return Math.max(1,Math.ceil(Wt/d),Math.ceil(h/(d*Jn)))}function Vt(d){let h=[...d].sort((y,x)=>y-x);return h[h.length>>1]}async function Kn(d,h={}){let y=(h.budgetMs??Ot)*1e6,x=y*(h.warmup??Dt),M=await De(d),A=M.ns,I=Ne(d,M.isAsync),G=Bun.nanoseconds(),_=1;while(Bun.nanoseconds()-G<x){let z=await I(_);if(A=Math.max(1,z/_),z<Gt)_*=2}let J=Hn(A,y);if(J>1){let z=[];for(let V=0;V<jt;V++)z.push(await I(J)/J);A=Math.max(1,Vt(z)),J=Hn(A,y)}let H=A*J,ne=h.samples??h.minSamples??Ht(H,y),oe=h.samples!==void 0?0:y,be=h.samples??Math.max(Lt,ne),ee=[],re=Bun.nanoseconds(),te=0,se=0;while(se<ne||te<oe&&se<be){let z=await I(J);if(ee.push({i:se,wallNs:z/J}),se++,te=Bun.nanoseconds()-re,h.gc)Bun.gc(!0)}let fe=c(ee.map((z)=>z.wallNs));if(J>1)fe.batch=J;let he=ke(fe,[],"inprocess"),K=Vn(H);if(ee.length<K)he.push({code:"low-sample-count",message:`Only ${ee.length} sample(s) at ~${e(H)} per trial; ${K} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:ee.length,target:K,trialCostNs:H}});return{trials:ee,timing:fe,warnings:he}}function U(d,h,y){let x=F(h),M=_e(h).map((A)=>mn(d,A,{params:h.params}).id);return mn(d,x,{label:x,formerIds:M.length>0?M:void 0,baseline:h.baseline,group:h.groupName,description:h.opts?.description,groupDescription:h.groupDescription,isolated:y,params:h.params,skipped:h.skipped})}async function pe(d,h,y){let x=h.some((J)=>!J.skipped),{environment:M,noiseWarning:A}=O(x?y.noiseCheck:!1),I=Le(h),G=[],_=[];for(let J=0;J<h.length;J++){let H=h[J],ne=U(d,H,y.markIsolated);if(G.push(ne),H.skipped)continue;let{enter:oe,leave:be}=I(J);if(await g(H,"before",oe),H.opts?.before)await H.opts.before();let ee={budgetMs:H.opts?.budgetMs??y.budgetMs,samples:H.opts?.samples??y.samples,minSamples:H.opts?.minSamples??y.minSamples,warmup:y.warmup,gc:Cn(H,y.gc??!1)},re=zn(),te=await Kn(H.fn,ee),se=zn();if(_.push(W({workload:ne,heapUsed:{beforeBytes:re,afterBytes:se},configFingerprint:i({budgetMs:ee.budgetMs??null,samples:ee.samples??null,minSamples:ee.minSamples??null,gc:ee.gc??!1}),trials:te.trials,timing:te.timing,warnings:A&&_.length===0?[...te.warnings,A]:te.warnings})),_n(H,y.cpu??!1)){let fe=y.cpuIntervalUs??Sn,he=await Gn(H.fn,{intervalUs:fe});_.push(P({workload:ne,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:fe}),diagnosticWallNs:he.diagnosticWallNs,cpu:he.cpu,jit:he.jit,warnings:he.warnings,artifacts:[]}))}if(We(H,y.alloc??!1)){let fe=await le(H.fn);_.push(P({workload:ne,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:fe.diagnosticWallNs,memory:fe.memory,warnings:[],artifacts:[]}))}if(H.opts?.after)await H.opts.after();await g(H,"after",be)}return v(M),r(G,_,M)}
|
|
15
|
+
export{T,l,we,ln,ye,q,R,e,c,k,o,ke,ae,S,n,r,me,pn,W,P,Xe,fn,i,Y,Qe,u,E,a,Pe,v,xe,Z,Me,p,b,N,Te,Re,Se,L,m,s,ve,gn,X,Ce,t,C,$e,Oe,f,w,en,ce,Ae,O,Ie,Ee,j,Ne,De,Fe,Be,Ue,xn,Mn,D,ue,hn,F,_e,nn,We,de,Le,g,tn,B,Q,le,je,He,Tn,U,pe};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{j}from"./chunk-5m601yfv.js";import{heapStats as w}from"bun:jsc";function H(){let{heapSize:o,extraMemorySize:e}=w(),s=process.memoryUsage.rss();return{rssBytes:s,residentBytes:f()??s,liveBytes:o+e}}function f(){if(process.platform!=="darwin")return;let o=Bun.spawnSync(["ps","-o","rss=","-p",String(process.pid)],{stderr:"ignore"}),e=Number(o.stdout.toString().trim());return o.success&&e>0?e*1024:void 0}var t={ready:1,go:2,sampling:3,stop:4},g=`self.onmessage = (event) => {
|
|
3
|
+
const slots = new Int32Array(event.data)
|
|
4
|
+
Atomics.store(slots, 0, ${t.ready})
|
|
5
|
+
Atomics.wait(slots, 0, ${t.ready})
|
|
6
|
+
if (Atomics.compareExchange(slots, 0, ${t.go}, ${t.sampling}) === ${t.go}) {
|
|
7
|
+
while (Atomics.load(slots, 0) === ${t.sampling}) {
|
|
8
|
+
const kib = (process.memoryUsage.rss() / 1024) | 0
|
|
9
|
+
if (kib > Atomics.load(slots, 1)) Atomics.store(slots, 1, kib)
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
postMessage(0)
|
|
13
|
+
}`,d=1e4;async function G(o=g){let e=new Int32Array(new SharedArrayBuffer(8)),s=new Worker(URL.createObjectURL(new Blob([o],{type:"application/javascript"}))),a=new Promise((r,c)=>{let n=(m)=>c(Error(`RSS sampler worker failed: ${m}`));s.onerror=(m)=>n(m.message||"uncaught error"),s.addEventListener("close",()=>n("worker exited unexpectedly"))});a.catch(()=>{});let i=new Promise((r)=>{s.onmessage=r});try{s.postMessage(e.buffer);let r=Date.now()+d;while(Atomics.load(e,0)!==t.ready){if(Date.now()>r)throw Error("RSS sampler worker failed: did not start in time");await Promise.race([Bun.sleep(1),a])}}catch(r){throw s.terminate(),r}return{async during(r){try{Atomics.store(e,0,t.go),Atomics.notify(e,0);let c=Bun.nanoseconds()+50000000;while(Atomics.load(e,0)!==t.sampling&&Bun.nanoseconds()<c);let n=Date.now()+d;while(Atomics.load(e,0)!==t.sampling){if(Date.now()>n)throw Error("RSS sampler worker failed: did not start sampling");await Promise.race([Bun.sleep(1),a])}return await r(),Atomics.store(e,0,t.stop),await Promise.race([i,a]),Atomics.load(e,1)*1024}finally{s.terminate()}}}}async function ne(o,e,s){let a=s??await G();Bun.gc(!0);let i=H(),r=process.resourceUsage().maxRSS*1024,c=Bun.nanoseconds(),n=0,m=await a.during(async()=>{let p=o();if(j(p))await p;n=Bun.nanoseconds()-c}),l=process.resourceUsage().maxRSS*1024,u=Math.max(m,l>r?l:0),y=e?i.residentBytes-e.residentBytes-(i.liveBytes-e.liveBytes):0;return{peakBytes:Math.max(0,u-i.rssBytes),slackBytes:Math.max(0,y),wallNs:n}}
|
|
14
|
+
export{H,G,ne};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{k,o,Ne,De}from"./chunk-5m601yfv.js";function y(n){return n==="cand"?"candidate":n}class se extends Error{side;constructor(n,t){super(t instanceof Error?t.message:String(t),{cause:t});this.side=n}}async function R(n,t){try{return await t()}catch(r){throw r instanceof se?r:new se(n,r)}}var C=15,_=1e7,N=1e6,O=3;async function un(n,t,r={}){let i=r.rounds??C,{signal:s}=r;s?.throwIfAborted();let m=Bun.nanoseconds(),c=r.candFirst?["cand","base"]:["base","cand"],b=c.toReversed(),h={base:n,cand:t},p={};for(let e of c)p[e]=await R(e,()=>De(h[e]));let M=Bun.deepEquals(p.base.result,p.cand.result),g=(e)=>{let a=Ne(h[e],p[e].isAsync);return(d)=>R(e,()=>a(d))},f={base:g("base"),cand:g("cand")},A=async(e)=>{for(let a=1;;a*=2){s?.throwIfAborted();let d=await e(a);if(d>=N)return Math.max(1,d/a)}},l={base:0,cand:0};for(let e of c)l[e]=await A(f[e]);let u=Math.max(1,Math.round(_/Math.max(l.base,l.cand)));for(let e=0;e<O;e++){s?.throwIfAborted();for(let a of c)await f[a](u)}let S=[],x=[],w=[];for(let e=0;e<i;e++){s?.throwIfAborted();let a={base:0,cand:0};for(let P of e%2===0?c:b)a[P]=await f[P](u);let d=Math.max(1,a.base),T=Math.max(1,a.cand);S.push(d/u),x.push(T/u),w.push(T/d)}return{rounds:i,batch:u,baseSamples:S,candSamples:x,ratios:w,sameOutput:M,diagnosticWallNs:Bun.nanoseconds()-m}}function I(n){return!(n.suiteChanged&&!n.sameOutput)}function dn(n,t,r,i){let s=t-n,m=Math.abs(s)>Math.max(i,n*r/100);return{baseBytes:n,candBytes:t,verdict:!m?"unchanged":s>0?"regressed":"improved",floorBytes:i}}function ie(n,t){let r=k(n),i=o(r,0.5),s=o(r,0.25),m=o(r,0.75),c=t/100,b=i>1+c&&s>1?"regressed":i<1-c&&m<1?"improved":void 0;return{medianRatio:i,ratioP25:s,ratioP75:m,...b&&{flagged:b}}}
|
|
3
|
+
export{y,se,un,I,dn,ie};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{T,l,we,ln,ye,q,R,e,c,k,o,ke,S,n,r,me,pn,W,P,fn,i,Y,a,Pe,v,xe,Z,Me,p,b,N,Te,Re,Se,L,m,s,ve,gn,X,Ce,t,C,$e,Oe,f,w,en,ce,Ae,O,Ie,Ee,Fe,Be,Ue,D,hn,B,Q,je,He,pe}from"./chunk-5m601yfv.js";import{y,I,dn,ie}from"./chunk-fc36fd0b.js";import{appendFileSync as Co,existsSync as jn,lstatSync as vo,readdirSync as pr,realpathSync as Ut,renameSync as Io,statSync as Oo,symlinkSync as Do,unlinkSync as No,utimesSync as Eo}from"fs";import{mkdir as Ao}from"fs/promises";import{relative as fr,sep as Fo}from"path";function Yr(u){let g=u>>>0;return()=>{g=g+1831565813|0;let E=Math.imul(g^g>>>15,1|g);return E=E+Math.imul(E^E>>>7,61|E)^E,((E^E>>>14)>>>0)/4294967296}}var mt=2000,qr=2000;function qt(u,g,E){if(u.length<=E)return u;let F=[...u];for(let U=0;U<E;U++){let H=U+Math.floor(g()*(F.length-U)),j=F[U];F[U]=F[H],F[H]=j}return F.slice(0,E)}class Nt{sorted;rankOf;counts;n;constructor(u){let g=u.length,E=new Uint32Array(g);for(let F=0;F<g;F++)E[F]=F;E.sort((F,U)=>u[F]-u[U]),this.sorted=new Float64Array(g),this.rankOf=new Uint32Array(g);for(let F=0;F<g;F++)this.sorted[F]=u[E[F]],this.rankOf[E[F]]=F;this.n=g,this.counts=new Uint32Array(g)}resampleMedian(u){let{n:g,counts:E,sorted:F,rankOf:U}=this;E.fill(0);for(let ue=0;ue<g;ue++)E[U[Math.floor(u()*g)]]++;let H=g+1>>1,j=g%2===0?H+1:H,ee=0,G=-1;for(let ue=0;ue<g;ue++){if(ee+=E[ue],G<0&&ee>=H)G=ue;if(ee>=j)return G===ue?F[ue]:(F[G]+F[ue])/2}return F[g-1]}}function Qr(u,g){let E=new Float64Array(u.length+g.length+1);return E.set(u),E[u.length]=Number.NaN,E.set(g,u.length+1),Bun.hash.crc32(E)}function Qt(u,g,E={}){if(u.length===0||g.length===0)throw RangeError("bootstrapMedianDiffCi: both sides need samples");let F=E.seed??Qr(u,g),U=Yr(F),H=E.iterations??qr,j=u.length>mt||g.length>mt,ee=new Nt(qt(u,U,mt)),G=new Nt(qt(g,U,mt)),ue=o(ee.sorted,0.5),ne=new Float64Array(H);for(let ae=0;ae<H;ae++){let se=ee.resampleMedian(U),We=G.resampleMedian(U)-se;ne[ae]=ue===0?We===0?0:We*(1/0):We/ue*100}return ne.sort(),{ci95:[o(ne,0.025),o(ne,0.975)],seed:F,data:{subsampled:j,iterations:H}}}function Xr(u){let g=u<0?-1:1,E=Math.abs(u),F=0.254829592,U=-0.284496736,H=1.421413741,j=-1.453152027,ee=1.061405429,G=0.3275911,ue=1/(1+0.3275911*E),ne=1-((((1.061405429*ue+-1.453152027)*ue+1.421413741)*ue+-0.284496736)*ue+0.254829592)*ue*Math.exp(-E*E);return g*ne}function Zr(u){return 0.5*(1+Xr(u/Math.SQRT2))}function Xt(u,g){let E=u.length,F=g.length,U=E+F;if(E===0||F===0)return{u:0,z:0,pValue:1};let H=k(u),j=k(g),ee=0,G=0,ue=0,ne=0,ae=0;while(ue<E||ne<F){let _e=ne>=F||ue<E&&H[ue]<=j[ne]?H[ue]:j[ne],Ne=0;while(ue<E&&H[ue]===_e)Ne++,ue++;let Le=0;while(ne<F&&j[ne]===_e)Le++,ne++;let Ve=Ne+Le,ze=ae+(Ve+1)/2;if(ee+=Ne*ze,Ve>1)G+=Ve**3-Ve;ae+=Ve}let se=ee-E*(E+1)/2,De=E*F/2,We=Math.sqrt(E*F*(U+1-G/(U*(U-1)))/12),de=We===0?0:(se-De)/We,le=Math.min(1,Math.max(0,2*(1-Zr(Math.abs(de)))));return{u:se,z:de,pValue:le}}var x={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Et=5;function tt(u,g){if(u===0)return g===0?0:1/0;return(g-u)/u*100}function Zt(u){let g=new Map;for(let E of u.measurements){let F=`${E.workloadId}\x00${E.phase}`;if(!g.has(F))g.set(F,E)}return(E,F)=>g.get(`${E}\x00${F}`)}function er(u){let g=new Map;for(let E of u.measurements){let F=E.memory;if(!F||E.phase!=="timing"&&E.phase!=="memstats")continue;let U=g.get(E.workloadId)??{};if(E.phase==="timing")U.heapUsedBefore=F.heapUsedBeforeBytes,U.heapUsedAfter=F.heapUsedAfterBytes,U.maxRss=F.maxRssBytes;else if(F.kind==="peak")U.peak=F.peakBytes;else U.retained=F.bytesPerOp;g.set(E.workloadId,U)}return(E)=>g.get(E)??{}}function nr(u){let{referenceMedianNs:g,driftPct:E}=u.noise;return g*(1+(E??0)/200)}function eo(u,g){if(!u.environment||!g.environment)return;let E=nr(u.environment),F=E>0?(nr(g.environment)/E-1)*100:0;return Math.max(Math.abs(u.environment.noise.driftPct??0),Math.abs(g.environment.noise.driftPct??0),Math.abs(F))}function no(u,g,E){let F=new Map(u.workloads.map((j)=>[j.id,j])),U=new Map(g.workloads.map((j)=>[j.id,j])),H=eo(u,g);return{base:Zt(u),cand:Zt(g),baseMemory:er(u),candMemory:er(g),baseWorkloads:F,candWorkloads:U,baseIdFor:(j)=>{if(F.has(j))return j;return U.get(j)?.formerIds?.find((ee)=>F.has(ee))},environmentMismatch:to(u,g),driftPct:H,effectiveTimingPct:Math.max(E.timingPct,u.environment?.noise.floorPct??0,g.environment?.noise.floorPct??0)+(H??0)}}function to(u,g){let E=[["platform.os",u.platform.os,g.platform.os],["platform.arch",u.platform.arch,g.platform.arch],["bunVersion",u.bunVersion,g.bunVersion]];if(u.environment&&g.environment)E.push(["cpuModel",u.environment.cpuModel,g.environment.cpuModel],["cores",u.environment.cores,g.environment.cores]);let F=E.filter(([,U,H])=>U!==H).map(([U,H,j])=>({field:U,base:H,cand:j}));if(F.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${F.map((U)=>U.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:F}}}function ro(u){let g=[];for(let F of u){if(!F.timing)continue;let U=1+F.timing.medianDeltaPct/100;if(Number.isFinite(U)&&U>0)g.push(Math.log(U))}if(g.length===0)return null;let E=g.reduce((F,U)=>F+U,0)/g.length;return(Math.exp(E)-1)*100}function Ke(u,g,E=x){let F=no(u,g,E),U=()=>{let H=new Set,j=[];for(let ee of g.workloads){let G=F.baseIdFor(ee.id);if(G===void 0)j.push(ee);else H.add(G)}return{baseOnly:u.workloads.filter((ee)=>!H.has(ee.id)),candOnly:j}};return{effectiveTimingPct:F.effectiveTimingPct,driftPct:F.driftPct,compare:(H)=>uo(F,H,E),unmatched:U,compared(H){let j=new Set(H.map(([ne])=>ne)),ee=g.workloads.filter((ne)=>!j.has(ne.id)),{baseOnly:G}=U(),ue=(ne,ae)=>({workloadId:ne.id,task:m(ne),...ne.entry?.group!==void 0&&{group:ne.entry.group},verdict:ae});return[...H.map(([ne,ae])=>so(F,ne,ae)),...ee.map((ne)=>ue(ne,"missing-base")),...G.map((ne)=>ue(ne,"missing-cand"))]}}}var oo=["heapUsedBefore","heapUsedAfter","retained","peak","maxRss"];function so(u,g,E){let F=u.baseIdFor(g)??g,U=u.candWorkloads.get(g),H=u.baseWorkloads.get(F),j={workloadId:g,task:U?m(U):g,...U?.entry?.group!==void 0&&{group:U.entry.group},verdict:E.timing?.verdict??"unchanged",comparisonId:E.id,pass:E.verdict==="pass"};if(F!==g)j.renamedFrom={workloadId:F,task:H?m(H):F};let ee=u.base(F,"timing")?.timing,G=u.cand(g,"timing")?.timing;if(E.timing&&ee&&G){let{medianDeltaPct:se,ci95:De,pValue:We}=E.timing;j.timing={unit:"ns",baseMedian:ee.median,candMedian:G.median,baseSamples:ee.samples.length,candSamples:G.samples.length,medianDeltaPct:se,...De&&{ci95:De},...We!==void 0&&{pValue:We},thresholdPct:E.thresholds.effectiveTimingPct}}let ue=u.baseMemory(F),ne=u.candMemory(g),ae=[];for(let se of oo){let De=ue[se],We=ne[se];if(De===void 0||We===void 0)continue;ae.push({reading:se,baseBytes:De,candBytes:We,deltaPct:tt(De,We)})}if(ae.length>0)j.memory=ae;return j}function qe(u,g,E){let F=0,U=0,H=0;for(let j of u){if(!j.timing)continue;if(j.timing.verdict==="regressed")F++;else if(j.timing.verdict==="improved")U++;else H++}return{matched:u.length,regressed:F,improved:U,unchanged:H,geomeanPct:ro(u),effectiveTimingPct:g,...E!==void 0&&{driftPct:E},verdict:u.some((j)=>j.verdict==="fail")?"fail":"pass"}}function fe(u,g,E=x){let F=Ke(u,g,E),U=[];for(let j of g.workloads){let ee=F.compare(j.id);if(ee)U.push([j.id,ee])}let H=U.map(([,j])=>j);return{comparisons:H,unmatched:F.unmatched(),compared:F.compared(U),summary:qe(H,F.effectiveTimingPct,F.driftPct)}}function io(u,g,E,F){let U=u.samples,H=g.samples,j=tt(u.median,g.median),ee=tt(u.mean,g.mean),G=(ae,se)=>{if(ae>E)return"regressed";if(se<-E)return"improved";return"unchanged"};if(U.length<Et||H.length<Et)return{timing:{medianDeltaPct:j,meanDeltaPct:ee,verdict:G(j,j)},warning:{code:"thin-comparison",message:`Only ${U.length} baseline / ${H.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Et}+ per side).`,data:{baseSamples:U.length,candSamples:H.length}}};let ue=Qt(U,H,{iterations:F.bootstrapIterations}),ne=Xt(U,H);return{timing:{medianDeltaPct:j,meanDeltaPct:ee,ci95:ue.ci95,pValue:ne.pValue,seed:ue.seed,verdict:ne.pValue<F.alpha?G(ue.ci95[0],ue.ci95[1]):"unchanged"}}}function ao(u,g,E){let F=(ae)=>new Map(ae.totals.map((se)=>[ae.frames[se.frameIx].key,se.selfUs])),U=(ae)=>new Map(ae.frames.map((se)=>[se.key,se.name])),H=F(u),j=F(g),ee=U(u),G=U(g),ue=[...new Set([...H.keys(),...j.keys()])].map((ae)=>{let se=H.get(ae)??0,De=j.get(ae)??0;return{frameKey:ae,name:G.get(ae)??ee.get(ae)??ae,baseSelfUs:se,candSelfUs:De,deltaPct:tt(se,De)}}).sort((ae,se)=>Math.abs(se.deltaPct)-Math.abs(ae.deltaPct)),ne=ue.some((ae)=>(ae.baseSelfUs>=E.minFrameSelfUs||ae.candSelfUs>=E.minFrameSelfUs)&&ae.deltaPct>E.frameSelfPct);return{frames:ue,failed:ne}}function mo(u,g,E){let F=new Map(u.typeCounts.map((j)=>[j.type,j])),U=new Map(g.typeCounts.map((j)=>[j.type,j])),H=[...new Set([...F.keys(),...U.keys()])].map((j)=>{let ee=F.get(j),G=U.get(j);return{type:j,baseCount:ee?.count??0,candCount:G?.count??0,baseBytes:ee?.retainedBytes,candBytes:G?.retainedBytes,deltaPct:tt(ee?.count??0,G?.count??0)}}).sort((j,ee)=>Math.abs(ee.deltaPct)-Math.abs(j.deltaPct));return{heapTypes:H,failed:H.some((j)=>j.deltaPct>E.heapTypePct)}}function uo(u,g,E){let{effectiveTimingPct:F}=u,U=u.baseIdFor(g);if(U===void 0)return;let H=u.base(U,"timing"),j=u.cand(g,"timing"),ee=u.base(U,"cpu"),G=u.cand(g,"cpu"),ue=u.base(U,"heap"),ne=u.cand(g,"heap"),ae=u.candWorkloads.get(g),se=H?.id??ee?.id??ue?.id,De=j?.id??G?.id??ne?.id??ae?.id;if(!se||!De)return;let We=!1,de=[];if(u.environmentMismatch)de.push(u.environmentMismatch);let le;if(H?.timing&&ae?.skipped&&!j?.timing)le={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},de.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:g}});else if(H?.timing&&j?.timing){let Le=io(H.timing,j.timing,F,E);if(le=Le.timing,Le.warning)de.push(Le.warning);if(le.verdict==="regressed")We=!0}let _e;if(ee?.cpu&&G?.cpu){let Le=ao(ee.cpu,G.cpu,E);_e=Le.frames,We||=Le.failed}let Ne;if(ue?.heap&&ne?.heap){let Le=mo(ue.heap,ne.heap,E);Ne=Le.heapTypes,We||=Le.failed}return{id:n("cmp",se,De),baselineMeasurementId:se,candidateMeasurementId:De,timing:le,...de.length>0&&{warnings:de},frames:_e,heapTypes:Ne,thresholds:{...E,effectiveTimingPct:F},verdict:We?"fail":"pass"}}class d extends Error{}var tr=(u)=>typeof u==="object"&&u!==null&&!Array.isArray(u),st=(u)=>(g)=>typeof g==="number"&&Number.isInteger(g)&&g>=u,Dn=(u)=>(g)=>typeof g==="number"&&Number.isFinite(g)&&g>=u,En=(u)=>typeof u==="string",co=(u)=>typeof u==="boolean",ot=(u)=>Array.isArray(u)&&u.every(En),rr=(...u)=>(g)=>u.includes(g),on=(u,g)=>({ok:u,expects:g}),On=on(st(1),"a positive integer"),lo=on(st(0),"a non-negative integer"),At=on(En,"a string"),Nn=on(co,"a boolean"),ut=on(ot,"an array of strings"),po={timingPct:on(Dn(0),"a non-negative number"),frameSelfPct:on(Dn(0),"a non-negative number"),heapTypePct:on(Dn(0),"a non-negative number"),minFrameSelfUs:on(Dn(0),"a non-negative number"),alpha:on((u)=>Dn(0)(u)&&u<=1,"a number in [0, 1]"),bootstrapIterations:On},fo={suites:ut,preload:ut,bunFlags:ut,jobs:on((u)=>st(1)(u)||u==="auto",'a positive integer or "auto"'),budgetMs:on(Dn(0),"a non-negative number"),samples:On,minSamples:On,gc:Nn,cpu:Nn,cpuIntervalUs:On,alloc:Nn,peakMem:Nn,filter:At,isolate:Nn,outDir:At,timeoutMs:On},go={setup:on((u)=>En(u)||ot(u),"a command string or an array of them"),keepTrees:On,alloc:Nn,peakMem:Nn,memThresholdPct:on(Dn(0),"a non-negative number")},ho=["inputs","prepare","timeSource","ignoreExitCodes"],bo={label:At,command:on((u)=>ot(u)&&u.length>0,"a non-empty array of strings (argv, no shell)"),suites:on((u)=>ot(u)&&u.length>0,"a non-empty array of glob strings"),inputs:ut,prepare:on((u)=>En(u)||ot(u)||typeof u==="function","a command string, an argv array, or (ostia.config.ts) a function"),timeSource:on((u)=>tr(u)&&(En(u.pattern)||u.pattern instanceof RegExp)&&(u.group===void 0||st(0)(u.group))&&(u.unit===void 0||rr("ns","us","ms","s")(u.unit)),'an object { pattern, group?, unit? } with a regex source string (or RegExp) pattern, an integer group, and unit "ns" | "us" | "ms" | "s"'),timeoutMs:On,ignoreExitCodes:on((u)=>Array.isArray(u)&&u.every((g)=>st(0)(g)&&g<=255),"an array of exit codes 0-255")},wo={samples:On,budgetMs:on(Dn(0),"a non-negative number"),minSamples:On,warmup:lo,outDir:on((u)=>En(u)&&u!=="","a non-empty string"),baselineDir:on((u)=>En(u)&&u!=="","a non-empty string"),baseline:on((u)=>En(u)&&u!=="","a non-empty string"),onMissingBaseline:on(rr("warn","fail"),'"warn" or "fail"'),noiseCheck:Nn},Ft=(u)=>typeof u==="function"?"a function":u instanceof RegExp?String(u):JSON.stringify(u)??String(u);function rt(u,g,E,F,U){let H=E===""?"":`${E}.`;for(let[j,ee]of Object.entries(u)){if(ee===void 0)continue;let G=Object.hasOwn(g,j)?g[j]:void 0;if(!G){if(!j.startsWith("$"))U(`${F}: unknown key "${H}${j}" is ignored.`)}else if(!G.ok(ee))throw new d(`${F}: "${H}${j}" must be ${G.expects}, got ${Ft(ee)}.`)}}function ct(u,g,E){if(!tr(u))throw new d(`${E}: "${g}" must be an object, got ${Ft(u)}.`);return u}function yo(u,g,E,F){let U=`workloads[${g}]`,H=ct(u,U,E),j=(G)=>H[G]!==void 0;if(j("command")===j("suites"))throw new d(`${E}: "${U}" needs exactly one of "command" or "suites".`);if(rt(H,bo,U,E,F),j("suites")){for(let G of ho)if(j(G))F(`${E}: "${U}.${G}" applies to command workloads only; ignored on a suites workload.`)}let ee=H.timeSource?.pattern;if(typeof ee==="string")try{new RegExp(ee)}catch(G){throw new d(`${E}: "${U}.timeSource.pattern" is not a valid regex: ${G.message}`)}}function or(u,g,E){let{thresholds:F,workloads:U,bench:H,ab:j,...ee}=u;if(rt(ee,wo,"",g,E),F!==void 0)rt(ct(F,"thresholds",g),po,"thresholds",g,E);if(H!==void 0)rt(ct(H,"bench",g),fo,"bench",g,E);if(j!==void 0)rt(ct(j,"ab",g),go,"ab",g,E);if(U!==void 0){if(!Array.isArray(U))throw new d(`${g}: "workloads" must be an array, got ${Ft(U)}.`);U.forEach((G,ue)=>{yo(G,ue,g,E)})}}var An="node_modules/.cache/ostia",ko=".ostia/baselines",Po={warmup:3,outDir:An,baselineDir:ko,baseline:"main",thresholds:x,workloads:[]},Mo={runs:"samples"},te=["ostia.config.ts","ostia.config.json"],ir=(u)=>console.warn(`ostia: ${u}`);function sr(u){return Object.fromEntries(Object.entries(u).filter(([,g])=>g!==void 0))}function Ro(u,g){if(typeof u!=="object"||u===null||Array.isArray(u))throw new d(`${g}: expected an object.`);for(let[F,U]of Object.entries(Mo))if(F in u)throw new d(`${g}: "${F}" was renamed to "${U}".`);or(u,g,ir);let E=sr(u);return{...Po,...E,thresholds:{...x,...E.thresholds&&sr(E.thresholds)}}}async function To(u){let g=u.startsWith("/")?u:`${process.cwd()}/${u}`,E=Bun.file(g);if(!await E.exists())return;try{if(!u.endsWith(".ts"))return await E.json();let F=(await import(g)).default;if(F===void 0)throw Error('no default export; use "export default defineConfig({ ... })"');return F}catch(F){throw new d(`${u}: ${T(F)}`)}}async function ar(){let u=[];for(let g of te)if(await Bun.file(g).exists())u.push(g);return u}async function an(u){let g=u;if(g===void 0){let F=await ar();if(F.length>1)ir(`${F.join(" and ")} both exist; using ${F[0]} and ignoring the rest.`);g=F[0]}if(g===void 0)return;let E=await To(g);return E===void 0?void 0:Ro(E,g)}function A(u,g){return`${u.baselineDir}/${g??u.baseline}.json`}async function Ye(){return(await ar())[0]}var xo=10,$o=3000,So=3;function mr(u,g){return u!==void 0&&u!==0&&!g.has(u)}function Bt(u){if(Ln("time",u),u.timeSource)we(u.timeSource);let g=u.warmup??So,E=u.samples,F=u.minSamples??xo,U=E!==void 0?0:(u.budgetMs??$o)*1e6,H=u.timeSource!==void 0,j=u.ignoreExitCodes??[],ee=new Set(j),G=[],ue=0,ne=0,ae=!1,se;function De(){if(ae)return!0;if(E!==void 0)return ne>=E;return ne>=F&&ue>=U}async function We(de,le){if(u.prepare)await ye(u.prepare,{phase:de,index:le},{cwd:u.cwd,env:u.env,timeoutMs:u.timeoutMs,signal:u.signal});return ln(u)}return{async warmup(){for(let de=0;de<g;de++){if(u.signal?.aborted)return;await We("warmup",de)}},async step(){if(De()||u.signal?.aborted)return!1;let de=await We("timing",ne);if(u.signal?.aborted)return!1;if(de.timeSourceNoMatch)se??=de.timeSourceMissOutput;let le=de.exitCode??void 0;if(G.push({i:ne,wallNs:de.wallNs,exitCode:le,userNs:de.userNs,systemNs:de.systemNs,maxRssBytes:de.maxRssBytes,...de.reportedNs!==void 0&&{reportedNs:de.reportedNs},...de.timedOut&&{timedOut:!0},...de.timeSourceNoMatch&&{timeSourceNoMatch:!0}}),ue+=de.wallNs,ne++,mr(le,ee))ae=!0;return!0},done:De,result(){let de=G.filter((ze)=>!ze.timedOut&&!ze.timeSourceNoMatch),le=de.map((ze)=>H?ze.reportedNs:ze.wallNs),_e=[],Ne=G.filter((ze)=>ze.timedOut).length;if(Ne>0)_e.push({code:"timeout",message:`${Ne} of ${G.length} trial(s) timed out after ${u.timeoutMs}ms.`,data:{timeoutMs:u.timeoutMs,trials:Ne}});let Le=G.filter((ze)=>ze.timeSourceNoMatch).length;if(Le>0&&u.timeSource){let{pattern:ze}=u.timeSource;_e.push({code:"time-source-no-match",message:`${Le} of ${G.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof ze==="string"?ze:ze.source,trials:Le,...se!==void 0&&{output:se}}})}if(le.length===0)return{trials:G,warnings:_e};let Ve=c(le);return _e.push(...ke(Ve,de.map((ze)=>ze.exitCode),H?"reported":"subprocess",j)),{trials:G,timing:Ve,warnings:_e}}}}async function Wt(u){await u.warmup();while(await u.step());}async function mn(u){let g=Bt(u);return await Wt(g),g.result()}function ge(u,g=[]){if(!u.timing)return!0;let E=new Set(g);return u.trials.some((F)=>mr(F.exitCode,E))}function Ln(u,g){for(let[E,F]of Object.entries({samples:g.samples,minSamples:g.minSamples}))if(F!==void 0&&(!Number.isFinite(F)||F<1))throw RangeError(`${u}: ${E} must be >= 1, got ${F}`);if(g.budgetMs!==void 0&&!Number.isFinite(g.budgetMs))throw RangeError(`${u}: budgetMs must be finite, got ${g.budgetMs}`);if(g.warmup!==void 0&&(!Number.isFinite(g.warmup)||g.warmup<0))throw RangeError(`${u}: warmup must be >= 0, got ${g.warmup}`);if(g.timeoutMs!==void 0&&(!Number.isFinite(g.timeoutMs)||g.timeoutMs<=0))throw RangeError(`${u}: timeoutMs must be > 0, got ${g.timeoutMs}`)}class _ extends l{}class V extends Error{side;constructor(u,g){super(u);this.side=g}}class J extends Error{}var Bo=new URL("./ab-runner.ts",import.meta.url).pathname,Fn={keepTrees:5,base:"HEAD",rounds:15,thresholdPct:10,geomeanThresholdPct:1.5,memThresholdPct:10,confirm:2},ur=1048576,Wo=16384;function cr(u,g){let E=Bun.spawnSync(["git",...u],{cwd:g,stdout:"pipe",stderr:"ignore"});return E.success?E.stdout.toString().trim():void 0}var _t=`
|
|
3
|
+
;globalThis.__ostia_ab_base__;
|
|
4
|
+
`,Uo="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function _o(u){for await(let g of new Bun.Glob(Uo).scan({cwd:u,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(g)||!vo(g).isFile())continue;Co(g,_t)}}function Lo(u,g,E){if(E.length===0)return`${u}/${g}`;return`${u}/${g}-${n("ab-setup",E).slice(-8)}`}var jo=20,Vo=65536,Ho=1000;function dr(u){let g=u.getReader(),E=new TextDecoder,F="",U=(async()=>{try{for(;;){let H=await g.read();if(H.done)return;F=(F+E.decode(H.value,{stream:!0})).slice(-Vo)}}catch{}})();return{done:U,stop:async()=>(await g.cancel().catch(()=>{}),await U,F)}}async function Go(u,g,E,F){let U=Bun.spawn(["sh","-c",u],{cwd:g,env:E,stdout:"pipe",stderr:"pipe",stdin:"ignore",detached:!0}),H=()=>{try{process.kill(-U.pid,"SIGKILL")}catch{}},j=!1,ee=F.timeoutMs===void 0?void 0:setTimeout(()=>{j=!0,H()},F.timeoutMs);if(F.signal?.addEventListener("abort",H),F.signal?.aborted)H();let G=dr(U.stdout),ue=dr(U.stderr),ne;try{let ae=await U.exited;H(),await Promise.race([Promise.all([G.done,ue.done]),new Promise((We)=>{ne=setTimeout(We,Ho)})]);let[se,De]=await Promise.all([G.stop(),ue.stop()]);return{exitCode:ae,timedOut:j,output:De.trim()||se.trim()}}finally{clearTimeout(ee),clearTimeout(ne),F.signal?.removeEventListener("abort",H)}}async function zo(u,g,E){let F=Ut(E.toplevel),U=Ut(E.cwd),H=fr(F,U),j=H&&jn(`${u}/${H}`)?`${u}/${H}`:u,ee=[];for(let[G,ue]of[[`${F}/node_modules`,`${u}/node_modules`],[`${U}/node_modules`,`${j}/node_modules`]]){if(!jn(G)||jn(ue))continue;Do(G,ue),ee.push(ue)}try{for(let G of E.commands){E.onProgress?.({phase:"setup",command:G});let{exitCode:ue,timedOut:ne,output:ae}=await Go(G,j,{...process.env,OSTIA_AB_SHA:g,OSTIA_AB_CANDIDATE_DIR:U},E);if(E.signal?.aborted)return!1;if(ue===0&&!ne)continue;let se=ae.split(`
|
|
5
|
+
`).slice(-jo).join(`
|
|
6
|
+
`),De=ne?`timed out after ${E.timeoutMs}ms`:`exited ${ue}`;throw new J(`Base setup ${De}: ${G}${se?`
|
|
7
|
+
${se}`:""}`)}return!0}finally{for(let G of ee)No(G)}}async function Ko(u,g,E){if(jn(g))return!0;let F=`${g}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;await w(F),await Ao(F,{recursive:!0});let U=Bun.spawn(["git","archive","--format=tar",u],{cwd:E.cwd,stdout:"pipe",stderr:"pipe"}),H=Bun.spawn(["tar","-x","-C",F],{stdin:U.stdout,stderr:"pipe"}),[j,ee]=await Promise.all([U.exited,H.exited]);if(j!==0||ee!==0){let G=await new Response(j!==0?U.stderr:H.stderr).text();throw await w(F),Error(`Could not extract ${u}: ${G.trim()}`)}try{if(!await zo(F,u,E))return await w(F),!1}catch(G){throw await w(F),G}await _o(F);try{Io(F,g)}catch{await w(F)}return!0}var Jo=3600000;function Yo(u){try{return process.kill(u,0),!0}catch(g){return g.code==="EPERM"}}function qo(u){let g=new Date;try{Eo(u,g,g)}catch{}}async function Qo(u,g){if(!jn(u))return 0;let E=Date.now(),F=[],U=[];for(let H of pr(u)){let j=`${u}/${H}`,ee=/\.tmp-(\d+)(?:-\w+)?$/.exec(H);if(ee){if(!Yo(Number(ee[1])))F.push(j);continue}try{U.push({path:j,mtimeMs:Oo(j).mtimeMs})}catch{}}U.sort((H,j)=>j.mtimeMs-H.mtimeMs);for(let H of U.slice(g))if(E-H.mtimeMs>Jo)F.push(H.path);for(let H of F)await w(H);return F.length}async function cn(u={}){let g=u.cwd??process.cwd(),E=`${C(g,u.outDir??An)}/ab`;if(!jn(E))return 0;let F=pr(E).length;return await w(E),F}function Xo(u,g,E,F){let U=u.paired,H=[...E.base,...E.cand],j=(ee,G)=>{let ue=dn(f(E.base.map(ee)),f(E.cand.map(ee)),F,G);if(!I(U))ue.verdict="unchanged";return ue};if(g.alloc){let ee=Math.min(...H.map((G)=>G.alloc.calls));U.retained=j((G)=>G.alloc.bytesPerOp,Wo/ee)}if(g.peakMem){let ee=H.map((ne)=>ne.peak),G=Ae(ee),ue=Math.max(...ee.map((ne)=>ne.slackBytes));if(U.peak=j((ne)=>ne.peak.peakBytes,G?Math.max(ur,ue):ur),G)u.warnings.push(G)}}function Zo(u,g,E){let F=new Map(g.measurements.map((H)=>[H.workloadId,H])),U=u.measurements.map((H)=>{let j=F.get(H.workloadId);if(!j)return H;if(H.threw&&j.threw&&H.threw.side!==j.threw.side)return{...H,threw:{side:"both",message:`${H.threw.message}
|
|
8
|
+
${j.threw.message}`}};if(H.threw)return H;if(j.threw)return j;let ee=H.paired,G=j.paired;if(!ee||!G||!H.timing||!j.timing)return H;let ue=[...ee.ratios,...G.ratios],ne=[...ee.baseSamples,...G.baseSamples],ae=ie(ue,E),se=c([...H.timing.samples,...j.timing.samples]);if(ee.batch>1)se.batch=ee.batch;return{...H,timing:se,diagnosticWallNs:(H.diagnosticWallNs??0)+(j.diagnosticWallNs??0),paired:{rounds:ee.rounds+G.rounds,batch:ee.batch,baseSamples:ne,baseMedianNs:f(ne),ratios:ue,...ae,verdict:ae.flagged??"unchanged",sameOutput:ee.sameOutput&&G.sameOutput}}});return{...u,measurements:U}}function es(u){if(!u.repeats?.length)return u.medianRatio;return f([u.medianRatio,...u.repeats.map((g)=>g.medianRatio)])}function lr(u,g){let E=u.filter((le)=>!le.threw).map((le)=>le.paired).filter((le)=>le!==void 0),F=(le)=>E.filter((_e)=>_e.verdict===le).length,U=E.filter(I),H=U.reduce((le,_e)=>le+Math.log(es(_e)),0),j=U.length>0?(Math.exp(H/U.length)-1)*100:null,ee=F("regressed"),G=F("improved"),ue=u.filter((le)=>le.threw),ne=ue.some((le)=>le.threw?.side==="cand"),{memThresholdPct:ae,...se}=g,De=E.filter((le)=>le.retained||le.peak).map((le)=>[le.retained?.verdict,le.peak?.verdict]),We=De.filter((le)=>le.includes("regressed")),de=De.length>0&&{thresholdPct:ae??Fn.memThresholdPct,regressed:We.length,improved:De.filter((le)=>le.includes("improved")&&!le.includes("regressed")).length};return{...se,matched:E.length,regressed:ee,improved:G,unchanged:E.length-ee-G,unconfirmed:E.filter((le)=>le.confirmed===!1).length,outputDiffers:E.filter((le)=>!le.sameOutput).length,notComparable:E.length-U.length,threw:ue.length,...de&&{memory:de},geomeanPct:j,verdict:ee>0||ne||We.length>0||j!==null&&j>g.geomeanThresholdPct?"fail":"pass"}}async function he(u){let g=u.base??Fn.base,E=u.rounds??Fn.rounds,F=u.thresholdPct??Fn.thresholdPct,U=u.geomeanThresholdPct??Fn.geomeanThresholdPct,H=u.memThresholdPct??Fn.memThresholdPct,j=u.confirm??Fn.confirm,ee=u.keepTrees??Fn.keepTrees;if(!Number.isInteger(ee)||ee<1)throw RangeError(`ab: keepTrees must be an integer >= 1, got ${ee}`);if(!Number.isInteger(E)||E<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${E}`);if(!Number.isInteger(j)||j<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${j}`);for(let[Qe,Ge]of Object.entries({thresholdPct:F,geomeanThresholdPct:U,memThresholdPct:H}))if(!Number.isFinite(Ge)||Ge<0)throw RangeError(`ab: ${Qe} must be >= 0, got ${Ge}`);Ln("ab",{timeoutMs:u.timeoutMs});let G=u.cwd??process.cwd(),ue=C(G,u.outDir??An),ne=Oe(ue,"ab"),ae=u.suites.map((Qe)=>C(G,Qe));for(let[Qe,Ge]of ae.entries())$e(u.suites[Qe],Ge);let se=cr(["rev-parse","--show-toplevel"],G);if(se===void 0)throw new _(`${G} is not inside a git repository.`);let De=cr(["rev-parse","--verify","--quiet",`${g}^{commit}`],G);if(De===void 0)throw new _(`"${g}" is not a commit in ${se}.`);let We=typeof u.baseSetup==="string"?[u.baseSetup]:u.baseSetup??[],de=Lo(`${ue}/ab`,De,We),le=await Ko(De,de,{commands:We,toplevel:se,cwd:G,timeoutMs:u.timeoutMs,signal:u.signal,onProgress:u.onProgress}),_e={base:{ref:g,sha:De},rounds:E,thresholdPct:F,geomeanThresholdPct:U,memThresholdPct:H};if(!le){let Qe=r([],[]);return Qe.unmatched={baseOnly:[],candOnly:[]},Qe.ab=lr([],_e),Qe}let{environment:Ne,noiseWarning:Le}=O(u.noiseCheck),Ve=ae.map((Qe,Ge)=>{let un=fr(se,Ut(Qe));if(un===".."||un.startsWith(`..${Fo}`))throw new l(`${u.suites[Ge]} is outside ${se}.`);return jn(`${de}/${un}`)?`${de}/${un}`:""}),ze=await Promise.all(ae.map(async(Qe,Ge)=>{if(!Ve[Ge])return!1;let un=await Bun.file(Ve[Ge]).text(),Rn=await Bun.file(Qe).text();return(un.endsWith(_t)?un.slice(0,-_t.length):un)!==Rn})),rn=(u.preload??[]).map((Qe)=>C(G,Qe)),Je=u.bunFlags??[],nn=u.onProgress,sn=0,Sn=async(Qe,Ge={},un)=>{qo(de);let Rn=`${ne}/${n("ab-run",ae[Qe],sn++)}.json`,Un={filter:u.filter,rounds:E,thresholdPct:F,preload:rn,progress:nn!==void 0&&!Ge.workloadIds&&!Ge.memoryFor,...Ge},et;try{et=await Ee(["bun",...Je,Bo,ae[Qe],Ve[Qe],Rn,JSON.stringify(Un)],{cwd:G,label:"A/B suite",name:u.suites[Qe],timeoutMs:u.timeoutMs,signal:u.signal,env:un,errorFile:`${Rn}.error`,...Un.progress&&{ipc:(_n)=>nn?.({phase:"measure",suite:Qe+1,suites:ae.length,file:u.suites[Qe],pass:Ge.candFirst?2:1,passes:2,..._n})}})}catch(_n){let nt=Bun.file(`${Rn}.side`);if(!await nt.exists())throw _n;throw new V(_n.message,await nt.text())}return et?Rn:void 0},Wn=async(Qe,Ge={})=>{let un=await Sn(Qe,{...Ge,rounds:Math.ceil(E/2)});if(!un)return;let Rn=await Sn(Qe,{...Ge,planPath:void 0,rounds:Math.floor(E/2),candFirst:!0});if(!Rn)return;return Zo(await a(un),await a(Rn),F)};try{let Qe=[],Ge=[],un=new Map,Rn=[],Un=[],et=[];for(let Xe=0;Xe<ae.length;Xe++){let Mn=`${ne}/${n("ab-plan",ae[Xe])}.json`,Cn=await Wn(Xe,{alloc:u.alloc,peakMem:u.peakMem,planPath:Mn});if(!Cn)break;let In=await Bun.file(Mn).json();for(let xn of In.memory)et.push({...xn,suite:Xe});Qe.push(...Cn.workloads),Ge.push(...Cn.measurements);for(let xn of Cn.measurements){if(un.set(xn.workloadId,Xe),!ze[Xe]||!xn.paired)continue;if(xn.paired.suiteChanged=!0,!I(xn.paired))xn.paired.verdict="unchanged";xn.warnings.push({code:"suite-changed",message:I(xn.paired)?"The suite file differs from the base's copy, so each side may run a different benchmark.":"The suite file differs from the base's copy and so does the output: each side likely ran a different benchmark. Left out of the verdict, geomean and memory verdict."})}Rn.push(...Cn.unmatched?.baseOnly??[]),Un.push(...Cn.unmatched?.candOnly??[])}let _n=Ge.filter((Xe)=>Xe.paired?.flagged&&j>0&&I(Xe.paired)),nt=new Map(Qe.map((Xe)=>[Xe.id,Xe.entry?.task??Xe.id])),zr=0;for(let Xe of _n){let Mn=Xe.paired,Cn=Mn.flagged;Mn.repeats=[];for(let In=0;In<j&&!u.signal?.aborted;In++){nn?.({phase:"confirm",repeat:++zr,repeats:_n.length*j,label:nt.get(Xe.workloadId)??Xe.workloadId});let Vn=(await Wn(un.get(Xe.workloadId),{workloadIds:[Xe.workloadId]}))?.measurements[0];if(Vn?.threw){Xe.threw={...Vn.threw,repeat:In+1};break}let vn=Vn?.paired;if(!vn)break;Mn.repeats.push({medianRatio:vn.medianRatio,ratioP25:vn.ratioP25,ratioP75:vn.ratioP75,...vn.flagged&&{flagged:vn.flagged}})}Mn.confirmed=!Xe.threw&&Mn.repeats.length===j&&Mn.repeats.every((In)=>In.flagged===Cn),Mn.verdict=Mn.confirmed?Cn:"unchanged"}let Kt=new Map(Ge.map((Xe)=>[Xe.workloadId,Xe])),Jt=et.filter(({workloadId:Xe})=>{let Mn=Kt.get(Xe);return Mn?.paired&&!Mn.threw}),Kr=Jt.length*ce*2,Jr=0;for(let Xe of Jt){let{workloadId:Mn,suite:Cn,peakMem:In}=Xe,xn={base:[],cand:[]};for(let Vn=0;Vn<ce&&!u.signal?.aborted;Vn++)for(let vn of["base","cand"]){if(u.signal?.aborted)break;nn?.({phase:"memory",run:++Jr,runs:Kr,side:vn,label:nt.get(Mn)??Mn});let Yt=await Sn(Cn,{memoryFor:{...Xe,side:vn}},In?{OSTIA_PEAK_MEM:"1"}:void 0);if(Yt)xn[vn].push(await Bun.file(Yt).json())}if(xn.base.length===0||xn.cand.length===0)continue;Xo(Kt.get(Mn),Xe,xn,H)}Ie(Ge,Le,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites had already completed.":void 0);let Dt=r(Qe,Ge,Ne);return Dt.unmatched={baseOnly:Rn,candOnly:Un},Dt.ab=lr(Ge,{..._e,newSuites:u.suites.filter((Xe,Mn)=>!Ve[Mn])}),await Qo(`${ue}/ab`,ee),Dt}finally{await w(ne)}}import{resolve as ns}from"path";var ts=["node_modules",".git"],gr=/[*?[\]{}!]/;function rs(u,g){let E=u.split("/"),F=E.findIndex((H)=>gr.test(H)),U=F<0?E.length:F;return[E.slice(U),g.split("/").slice(U)]}async function z(u,g){let E=new Set;for(let F of u){if(!gr.test(F)){if(await Bun.file(ns(g,F)).exists())E.add(F);continue}for await(let U of new Bun.Glob(F).scan({cwd:g,dot:!0})){let[H,j]=rs(F,U);if(!j.some((G)=>ts.includes(G)&&!H.includes(G)))E.add(U)}}return[...E].sort()}var os=new URL("./runner.ts",import.meta.url).pathname;function Ze(){return Math.max(1,navigator.hardwareConcurrency||1)}async function re(u,g,E=process.cwd()){return{suites:u.suites.length>0?u.suites:g?.suites?await z(g.suites,E):[],budgetMs:u.budgetMs??g?.budgetMs,samples:u.samples??g?.samples,minSamples:u.minSamples??g?.minSamples,jobs:u.jobs??(g?.jobs==="auto"?Ze():g?.jobs),gc:u.gc??g?.gc??!1,cpu:u.cpu??g?.cpu??!1,cpuIntervalUs:u.cpuIntervalUs??g?.cpuIntervalUs,alloc:u.alloc??g?.alloc??!1,peakMem:u.peakMem??g?.peakMem??!1,filter:u.filter??g?.filter,isolate:u.isolate??g?.isolate??!1,preload:u.preload.length>0?u.preload:g?.preload??[],bunFlags:u.bunFlags.length>0?u.bunFlags:g?.bunFlags??[],outDir:u.outDir??g?.outDir,noiseCheck:u.noiseCheck,timeoutMs:u.timeoutMs??g?.timeoutMs,cwd:E}}function ss(u,g){if(!g?.length)return[];let E=f(g.map((U)=>U.peakBytes)),F=Ae(g);return[P({workload:u,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:f(g.map((U)=>U.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:E},warnings:F?[F]:[],artifacts:[]})]}async function K(u){Ln("bench",u);let g=u.jobs??1;if(!Number.isInteger(g)||g<1)throw RangeError(`bench: jobs must be an integer >= 1, got ${g}`);let E=u.cwd??process.cwd(),F=Oe(C(E,u.outDir??An),"bench"),U=u.suites.map((se)=>C(E,se));for(let[se,De]of U.entries())$e(u.suites[se],De);let H=(u.preload??[]).map((se)=>C(E,se)),j=u.bunFlags??[],{environment:ee,noiseWarning:G}=O(u.noiseCheck),ue={budgetMs:u.budgetMs,samples:u.samples,minSamples:u.minSamples,gc:u.gc,cpu:u.cpu,cpuIntervalUs:u.cpuIntervalUs,alloc:u.alloc,peakMem:u.peakMem,noiseCheck:!1},ne=(se,De,...We)=>`${F}/${n(se,U[De],...We)}.json`,ae=async(se,De)=>{let We=new Set,de=0,le,_e=async()=>{while(le===void 0&&!u.signal?.aborted&&de<se.length){let Ne=se[de++];try{if(!await Ee(["bun",...j,os,U[Ne.suiteIndex],Ne.outPath,JSON.stringify(Ne.runnerOpts)],{label:"Bench suite",name:u.suites[Ne.suiteIndex],cwd:E,env:De,timeoutMs:u.timeoutMs,signal:u.signal,inFlight:We}))return}catch(Le){le??=Le instanceof Error?Le:Error(String(Le));for(let Ve of We)Ve.kill()}}};if(await Promise.all(Array.from({length:Math.min(g,se.length)},_e)),le)throw le};try{let se=U.map((Je,nn)=>({planPath:ne("bench-plan",nn),outPath:ne("bench-primary",nn)}));await ae(se.map((Je,nn)=>({suiteIndex:nn,outPath:Je.outPath,runnerOpts:{...ue,filter:u.filter,isolate:u.isolate,preload:H,planPath:Je.planPath}})));let De=await Promise.all(se.map(async(Je)=>await Bun.file(Je.planPath).exists()?(await Bun.file(Je.planPath).json()).tasks:[])),We=await Promise.all(se.map((Je)=>en(Je.outPath))),de=De.flatMap((Je,nn)=>Je.filter((sn)=>sn.isolate).map((sn)=>({task:sn,suiteIndex:nn}))),le=de.map((Je,nn)=>ne("bench-item",Je.suiteIndex,nn));await ae(de.map((Je,nn)=>({suiteIndex:Je.suiteIndex,outPath:le[nn],runnerOpts:{...ue,workloadIds:[Je.task.workloadId],preload:H,markIsolated:!0}})));let _e=new Map;await Promise.all(de.map(async(Je,nn)=>{let sn=await en(le[nn]);if(sn)_e.set(Je.task,sn)}));let Ne=De.flatMap((Je,nn)=>Je.filter((sn)=>sn.peakMem).flatMap((sn)=>Array.from({length:ce},()=>({workloadId:sn.workloadId,suiteIndex:nn})))),Le=Ne.map((Je,nn)=>ne("bench-peak",Je.suiteIndex,nn));await ae(Ne.map((Je,nn)=>({suiteIndex:Je.suiteIndex,outPath:Le[nn],runnerOpts:{filter:u.filter,preload:H,peakMemFor:Je.workloadId}})),{OSTIA_PEAK_MEM:"1"});let Ve=new Map;for(let Je=0;Je<Ne.length;Je++){let nn=Bun.file(Le[Je]);if(!await nn.exists())continue;let sn=Ne[Je].workloadId,Sn=Ve.get(sn)??[];Sn.push(await nn.json()),Ve.set(sn,Sn)}let ze=[],rn=[];return De.forEach((Je,nn)=>{let sn=We[nn];if(!sn)return;let Sn=Map.groupBy(sn.measurements,(Qe)=>Qe.workloadId),Wn=0;for(let Qe of Je){let Ge,un;if(Qe.isolate){let Rn=_e.get(Qe);if(!Rn)continue;Ge=Rn.workloads[0],un=Rn.measurements.filter((Un)=>Un.workloadId===Ge.id)}else Ge=sn.workloads[Wn++],un=Sn.get(Ge.id)??[];ze.push(Ge),rn.push(...un,...ss(Ge,Ve.get(Ge.id)))}}),Ie(rn,G,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed.":void 0),v(ee),r(ze,rn,ee)}finally{await w(F)}}function bn(u,g,E=8){if(E<=1)throw RangeError(`range: multiplier must be > 1, got ${E}`);if(u<=0)throw RangeError(`range: start must be > 0, got ${u}`);let F=[];for(let U=u;U<=g;U*=E)F.push(U);if(!F.includes(g))F.push(g);return F}function hr(u){return u.cpu!==void 0}function Lt(u,g){if(g){let E=u.measurements.find((F)=>F.id===g);return E&&hr(E)?[E]:[]}return u.measurements.filter((E)=>E.phase==="cpu"&&hr(E))}function Hn(u,g,E,F){return{files:Lt(u,g.measurementId).map((U)=>({path:`${U.id}.${E}`,content:F(U)}))}}function Gn(u){let g=u.nodes,E=g.length,F=is(u),U=new Int32Array(E).fill(-1);for(let G=0;G<E;G++)for(let ue of g[G].children){let ne=F(ue);if(ne!==-1)U[ne]=G}let H=[];for(let G=0;G<E;G++)if(U[G]===-1)H.push(G);let j=[],ee=[];for(let G=H.length-1;G>=0;G--)ee.push(H[G]);while(ee.length>0){let G=ee.pop();j.push(G);for(let ue of g[G].children){let ne=F(ue);if(ne!==-1&&U[ne]===G)ee.push(ne)}}return{count:E,indexOf:F,parentIx:U,roots:H,order:j}}function is(u){let g=u.nodes,E=g.length,F=1/0,U=-1/0,H=!0;for(let ee=0;ee<E;ee++){let G=g[ee].id;if(!Number.isInteger(G)){H=!1;break}if(G<F)F=G;if(G>U)U=G}if(H&&E>0&&U-F<E*4+64){let ee=U-F+1,G=new Int32Array(ee).fill(-1);for(let ue=0;ue<E;ue++)G[g[ue].id-F]=ue;return(ue)=>{let ne=ue-F;return ne>=0&&ne<ee?G[ne]:-1}}let j=new Map;for(let ee=0;ee<E;ee++)j.set(g[ee].id,ee);return(ee)=>j.get(ee)??-1}function br(u,g){let{count:E,indexOf:F,parentIx:U,order:H}=g,j=new Float64Array(E),ee=new Float64Array(E),G=u.samples?.nodeIds??[],ue=u.samples?.timeDeltasUs??[];for(let ae=0;ae<G.length;ae++){let se=F(G[ae]);if(se===-1)continue;j[se]+=ue[ae]??0,ee[se]+=1}let ne=new Float64Array(E);for(let ae=H.length-1;ae>=0;ae--){let se=H[ae];ne[se]+=j[se];let De=U[se];if(De>=0)ne[De]+=ne[se]}return{selfUs:j,totalUs:ne,samples:ee}}var wr={name:"collapsed",async render(u,g={}){return Hn(u,g,"collapsed.txt",({cpu:E})=>{let{nodes:F,frames:U}=E,H=Gn(E),j=Array(H.count);for(let ne of H.order){let ae=N(U[F[ne].frameIx]),se=H.parentIx[ne];j[ne]=se===-1?ae:`${j[se]};${ae}`}let ee=new Float64Array(H.count),G=[];for(let ne of E.samples?.nodeIds??[]){let ae=H.indexOf(ne);if(ae===-1)continue;if(ee[ae]++===0)G.push(ae)}let ue=G.map((ne)=>`${j[ne]} ${ee[ne]}`);return ue.length>0?`${ue.join(`
|
|
9
|
+
`)}
|
|
10
|
+
`:""})}};var yr={name:"cpuprofile",async render(u,g={}){let E=[],F=[];for(let U of Lt(u,g.measurementId)){let{origin:H}=U.cpu;if(H!=="cpu-prof"&&H!=="inspector"){F.push(`${U.id} (origin ${H} has no .cpuprofile artifact to pass through)`);continue}let j=U.artifacts.find((G)=>G.kind==="cpuprofile");if(!j){F.push(`${U.id} (no cpuprofile artifact recorded on this run)`);continue}let ee=Bun.file(j.path);if(!await ee.exists()){F.push(`${U.id} (artifact missing on disk: ${j.path})`);continue}E.push({path:`${U.id}.cpuprofile`,content:await ee.text()})}if(E.length===0&&F.length>0)return{text:`No .cpuprofile artifacts available:
|
|
11
|
+
${F.map((U)=>` - ${U}`).join(`
|
|
12
|
+
`)}
|
|
13
|
+
`};return{files:E}}};var kr={name:"json",async render(u){return{text:Y(u)}}};var Pr={name:"jsonl",async render(u){let{measurements:g,...E}=u;return{text:`${[S({kind:"document",...E}),...g.map((U)=>S({kind:"measurement",...U}))].join(`
|
|
14
|
+
`)}
|
|
15
|
+
`}}};var Mr=0.5;function $n(u){return new Map(u.workloads.map((g)=>[g.id,g]))}function zn(u){return u.measurements.filter((g)=>g.phase==="timing"&&g.timing!==void 0)}function Kn(u){return u.measurements.filter((g)=>g.phase==="timing"&&g.timing===void 0)}function Jn(u,g){let E=new Set(g.map((F)=>F.workloadId));return u.workloads.filter((F)=>F.skipped&&!E.has(F.id))}function dt(u){for(let g of u.comparisons??[]){let E=g.warnings?.find((F)=>F.code==="environment-mismatch");if(E)return E}return}function lt(u){return(u.warnings??[]).filter((g)=>g.code!=="environment-mismatch")}function as(u){let g=$n(u),E=new Map(u.measurements.map((F)=>[F.id,F]));return(F)=>{let U=E.get(F.candidateMeasurementId),H=U?.workloadId??F.candidateMeasurementId;return{run:U,workloadId:H,workload:g.get(H)}}}function pt(u,g){return(u.frames??[]).slice(0,g).filter((E)=>Math.abs(E.deltaPct)>=Mr)}function ft(u,g){return(u.heapTypes??[]).slice(0,g).filter((E)=>Math.abs(E.deltaPct)>=Mr)}function Yn(u){let g=new Map;for(let E of u.measurements){if(E.phase!=="memstats"||!E.memory)continue;let F=g.get(E.workloadId)??{warnings:[]};if(E.memory.bytesPerOp!==void 0)F.retained=E.memory.bytesPerOp;if(E.memory.peakBytes!==void 0)F.peak=E.memory.peakBytes;F.warnings.push(...E.warnings),g.set(E.workloadId,F)}return g}function it(u,g){let E=g.get(u.workloadId)?.warnings;return E?.length?[...u.warnings,...E]:u.warnings}function gt(u){return[{header:"Retained/op",read:(E)=>E.retained},{header:"Peak mem",read:(E)=>E.peak}].filter((E)=>{for(let F of u.values())if(E.read(F)!==void 0)return!0;return!1}).map((E)=>({header:E.header,cell:(F)=>{let U=u.get(F),H=U&&E.read(U);return H===void 0?void 0:b(H)}}))}function qn(u){if(!u.compared&&!u.comparisons?.length&&!u.unmatched)return[];let g=new Map((u.comparisons??[]).map((F)=>[F.id,F]));return(u.compared??ms(u)).map((F)=>({row:F,cmp:F.comparisonId===void 0?void 0:g.get(F.comparisonId)}))}function ms(u){let g=as(u),E=$n(u),F=(U,H)=>{let j=E.get(U);return{workloadId:U,task:s(j,U),...j?.entry?.group!==void 0&&{group:j.entry.group},verdict:H}};return[...(u.comparisons??[]).map((U)=>{let{run:H,workload:j,workloadId:ee}=g(U),G={workloadId:ee,task:j?m(j):ee,...j?.entry?.group!==void 0&&{group:j.entry.group},verdict:U.timing?.verdict??"unchanged",comparisonId:U.id,pass:U.verdict==="pass"};if(U.timing&&H?.timing){let{medianDeltaPct:ue,ci95:ne,pValue:ae}=U.timing;G.timing={unit:"ns",baseMedian:H.timing.median/(1+ue/100),candMedian:H.timing.median,candSamples:H.timing.samples.length,medianDeltaPct:ue,...ne&&{ci95:ne},...ae!==void 0&&{pValue:ae},thresholdPct:U.thresholds.effectiveTimingPct}}return G}),...(u.unmatched?.candOnly??[]).map((U)=>F(U,"missing-base")),...(u.unmatched?.baseOnly??[]).map((U)=>F(U,"missing-cand"))]}var us=10,cs={heapUsedBefore:"heap used before",heapUsedAfter:"heap used after",retained:"retained/op",peak:"peak",maxRss:"max RSS"};function ht(u,g="\u2192"){return(u.memory??[]).filter((E)=>!(Math.abs(E.deltaPct)<us)).map((E)=>`${cs[E.reading]} ${b(E.baseBytes)} ${g} ${b(E.candBytes)} (${Number.isFinite(E.deltaPct)?t(E.deltaPct):"new"})`)}function bt(u){let g=u.comparisonSummary,E=u.comparisons?.[0]?.thresholds.timingPct;if(!g||E===void 0)return;if(!(g.effectiveTimingPct>E))return;let F=g.driftPct!==void 0&&g.driftPct>0?` and drift (${g.driftPct.toFixed(1)}%); \`ostia ab\` alternates base and candidate in one process, so drift can't favor either`:"";return`Timing threshold ${E.toFixed(1)}%, widened to ${g.effectiveTimingPct.toFixed(1)}% by machine noise${F}`}function wt(u){return u==="missing-base"?"candidate only (new, or renamed without `aliases`)":"base only (removed, or renamed without `aliases`)"}function Rr(u){return u.phase==="paired"&&u.threw!==void 0}function Tr(u){return u.phase==="paired"&&u.threw===void 0&&u.timing!==void 0&&u.paired!==void 0}function Qn(u){return u.measurements.filter(Tr)}function kt(u){return u.measurements.filter(Rr)}function xr(u){let g=[];for(let E of u.measurements)if(Rr(E))g.push({kind:"threw",run:E});else if(Tr(E))g.push({kind:"timed",run:E});return g}function Pt(u){return`${y(u.side)} threw${u.repeat?` (repeat ${u.repeat})`:""}`}function yt(u){return t((u-1)*100)}function ds(u){if(!I(u))return"not comparable";if(!u.flagged)return"";let g=u.repeats?.length?` (repeats: ${u.repeats.map((E)=>yt(E.medianRatio)).join(", ")})`:"";if(u.confirmed===void 0)return`${u.flagged}${g}`;return`${u.confirmed?`${u.flagged}, confirmed`:`${u.flagged}? unconfirmed`}${g}`}function Mt(u){if(!u.newSuites?.length)return;return`New suite${u.newSuites.length>1?"s":""}, not at ${u.base.ref}: ${u.newSuites.join(", ")}`}function Rt(u){let g=u.paired,E=R(Math.min(g.baseMedianNs,u.timing.median));return{base:e(g.baseMedianNs,E),candidate:e(u.timing.median,E),change:yt(g.medianRatio),spread:`${yt(g.ratioP25)}\u2026${yt(g.ratioP75)}`,verdict:ds(g)}}function Tt(u){return Qn(u).flatMap((g)=>{let E=[],{retained:F,peak:U}=g.paired;if(F)E.push({run:g,reading:"retained/op",change:F});if(U)E.push({run:g,reading:"peak",change:U});return E})}function ls(u){let g=Math.round(u.baseBytes),E=Math.round(u.candBytes)-g;if(E===0)return"0B";let F=`${E>0?"+":"-"}${b(Math.abs(E))}`;if(g===0||u.baseBytes<u.floorBytes)return F;return`${F} (${t(E/g*100)})`}function xt({reading:u,change:g}){return{reading:u,base:b(g.baseBytes),candidate:b(g.candBytes),change:ls(g),verdict:g.verdict==="unchanged"?"":g.verdict}}function $t(u){let g=u.memory?` \xB7 memory threshold ${u.memory.thresholdPct}%`:"";return`working tree vs ${u.base.ref} (${u.base.sha.slice(0,7)}) \xB7 ${u.rounds} rounds \xB7 threshold ${u.thresholdPct}% \xB7 geomean threshold ${u.geomeanThresholdPct}%${g}`}function St(u){let g=u.geomeanPct===null?"Geomean -":`Geomean ${t(u.geomeanPct)} (threshold ${u.geomeanThresholdPct}%)`,E=[u.unconfirmed>0&&`${u.unconfirmed} unconfirmed`,u.notComparable>0&&`${u.notComparable} not comparable`,u.threw>0&&`${u.threw} threw`].filter(Boolean),F=E.length>0?` (${E.join(", ")})`:"",U=u.memory?` \xB7 memory: ${u.memory.regressed} regressed, ${u.memory.improved} improved`:"";return`${g} \xB7 ${u.regressed} regressed, ${u.improved} improved, ${u.unchanged} unchanged of ${u.matched}${F}${U} \xB7 ${u.verdict}`}function Ct(u){let g=$n(u),E=(F)=>s(g.get(F),F);return{outputDiffers:Qn(u).filter((F)=>!F.paired.sameOutput).map((F)=>E(F.workloadId)),baseOnly:(u.unmatched?.baseOnly??[]).map(E),candOnly:(u.unmatched?.candOnly??[]).map(E)}}function Bn(u){if(!u?.entry)return;if(u.entry.group!==void 0)return u.entry.group;let g=u.entry.task,E=g.lastIndexOf("/");return E===-1?void 0:g.slice(0,E)}function $r(u,g){return g!==void 0&&u.startsWith(`${g}/`)?u.slice(g.length+1):u}function Xn(u){if(u.length<2)return;let g=Math.min(...u.map((U)=>U.run.timing.median)),E=new Map;for(let U of u){let H=Bn(U.workload);if(H===void 0)continue;let j=E.get(H);if(j)j.push(U);else E.set(H,[U])}let F=new Map;for(let U of u){let H=Bn(U.workload),j=g;if(H!==void 0){let ee=E.get(H),G=ee.find((ue)=>ue.workload?.baseline);j=G?G.run.timing.median:Math.min(...ee.map((ue)=>ue.run.timing.median))}F.set(U,U.run.timing.median/j)}return F}var Sr=10,Cr=10,Tn=(u)=>gn(String(u));function Zn(u,g){return[`| ${u.join(" | ")} |`,`|${u.map(()=>"---").join("|")}|`,...g.map((E)=>`| ${E.join(" | ")} |`)]}function ps(u){if(!u?.params)return"";return` (${Object.entries(u.params).map(([E,F])=>`${E}=${F}`).join(", ")})`}function at(u,g){return Tn(s(u,g)+ps(u))}function jt(u){return`${u.message} (\`${u.code}\`)`}function vr(u,g){return g.map((E)=>`- **${u}**: ${jt(E)}`)}function fs(u){let g;for(let E of u){let F=E?.params?Object.keys(E.params):void 0;if(F?.length!==2)return;if(g===void 0)g=F;else if(F.some((U,H)=>U!==g[H]))return}return g}var Ir={name:"markdown",async render(u){let g=$n(u),E=u.git?` \xB7 ${L(u.git)}`:"",F=dt(u);return{text:["# Profile Report","",`Bun ${u.bunVersion} \xB7 ostia ${u.toolVersion} \xB7 ${u.platform.os}/${u.platform.arch} \xB7 ${u.createdAt}${E}`,"",...u.environment?[Se(u.environment),""]:[],...F?[`> \u26A0 ${F.message}`,""]:[],...u.ab?gs(u,u.ab,g):[],...hs(u,g),...bs(u,g),...ks(u)].join(`
|
|
16
|
+
`)}}};function gs(u,g,E){let F=Qn(u),U=["## A/B","",$t(g),""];if(F.length>0)U.push(...Zn(["Task","Base","Candidate","Change","p25\u2026p75","Verdict"],F.map((ne)=>{let ae=Rt(ne);return[at(E.get(ne.workloadId),ne.workloadId),ae.base,ae.candidate,ae.change,ae.spread,ae.verdict?`**${Tn(ae.verdict)}**`:""]})),"");let H=Tt(u);if(H.length>0)U.push(...Zn(["Task","Memory","Base","Candidate","Change","Verdict"],H.map((ne)=>{let ae=xt(ne);return[at(E.get(ne.run.workloadId),ne.run.workloadId),ae.reading,ae.base,ae.candidate,ae.change,ae.verdict?`**${ae.verdict}**`:""]})),"");let j=kt(u);if(j.length>0){U.push(`Threw (${j.length}):`,"");for(let ne of j){let ae=ne.threw.message.split(`
|
|
17
|
+
`)[0].replaceAll("`","'");U.push(`- **${at(E.get(ne.workloadId),ne.workloadId)}**: ${Pt(ne.threw)}: \`${ae}\``)}U.push("")}let ee=Ct(u),G=(ne,ae)=>ae.length>0?`${ne}: ${ae.map(Tn).join(", ")}`:void 0;for(let ne of[G("Output differs from the base",ee.outputDiffers),Mt(g),G("Base only",ee.baseOnly),G("Candidate only",ee.candOnly)])if(ne)U.push(ne,"");let ue=F.flatMap((ne)=>vr(s(E.get(ne.workloadId),ne.workloadId),ne.warnings));if(ue.length>0)U.push(...ue,"");return U.push(`**${St(g)}**`,""),U}function hs(u,g){let E=zn(u),F=Kn(u),U=Yn(u),H=[...Jn(u,E).map((se)=>({id:se.id,workload:se,status:"skipped"})),...F.map((se)=>({id:se.workloadId,workload:g.get(se.workloadId),status:"no samples"}))];if(E.length===0&&H.length===0)return[];let j=["## Timing",""],ee=E.map((se)=>({run:se,workload:g.get(se.workloadId)})),G=new Map,ue=[];for(let se of ee){let De=Bn(se.workload);if(De===void 0)ue.push(se);else if(G.has(De))G.get(De).push(se);else G.set(De,[se])}let ne=[];for(let[se,De]of G){let We=fs(De.map((de)=>de.workload));if(We)ne.push({group:se,keys:We,rows:De});else ue.push(...De)}if(ue.length>0||H.length>0){let se=Xn(ee),De=[],We=new Map(ue.map((de)=>[de,X(de.run)]));if([...We.values()].some(Boolean))De.push({header:"User/Sys",cell:(de)=>{let le=We.get(de);return le?Ce(le):"-"}});for(let de of gt(U))De.push({header:de.header,cell:(le)=>de.cell(le.run.workloadId)??"-"});if(se)De.push({header:"Relative",cell:(de)=>ve(se.get(de),!!de.workload?.baseline)});j.push(...Zn(["Task","Median","Spread (p75\u2026p99)","Mean \xB1 SD","Range","MAD",...De.map((de)=>de.header)],[...ue.map((de)=>{let le=de.run.timing,_e=R(le.median);return[at(de.workload,de.run.workloadId),e(le.median,_e),Z(le.p75,le.p99,_e),`${e(le.mean,_e)} \xB1 ${e(le.stddev,_e)}`,Z(le.min,le.max,_e),e(le.mad,_e),...De.map((Ne)=>Ne.cell(de))]}),...H.map(({id:de,workload:le,status:_e})=>[at(le,de),`- ${_e}`,"-","-","-","-",...De.map(()=>"-")])]),"")}for(let{group:se,keys:[De,We],rows:de}of ne){let le=[],_e=[],Ne=new Map;for(let{run:Le,workload:Ve}of de){let ze=Ve.params[De],rn=Ve.params[We];if(!le.includes(ze))le.push(ze);if(!_e.includes(rn))_e.push(rn);Ne.set(`${ze} ${rn}`,Le.timing.median)}j.push(`### ${Tn(se)} (${Tn(De)} \xD7 ${Tn(We)})`,"",...Zn([`${Tn(De)} \\ ${Tn(We)}`,..._e.map(Tn)],le.map((Le)=>[Tn(Le),..._e.map((Ve)=>{let ze=Ne.get(`${Le} ${Ve}`);return ze===void 0?"-":e(ze)})])),"")}let ae=[...E,...F].flatMap((se)=>vr(s(g.get(se.workloadId),se.workloadId),it(se,U)));if(ae.length>0)j.push("### Warnings","",...ae,"");return j}function bs(u,g){let E=[];for(let F of u.measurements){if(F.phase!=="cpu"&&F.phase!=="heap")continue;let U=s(g.get(F.workloadId),F.workloadId);E.push(F.phase==="cpu"?`## CPU capture - ${U}`:`## Heap snapshot - ${U}`,"",`instrumented, diagnostic wall ${Me(F.diagnosticWallNs??0)}ms`,"",...F.phase==="cpu"?ws(F):ys(F));let H=[...F.artifacts.map((j)=>`- artifact: \`${j.path}\``),...F.warnings.map((j)=>`- ! ${jt(j)}`)];if(H.length>0)E.push(...H,"")}return E}function ws(u){let{cpu:g}=u;if(!g)return[];let E=[`origin: \`${g.origin}\`, interval: ${g.samplingIntervalUs}\xB5s, samples: ${Q(g)}`,"",...Zn(["Self %","Self (ms)","Total (ms)","Frame"],Te(g,Sr).map((F)=>[`${F.pct}%`,p(F.selfUs),p(F.totalUs),Tn(N(F.frame))])),""];if(u.jit){let F=u.jit.tiers;E.push(`JIT tiers: LLInt ${F.llint} \xB7 Baseline ${F.baseline} \xB7 DFG ${F.dfg} \xB7 FTL ${F.ftl}`,"")}return E}function ys(u){let{heap:g}=u;if(!g)return[];return[Re(g),"",...Zn(["Count","Type"],g.typeCounts.slice(0,Cr).map((E)=>[String(E.count),Tn(E.type)])),""]}function ks(u){let g=qn(u);if(g.length===0)return[];let E=["## Comparisons",""],F=bt(u);if(F)E.push(`${F}.`,"");let U=[];for(let{row:H,cmp:j}of g){if(H.verdict==="missing-base"||H.verdict==="missing-cand"){U.push(`- \`${Tn(H.task)}\`: ${wt(H.verdict)}`);continue}if(E.push(`### ${H.pass===!1?"\u2717":"\u2713"} ${H.task}`,""),H.renamedFrom)E.push(`- renamed from \`${Tn(H.renamedFrom.task)}\``);if(H.timing){let{baseMedian:G,candMedian:ue,medianDeltaPct:ne,ci95:ae,pValue:se}=H.timing,De=j?.thresholds.alpha,We=H.verdict==="unchanged"&&se!==void 0&&De!==void 0&&se>=De?"~":"",de=R(Math.max(G,ue)),le=[`n=${H.timing.candSamples}`];if(ae)le.push(`95% CI [${t(ae[0])}, ${t(ae[1])}]`);if(se!==void 0)le.push(`p=${se.toFixed(4)}`);le.push(`threshold ${H.timing.thresholdPct.toFixed(1)}%`),E.push(`- timing: ${e(G,de)} \u2192 ${e(ue,de)}, ${We}${t(ne)} median, ${le.join(", ")} (**${H.verdict}**)`)}let ee=ht(H);if(ee.length>0)E.push(`- memory: ${ee.join(", ")}`);if(j){for(let G of pt(j,Sr))E.push(`- frame \`${Tn(G.name)}\`: ${t(G.deltaPct)} self-time (${p(G.baseSelfUs)}ms \u2192 ${p(G.candSelfUs)}ms)`);for(let G of ft(j,Cr))E.push(`- heap \`${Tn(G.type)}\`: ${t(G.deltaPct)} count (${G.baseCount} \u2192 ${G.candCount})`);for(let G of lt(j))E.push(`- ! ${jt(G)}`)}E.push("")}if(U.length>0)E.push("### Not compared","",...U,"");return E}var Ps=15;function Ms(u,g,E){return`${u.replace(/"/g,"'")} (self ${p(g)}ms, total ${p(E)}ms)`}function Rs(u,g,E,F){let U=[];if(F<=0)return U;for(let H=0;H<g;H++){if(H===E)continue;let j=u[H];if(U.length===F&&j<=u[U[F-1]])continue;let ee=U.length;while(ee>0&&u[U[ee-1]]<j)ee--;if(U.splice(ee,0,H),U.length>F)U.pop()}return U}var Or={name:"mermaid",async render(u,g={}){let E=g.topN??Ps;return Hn(u,g,"mermaid.md",({cpu:F})=>{let{nodes:U,frames:H}=F,j=Gn(F),{selfUs:ee,totalUs:G}=br(F,j),{parentIx:ue}=j,ne=j.roots[0]??-1,ae=new Set(ne!==-1?[ne]:[]);for(let We of Rs(ee,j.count,ne,E)){let de=[];for(let le=We;le!==-1;le=ue[le])de.push(le);for(let le=de.length-1;le>=0;le--)ae.add(de[le])}let se=(We)=>`n${U[We].id}`,De=["graph TD"];for(let We of ae){let de=N(H[U[We].frameIx]);De.push(` ${se(We)}["${Ms(de,ee[We],G[We])}"]`)}for(let We of ae){let de=ue[We];if(de!==-1&&ae.has(de))De.push(` ${se(de)} --> ${se(We)}`)}return`${De.join(`
|
|
18
|
+
`)}
|
|
19
|
+
`})}};var M=2;function tn(u){return Number.isFinite(u)?Number(u.toPrecision(6)):u}function Dr(u){return{base:Math.round(u.baseBytes),cand:Math.round(u.candBytes),verdict:u.verdict,floor:Math.round(u.floorBytes)}}function Vt(u){return u.map((g)=>g.data?{code:g.code,data:g.data}:{code:g.code})}function Ht(u,g){if(g?.entry?.group!==void 0)u.group=g.entry.group;if(g?.description!==void 0)u.description=g.description;if(g?.groupDescription!==void 0)u.groupDescription=g.groupDescription;if(g?.params!==void 0)u.params=g.params}function Er(u,g){if(!u?.timing)return;let E={...g?.timing&&{baseMedian:tn(g.timing.baseMedian)},medianPct:tn(u.timing.medianDeltaPct),meanPct:tn(u.timing.meanDeltaPct),verdict:u.timing.verdict,pass:u.verdict==="pass",effectiveTimingPct:tn(u.thresholds.effectiveTimingPct),matched:!0};if(u.timing.ci95)E.ci95=[tn(u.timing.ci95[0]),tn(u.timing.ci95[1])];if(u.timing.pValue!==void 0)E.pValue=tn(u.timing.pValue);if(g?.renamedFrom)E.renamedFrom=g.renamedFrom.task;return E}function Nr(u,g,E,F,U,H,j){let ee={event:"run",protocolVersion:M,schemaVersion:u.schemaVersion,workloadId:g.id,task:s(g,g.id),...E,batch:1,warnings:Vt(F)};if(Ht(ee,g),j!==void 0)ee.noiseFloorPct=tn(j);let G=Er(U,H);if(G)ee.delta=G;return ee}function Ts(u){let g=$n(u),E=u.environment?.noise.floorPct,F=(_e)=>({run:_e,workload:g.get(_e.workloadId)}),U=zn(u).map(F),H=Xn(U),j=[...U,...Qn(u).map(F)],ee=new Map((u.comparisons??[]).map((_e)=>[_e.candidateMeasurementId,_e])),G=new Map(qn(u).map(({row:_e})=>[_e.comparisonId,_e])),ue=(_e)=>_e&&G.get(_e.id),ne=Yn(u),ae=new Map;for(let _e of u.measurements){if(_e.phase!=="cpu"||_e.warnings.length===0)continue;let Ne=ae.get(_e.workloadId)??[];ae.set(_e.workloadId,[...Ne,..._e.warnings])}let se=(_e,Ne)=>[..._e.warnings,...ae.get(_e.workloadId)??[],...ne.get(_e.workloadId)?.warnings??[],...Ne?.warnings??[]],De=Jn(u,j.map((_e)=>_e.run)).map((_e)=>Nr(u,_e,{skipped:!0},ee.get(_e.id)?.warnings??[],ee.get(_e.id),ue(ee.get(_e.id)),E)),We=Kn(u).flatMap((_e)=>{let Ne=g.get(_e.workloadId);if(!Ne)return[];let Le=ee.get(_e.id);return Nr(u,Ne,{samples:0},se(_e,Le),Le,ue(Le),E)}),de=j.map((_e)=>{let{run:Ne,workload:Le}=_e,Ve=Ne.timing,ze=ee.get(Ne.id),rn={event:"run",protocolVersion:M,schemaVersion:u.schemaVersion,workloadId:Ne.workloadId,task:s(Le,Ne.workloadId),unit:"ns",samples:Ve.samples.length,batch:Ve.batch??1,mean:tn(Ve.mean),median:tn(Ve.median),stddev:tn(Ve.stddev),stddevPct:tn(Ve.mean===0?0:Ve.stddev/Ve.mean*100),min:tn(Ve.min),max:tn(Ve.max),warnings:Vt(se(Ne,ze))};rn.p75=tn(Ve.p75),rn.p99=tn(Ve.p99),rn.mad=tn(Ve.mad);let Je=X(Ne);if(Je)rn.userNs=tn(Je.userNs),rn.systemNs=tn(Je.systemNs);let nn=ne.get(Ne.workloadId),sn=nn?.retained??Ne.paired?.retained?.candBytes;if(sn!==void 0)rn.retainedBytesPerOp=Math.round(sn);let Sn=nn?.peak??Ne.paired?.peak?.candBytes;if(Sn!==void 0)rn.peakBytes=Math.round(Sn);Ht(rn,Le);let Wn=H?.get(_e);if(Wn!==void 0)rn.relative=tn(Wn);if(Le?.baseline)rn.baseline=!0;if(E!==void 0)rn.noiseFloorPct=tn(E);let Qe=Er(ze,ue(ze));if(Qe)rn.delta=Qe;let Ge=Ne.paired;if(Ge)rn.paired={baseMedian:tn(Ge.baseMedianNs),medianRatio:tn(Ge.medianRatio),ratioP25:tn(Ge.ratioP25),ratioP75:tn(Ge.ratioP75),rounds:Ge.rounds,verdict:Ge.verdict,...Ge.flagged&&{flagged:Ge.flagged},...Ge.confirmed!==void 0&&{confirmed:Ge.confirmed},...Ge.repeats&&{repeats:Ge.repeats.map((un)=>tn(un.medianRatio))},sameOutput:Ge.sameOutput,...Ge.suiteChanged&&{suiteChanged:!0},...Ge.retained&&{retained:Dr(Ge.retained)},...Ge.peak&&{peak:Dr(Ge.peak)}};return rn}),le=kt(u).map((_e)=>{let Ne=g.get(_e.workloadId),Le={event:"run",protocolVersion:M,schemaVersion:u.schemaVersion,workloadId:_e.workloadId,task:s(Ne,_e.workloadId),batch:1,warnings:Vt(_e.warnings)};if(Ht(Le,Ne),E!==void 0)Le.noiseFloorPct=tn(E);return Le.threw=_e.threw,Le});return[...de,...We,...le,...De]}function xs(u){if(!u.unmatched)return[];let g=(E,F)=>({event:"unmatched",protocolVersion:M,workloadId:E.id,task:s(E,E.id),side:F});return[...u.unmatched.baseOnly.map((E)=>g(E,"base")),...u.unmatched.candOnly.map((E)=>g(E,"cand"))]}function $s(u){return u===0?"pass":u===1?"fail":"error"}function Ss(u,g){let E=g.command==="ab"&&u.ab?{...u.ab,effectiveTimingPct:u.ab.thresholdPct}:u.comparisonSummary,F=(g.unmatched?.baseOnly.length??0)+(g.unmatched?.candOnly.length??0),U={event:"summary",protocolVersion:M,command:g.command,matched:E?.matched??0,regressed:E?.regressed??0,improved:E?.improved??0,unchanged:E?.unchanged??0,unmatched:F,geomeanPct:E?.geomeanPct!==void 0?E.geomeanPct:null,effectiveTimingPct:tn(E?.effectiveTimingPct??0),verdict:$s(g.exitCode),exitCode:g.exitCode};if(g.command==="ci"){if(U.cached=g.cached??0,U.executed=g.executed??0,U.failed=g.failed??0,U.missingBaseline=g.missingBaseline??0,g.baseline)U.baseline=g.baseline}if(g.command==="ab"&&u.ab){if(U.base=u.ab.base,U.geomeanThresholdPct=u.ab.geomeanThresholdPct,U.unconfirmed=u.ab.unconfirmed,U.outputDiffers=u.ab.outputDiffers,u.ab.notComparable!==void 0)U.notComparable=u.ab.notComparable;if(u.ab.threw!==void 0)U.threw=u.ab.threw;if(u.ab.newSuites?.length)U.newSuites=u.ab.newSuites;if(u.ab.memory)U.memory=u.ab.memory}if(u.comparisonSummary?.driftPct!==void 0&&g.command!=="ab")U.driftPct=tn(u.comparisonSummary.driftPct);if(u.environment)U.noiseFloorPct=tn(u.environment.noise.floorPct);if(g.baseGit||g.candGit)U.git={...g.baseGit&&{base:g.baseGit},...g.candGit&&{cand:g.candGit}};if(g.exportedTo)U.exportedTo=g.exportedTo;return U}var Ar={name:"minimal",async render(u,g={}){let E=[...Ts(u)];if(g.protocol)E.push(...xs(g.protocol)),E.push(Ss(u,g.protocol));let F=E.map((U)=>JSON.stringify(U));return{text:F.length>0?`${F.join(`
|
|
20
|
+
`)}
|
|
21
|
+
`:""}}};var Cs="https://www.speedscope.app/file-format-schema.json",Fr={name:"speedscope",async render(u,g={}){let E=$n(u);return Hn(u,g,"speedscope.json",(F)=>{let{cpu:U}=F,{nodes:H}=U,j=Gn(U),ee=U.samples?.nodeIds??[],G=U.samples?.timeDeltasUs??[],ue=Array(j.count);for(let We of j.order){let de=j.parentIx[We],le=H[We].frameIx;ue[We]=de===-1?[le]:[...ue[de],le]}let ne=ee.map((We)=>{let de=j.indexOf(We);return de===-1?[]:ue[de]}),ae=E.get(F.workloadId),se=ae?.label??ae?.command?.join(" ")??ae?.entry?.task??"profile",De={$schema:Cs,exporter:"ostia",name:se,activeProfileIndex:0,shared:{frames:U.frames.map((We)=>({name:N(We),file:We.url,line:We.line!==void 0?We.line+1:void 0}))},profiles:[{type:"sampled",name:se,unit:"microseconds",startValue:0,endValue:G.reduce((We,de)=>We+de,0),samples:ne,weights:G}]};return`${JSON.stringify(De,null,2)}
|
|
22
|
+
`})}};var Br=5,Wr=5,vs=10;function zt(u,g){let E=(G)=>G.group!==void 0?" ":"",F=(G)=>$r(G.label,G.group),U=4;for(let G of g)U=Math.max(U,E(G).length+F(G).length);let H=`${"Task".padEnd(U)} ${u.map((G)=>G.header.padEnd(G.width)).join(" ")}`,j=[H,"-".repeat(H.length)],ee;for(let G of g){if(G.group!==void 0&&G.group!==ee)j.push(`${G.group}:`);ee=G.group;let ue=E(G),ne=(ue+F(G)).padEnd(U),ae=G.data;if(j.push(ae===void 0?`${ne} - ${G.status}`:`${ne} ${u.map((se)=>se.cell(ae).padEnd(se.width)).join(" ")}`),G.warnings.length>0)j.push(`${ue} ! ${G.warnings.map((se)=>se.code).join(", ")}`)}return j}function Ur(u){let g=u.flatMap((E)=>E.warnings.map((F)=>` ${E.label}: ${F.message}`));return g.length>0?["","Warnings:",...g]:[]}function Gt(u){return{text:`${u.map((g)=>g.trimEnd()).join(`
|
|
23
|
+
`)}
|
|
24
|
+
`}}var _r={name:"table",async render(u){let g=u.environment?[Se(u.environment),""]:[];if(u.ab)return Gt(Os(u,u.ab,g));let E=zn(u),F=Kn(u),U=Ds(u);if(E.length===0&&F.length===0&&Jn(u,E).length===0)return U.length>0?Gt([...g,...U]):{text:`(no timing runs)
|
|
25
|
+
`};let H=[...g,...Is(u,E,F)],j=Ns(u);if(j.length>0)H.push("",...j);if(U.length>0)H.push("",...U);return Gt(H)}};function Is(u,g,E){let F=Yn(u),U=new Map(g.map((se)=>[se.workloadId,se])),H=new Map(E.map((se)=>[se.workloadId,se])),j=[],ee=[];for(let se of u.workloads){let De=U.get(se.id),We=m(se),de=Bn(se);if(De){let le={run:De,workload:se};ee.push(le),j.push({label:We,group:de,data:le,warnings:it(De,F)})}else if(H.has(se.id)){let le=it(H.get(se.id),F);j.push({label:We,group:de,status:"no samples",warnings:le})}else if(se.skipped)j.push({label:We,group:de,status:"skipped",warnings:[]})}let G=({run:se})=>R(se.timing.median),ue=new Map(ee.map((se)=>[se,X(se.run)])),ne=Xn(ee),ae=[{header:"Median",width:10,cell:(se)=>e(se.run.timing.median,G(se))},{header:"Spread",width:18,cell:(se)=>Z(se.run.timing.p75,se.run.timing.p99,G(se))},{header:"Range",width:18,cell:(se)=>Z(se.run.timing.min,se.run.timing.max,G(se))}];if([...ue.values()].some(Boolean))ae.push({header:"User/Sys",width:18,cell:(se)=>{let De=ue.get(se);return De?Ce(De):""}});for(let se of gt(F))ae.push({header:se.header,width:Math.max(se.header.length,vs),cell:(De)=>se.cell(De.run.workloadId)??""});if(ne)ae.push({header:"Relative",width:8,cell:(se)=>ve(ne.get(se),!!se.workload?.baseline)});return[...zt(ae,j),...Ur(j)]}function Os(u,g,E){let F=$n(u),U=[...E,`A/B: ${$t(g)}`,""],H=[],j=xr(u).map(({kind:ne,run:ae})=>{let se=F.get(ae.workloadId),De=s(se,ae.workloadId),We;if(ne==="threw"){let de=Pt(ae.threw);H.push({label:De,verdict:de,message:ae.threw.message}),We={base:"-",candidate:"-",change:"",spread:"",verdict:de}}else We=Rt(ae);return{label:De,group:Bn(se),data:We,warnings:ae.warnings}});if(j.length>0)U.push(...zt([{header:"Base",width:10,cell:(ne)=>ne.base},{header:"Candidate",width:10,cell:(ne)=>ne.candidate},{header:"Change",width:9,cell:(ne)=>ne.change},{header:"p25\u2026p75",width:18,cell:(ne)=>ne.spread},{header:"Verdict",width:7,cell:(ne)=>ne.verdict}],j));let ee=Tt(u);if(ee.length>0)U.push("","Memory:",...zt([{header:"Reading",width:11,cell:(ne)=>ne.reading},{header:"Base",width:10,cell:(ne)=>ne.base},{header:"Candidate",width:10,cell:(ne)=>ne.candidate},{header:"Change",width:18,cell:(ne)=>ne.change},{header:"Verdict",width:7,cell:(ne)=>ne.verdict}],ee.map((ne)=>{let ae=F.get(ne.run.workloadId);return{label:s(ae,ne.run.workloadId),group:Bn(ae),data:xt(ne),warnings:[]}})));let G=Ct(u);if(H.length>0){U.push("",`Threw (${H.length}):`);for(let ne of H){let[ae,...se]=ne.message.split(`
|
|
26
|
+
`);U.push(` ${ne.label}: ${ne.verdict}: ${ae}`);for(let De of se)U.push(` ${De}`)}}if(G.outputDiffers.length>0)U.push("",`Output differs from the base (${G.outputDiffers.length}):`,...G.outputDiffers.map((ne)=>` ${ne}`));let ue=Mt(g);if(ue)U.push("",ue);if(G.baseOnly.length>0||G.candOnly.length>0){if(U.push("","Unmatched:"),G.baseOnly.length>0)U.push(` base only: ${G.baseOnly.join(", ")}`);if(G.candOnly.length>0)U.push(` candidate only: ${G.candOnly.join(", ")}`)}return U.push(...Ur(j),"",St(g)),U}function Ds(u){let g=qn(u);if(g.length===0)return[];let E=[],F=dt(u);if(F)E.push(`\u26A0 ${F.message}`,"");let U=bt(u);if(U)E.push(U,"");let H=[],j=[];for(let{row:ee,cmp:G}of g){if(ee.verdict==="missing-base"||ee.verdict==="missing-cand"){j.push(` ${ee.task}: ${wt(ee.verdict)}`);continue}if(E.push(`${ee.pass===!1?"\u2717":"\u2713"} ${ee.task}`),ee.renamedFrom)E.push(` renamed from ${ee.renamedFrom.task}`);if(ee.timing){let{baseMedian:ae,candMedian:se,medianDeltaPct:De,ci95:We,pValue:de}=ee.timing,le=R(Math.max(ae,se)),_e=`${e(ae,le)} -> ${e(se,le)}`;if(We&&de!==void 0){let Ne=de<0.001?"p<0.001":`p=${de.toFixed(3)}`;E.push(` timing: ${_e}, ${t(De)} median, 95% CI [${t(We[0])}, ${t(We[1])}], ${Ne} (${ee.verdict})`)}else E.push(` timing: ${_e}, ${t(De)} median (${ee.verdict})`)}let ue=ht(ee,"->");if(ue.length>0)E.push(` memory: ${ue.join(", ")}`);if(!G)continue;for(let ae of pt(G,Br))E.push(` frame ${ae.name}: ${t(ae.deltaPct)} self-time (${p(ae.baseSelfUs)}ms -> ${p(ae.candSelfUs)}ms)`);for(let ae of ft(G,Wr))E.push(` heap ${ae.type}: ${t(ae.deltaPct)} count (${ae.baseCount} -> ${ae.candCount})`);let ne=lt(G);if(ne.length>0){E.push(` ! ${ne.map((ae)=>ae.code).join(", ")}`);for(let ae of ne)H.push(` ${ee.task}: ${ae.message}`)}}if(j.length>0)E.push("","Not compared:",...j);if(H.length>0)E.push("","Comparison warnings:",...H);return E}function Ns(u){let g=$n(u),E=[];for(let F of u.measurements){if(F.phase!=="cpu"&&F.phase!=="heap")continue;let U=g.get(F.workloadId),H=s(U,F.workloadId);if(F.phase==="cpu")if(F.cpu){E.push(`CPU capture - ${H} (instrumented, ${F.cpu.samplingIntervalUs}\xB5s interval, ${Q(F.cpu)} samples, diagnostic wall ${Me(F.diagnosticWallNs??0)}ms)`);for(let j of Te(F.cpu,Br))E.push(` ${j.pct.padStart(5)}% ${p(j.selfUs).padStart(8)}ms self ${j.frame?.name??"?"}`)}else E.push(`CPU capture - ${H} (instrumented, no evidence captured)`);else if(F.heap){E.push(`Heap snapshot - ${H} (instrumented, ${Re(F.heap)})`);for(let j of F.heap.typeCounts.slice(0,Wr))E.push(` ${String(j.count).padStart(6)} ${j.type}`)}else E.push(`Heap snapshot - ${H} (instrumented, no evidence captured)`);for(let j of F.artifacts)E.push(` artifact: ${j.path}`);for(let j of F.warnings)E.push(` ! ${j.message}`)}return E}var h={table:_r,json:kr,markdown:Ir,jsonl:Pr,minimal:Ar,collapsed:wr,mermaid:Or,speedscope:Fr,cpuprofile:yr};async function wn(u={}){let g=D();if(g.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let E=Bun.main,F;try{F=B(g,u.filter,E)}catch(H){throw Error(`run(): ${H.message}`)}let U=await pe(E,F,u);if(!u.quiet){let H=u.format??"table",{text:j}=await h[H].render(U,{});if(j)process.stdout.write(j)}return U}function yn(u,g){let E=Object.keys(u),F=(U,H)=>{if(U===E.length){hn(H,()=>g(H));return}let j=E[U];for(let ee of u[j])F(U+1,{...H,[j]:ee})};F(0,{})}function Es(u){return u.startsWith("file://")?u.slice(7):u}function vt(u,g,E){let F=u.nodes,U=F.length,{frames:H,intern:j}=Fe(),ee=new Map,G=Array(U);for(let Ne=0;Ne<U;Ne++){let Le=F[Ne],Ve=Le.callFrame,ze=j(Ve.functionName,Es(Ve.url)||void 0,Ve.lineNumber>=0?Ve.lineNumber:void 0,Ve.columnNumber>=0?Ve.columnNumber:void 0);G[Ne]={id:Le.id,frameIx:ze,children:Le.children??[]},ee.set(Le.id,Ne)}let ue=new Float64Array(U),ne=new Float64Array(U),{samples:ae,timeDeltas:se}=u;for(let Ne=0;Ne<ae.length;Ne++){let Le=ee.get(ae[Ne]);if(Le===void 0)continue;ue[Le]+=se[Ne]??0,ne[Le]+=1}let De=new Int32Array(U).fill(-1);for(let Ne=0;Ne<U;Ne++){let Le=F[Ne].children;if(!Le)continue;for(let Ve of Le){let ze=ee.get(Ve);if(ze!==void 0)De[ze]=Ne}}let We=[],de=[];for(let Ne=U-1;Ne>=0;Ne--)if(De[Ne]===-1)de.push(Ne);while(de.length>0){let Ne=de.pop();We.push(Ne);let Le=F[Ne].children;if(!Le)continue;for(let Ve of Le){let ze=ee.get(Ve);if(ze!==void 0&&De[ze]===Ne)de.push(ze)}}let le=new Float64Array(U);for(let Ne=We.length-1;Ne>=0;Ne--){let Le=We[Ne];le[Le]+=ue[Le];let Ve=De[Le];if(Ve>=0)le[Ve]+=le[Le]}let _e=new Map;for(let Ne=0;Ne<U;Ne++)Be(_e,G[Ne].frameIx,ue[Ne],le[Ne],ne[Ne]);return{origin:g,samplingIntervalUs:E,frames:H,nodes:G,totals:Ue(_e),samples:{nodeIds:u.samples,timeDeltasUs:u.timeDeltas}}}async function Lr(u,g={}){let E=g.intervalUs??je,{Session:F}=await import("inspector/promises"),U=new F;U.connect();try{await U.post("Profiler.enable"),await U.post("Profiler.setSamplingInterval",{interval:E});let H=Bun.nanoseconds();await U.post("Profiler.start");let j=await u(),{profile:ee}=await U.post("Profiler.stop"),G=Bun.nanoseconds()-H,ue=vt(ee,"inspector",E);return{result:j,cpu:ue,diagnosticWallNs:G}}finally{U.disconnect()}}function As(u){return u.replace(/[\s"']/g,"\\$&")}function Fs(u,g,E){let F=u[0];if(F&&/(^|[\\/])bun(\.exe)?$/.test(F))return{argv:[F,...g,...u.slice(1)],env:E};let U={...process.env,...E},H=g.map(As).join(" ");return{argv:u,env:{...U,BUN_OPTIONS:U.BUN_OPTIONS?`${U.BUN_OPTIONS} ${H}`:H}}}async function It(u,g,E){let F=`${u.artifactDir}/${u.fileName}`,{argv:U,env:H}=Fs(u.argv,g,u.env),j=Bun.nanoseconds(),G=await Bun.spawn(U,{cwd:u.cwd,env:H,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,ue=Bun.nanoseconds()-j,ne=Bun.file(F);if(!await ne.exists())return{diagnosticWallNs:ue,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected ${E.what} at ${F} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for ${E.kind} capture.`,data:{artifactPath:F,argv:u.argv}}]};return{diagnosticWallNs:ue,exitCode:G,artifactPath:F,raw:await ne.json(),warnings:[]}}async function jr(u){let{raw:g,...E}=await It(u,["--cpu-prof","--cpu-prof-dir",u.artifactDir,"--cpu-prof-name",u.fileName,"--cpu-prof-interval",String(u.intervalUs)],{what:"a .cpuprofile",kind:"CPU"});if(!g)return E;if(g.samples.length===0)E.warnings.push({code:"empty-profile",message:"CPU capture produced zero samples."});return{...E,cpu:vt(g,"cpu-prof",u.intervalUs)}}function Vr(u){let{node_fields:E,node_types:F}=u.snapshot.meta,U=E.indexOf("type"),H=E.indexOf("self_size"),j=E.length,ee=F[0];if(U===-1||H===-1||!Array.isArray(ee))return{origin:"heap-prof",typeCounts:[],objectCount:u.snapshot.node_count};let G=ee.length,ue=Array(G),ne=new Map,ae=[],se=(Ne)=>{let Le={type:Ne,count:0,bytes:0};return ae.push(Le),Le},De=0,We=u.nodes,de=We.length;for(let Ne=0;Ne<de;Ne+=j){let Le=We[Ne+U],Ve=We[Ne+H]??0;De+=Ve;let ze;if(Le>=0&&Le<G)ze=ue[Le]??=se(ee[Le]);else if(ze=ne.get(Le),ze===void 0)ze=se(`unknown(${Le})`),ne.set(Le,ze);ze.count++,ze.bytes+=Ve}ae.sort((Ne,Le)=>Le.count-Ne.count);let le=ae.slice(0,20).map(({type:Ne,count:Le,bytes:Ve})=>({type:Ne,count:Le,retainedBytes:Ve})),_e=ae.slice(20);if(_e.length>0)le.push({type:"other",count:_e.reduce((Ne,Le)=>Ne+Le.count,0),retainedBytes:_e.reduce((Ne,Le)=>Ne+Le.bytes,0)});return{origin:"heap-prof",heapSizeBytes:De,objectCount:u.snapshot.node_count,typeCounts:le}}async function Hr(u){let{raw:g,...E}=await It(u,["--heap-prof","--heap-prof-dir",u.artifactDir,"--heap-prof-name",u.fileName],{what:"a heap snapshot",kind:"heap"});return g?{...E,heap:Vr(g)}:E}var Ot=1000;function oe(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function be(u){Ln("time",u);let g=i({samples:u.samples??null,budgetMs:u.budgetMs??null,minSamples:u.minSamples??null,warmup:u.warmup??null,cpu:u.cpu??!1,heap:u.heap??!1,cpuIntervalUs:u.cpuIntervalUs??Ot}),E=`${u.outDir??An}/artifacts`,F=u.noiseCheck===!1?void 0:Pe(),U=F?xe(F):void 0,H=[],j=[],ee=u.commands.map((ae)=>{let se=typeof ae==="string"||Array.isArray(ae)?{command:ae}:ae,De=Array.isArray(se.command)?se.command:q(se.command),We=se.prepare??u.prepare,de=se.timeSource??u.timeSource,le=me(De,se.label??(Array.isArray(se.command)?void 0:se.command),{prepare:We,timeSource:de});return{argv:De,workload:le,prepare:We,timeSource:de,timeoutMs:se.timeoutMs??u.timeoutMs,ignoreExitCodes:se.ignoreExitCodes??u.ignoreExitCodes}}),G=(u.interleave??!0)&&ee.length>1,ue=ee.map((ae)=>Bt({argv:ae.argv,cwd:u.cwd,env:u.env,samples:u.samples,budgetMs:u.budgetMs,minSamples:u.minSamples,warmup:u.warmup,prepare:ae.prepare,timeSource:ae.timeSource,timeoutMs:ae.timeoutMs,ignoreExitCodes:ae.ignoreExitCodes,signal:u.signal})),ne=async(ae)=>{let{argv:se,workload:De,prepare:We}=ee[ae];H.push(De);let de=ue[ae].result(),le=W({workload:De,configFingerprint:g,trials:de.trials,timing:de.timing,warnings:U&&j.length===0?[...de.warnings,U]:de.warnings,interleaved:G?!0:void 0});if(j.push(le),!u.signal?.aborted)j.push(...await Bs({workload:De,argv:se,timingMeasurementId:le.id,cfgFp:g,opts:u,artifactDir:E,prepare:We}))};if(G){for(let se of ue)await se.warmup();let ae=!0;while(ae){ae=!1;for(let se of ue)if(await se.step())ae=!0}for(let se=0;se<ee.length;se++)await ne(se)}else for(let ae=0;ae<ee.length;ae++)await Wt(ue[ae]),await ne(ae);if(u.signal?.aborted&&j.length>0){let ae=j[j.length-1];ae.warnings=[...ae.warnings,oe()]}return v(F),r(H,j,F)}async function Bs({workload:u,argv:g,timingMeasurementId:E,cfgFp:F,opts:U,artifactDir:H,prepare:j}){let ee=[],G=async(ne)=>{if(j)await ye(j,{phase:ne,index:0},{cwd:U.cwd,env:U.env})},ue=(ne)=>({argv:g,cwd:U.cwd,env:U.env,artifactDir:H,fileName:`${E}-${ne}`});if(U.cpu){await G("cpu");let ne=await jr({...ue("cpu.cpuprofile"),intervalUs:U.cpuIntervalUs??Ot});ee.push(await Gr({workload:u,phase:"cpu",configFingerprint:F,artifactKind:"cpuprofile",...ne}))}if(U.heap){await G("heap");let ne=await Hr(ue("heap.heapsnapshot"));ee.push(await Gr({workload:u,phase:"heap",configFingerprint:F,artifactKind:"heapsnapshot",...ne}))}return ee}async function Gr({artifactPath:u,artifactKind:g,...E}){let F=P({...E,artifacts:[]});if(u)F.artifacts=[await fn(F.id,g,u)];return F}async function kn(u,g={}){if(g.name!==void 0&&(typeof g.name!=="string"||!g.name))throw TypeError("profile(): name must be a non-empty string");let E=pn(u,g.name),F=g.cpuIntervalUs??Ot,U=i({intervalUs:F,origin:g.origin??"inspector"}),H=(G,ue)=>({result:G,measurement:ue,document:r([E],[ue])});if(g.signal?.aborted){let G=Bun.nanoseconds(),ue=await u();return H(ue,P({workload:E,phase:"cpu",configFingerprint:U,diagnosticWallNs:Bun.nanoseconds()-G,warnings:[oe()],artifacts:[]}))}let j=g.origin==="jsc"?await He(u,{intervalUs:F}):{...await Lr(u,{intervalUs:F}),jit:void 0},ee=j.cpu.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];return H(j.result,P({workload:E,phase:"cpu",configFingerprint:U,diagnosticWallNs:j.diagnosticWallNs,cpu:j.cpu,jit:j.jit,warnings:ee,artifacts:[]}))}function Pn(u){return u}
|
|
27
|
+
export{x,Ke,qe,fe,d,te,an,A,Ye,mn,ge,_,V,J,cn,he,z,Ze,re,K,oe,be,bn,M,h,wn,yn,kn,Pn};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{T,l,q,ae,n,r,me,W,i,Y,Qe,u,E,a,v,L,m,t,O}from"./chunk-5m601yfv.js";import{x,Ke,qe,fe,d,te,an,A,Ye,mn,ge,_,V,J,cn,he,z,Ze,re,K,oe,be,M,h}from"./chunk-pdv5zb3w.js";import{rn,Ge,Ve,Je,ze,on,ee,sn}from"./chunk-scvezzm9.js";import{y}from"./chunk-fc36fd0b.js";import{writeSync as Re}from"fs";import{resolve as xn}from"path";function Ne(o){return n("cache",o.workloadId,o.phase,o.configFingerprint,o.bunVersion,o.toolVersion,o.instrumented,o.inputsDigest??null)}var yn=32;async function De(o,e=process.cwd()){if(o.length===0)return;let s=await z(o,e),c=Array(s.length),p=0,g=async()=>{while(p<s.length){let C=p++,f=s[C],w=await Bun.file(xn(e,f)).arrayBuffer();c[C]={path:f,sha256:Bun.CryptoHasher.hash("sha256",w,"hex")}}};return await Promise.all(Array.from({length:Math.min(yn,s.length)},g)),n("inputs",c)}function Ie(o,e){return`${o}/cache/${e}.json`}async function Be(o,e){try{return await Bun.file(Ie(o,e)).json()}catch{return}}async function _e(o,e,s){await Bun.write(Ie(o,e),`${JSON.stringify(s,null,2)}
|
|
3
|
+
`)}var Le=600000;class de extends l{}class Ce extends de{path;constructor(o){super(`No baseline document at ${o}. Create one with: ostia baseline save ${o.split("/").pop().replace(/\.json$/,"")}`);this.path=o}}class Ue extends de{path;missing;total;constructor(o,e,s){super(`${e} of ${s} configured workload(s) have no matching row in baseline ${o} (by workload id). Re-seed with: ostia baseline save`);this.path=o;this.missing=e;this.total=s}}async function An(o,e,s,c){let p=await z(e.suites,process.cwd());if(p.length===0)throw new l(`Workload suites ${JSON.stringify(e.suites)} matched no files.`);let g=await re({suites:p,preload:[],bunFlags:[],noiseCheck:!1},o.bench),C=await K({...g,outDir:g.outDir??o.outDir,timeoutMs:e.timeoutMs??g.timeoutMs??Le,signal:c}),f=[];for(let w of C.workloads){let k=C.measurements.find((S)=>S.workloadId===w.id&&S.phase==="timing");if(!k)continue;if(s)k.warnings.push(s);f.push({workload:w,status:"executed",run:k,harnessFailed:!1})}return f}async function $n(o,e,s,c,p){let g=me(e.command,e.label,{prepare:e.prepare,timeSource:e.timeSource}),C=i({samples:o.samples??null,budgetMs:o.budgetMs??null,minSamples:o.minSamples??null,warmup:o.warmup}),f=e.inputs!==void 0&&typeof e.prepare!=="function",w=Ne({workloadId:g.id,phase:"timing",configFingerprint:C,bunVersion:Bun.version,toolVersion:ae,instrumented:!1,inputsDigest:await De(e.inputs??[])}),k=s||!f?void 0:await Be(o.outDir,w),S;if(k)S=k;else{let N=await mn({argv:e.command,samples:o.samples,budgetMs:o.budgetMs,minSamples:o.minSamples,warmup:o.warmup,prepare:e.prepare,timeSource:e.timeSource,timeoutMs:e.timeoutMs??Le,ignoreExitCodes:e.ignoreExitCodes,signal:p});if(S=W({workload:g,configFingerprint:C,trials:N.trials,timing:N.timing,warnings:c?[...N.warnings,c]:N.warnings}),f&&!p?.aborted)await _e(o.outDir,w,S)}return{workload:g,status:k?"cached":"executed",run:S,harnessFailed:ge(S,e.ignoreExitCodes)}}async function ve(o,e,s){let{environment:c,noiseWarning:p}=O(o.noiseCheck),g=[];for(let w of o.workloads){if(s?.aborted)break;if(w.suites)g.push(...await An(o,w,p,s));else g.push(await $n(o,w,e,p,s))}let C=s?.aborted??!1,f=g.at(-1)?.run;if(C&&f&&!f.warnings.some((w)=>w.code==="aborted"))f.warnings=[...f.warnings,oe()];if(g.some((w)=>w.status==="executed"))v(c);return{results:g,environment:c,aborted:C}}async function We(o){let{config:e}=o,s=A(e,o.baselineName);if(!await Bun.file(s).exists())throw new Ce(s);let c=await a(s),{results:p,environment:g,aborted:C}=await ve(e,o.full,o.signal),f=p.map((F)=>({...F})),w=f.filter((F)=>F.status==="executed").length,k=r(f.map((F)=>F.workload),f.map((F)=>F.run),g);if(C)return{document:k,summary:{total:f.length,cached:f.length-w,executed:w,passed:0,regressed:0,missingBaseline:0,failed:0,results:f,unmatched:{baseOnly:[],candOnly:[]}},baseline:c,aborted:C};let S=Ke(c,k,e.thresholds),N=[];for(let F of f){let ie=S.compare(F.workload.id);if(ie)F.comparison=ie,N.push([F.workload.id,ie])}let D=N.map(([,F])=>F),P=f.length-D.length,I=D.filter((F)=>F.verdict==="pass").length,B=e.onMissingBaseline??(P===f.length?"fail":"warn");if(P>0&&B==="fail")throw new Ue(s,P,f.length);let j=S.unmatched();return k.comparisons=D,k.unmatched={baseOnly:j.baseOnly.map((F)=>F.id),candOnly:j.candOnly.map((F)=>F.id)},k.compared=S.compared(N),k.comparisonSummary=qe(D,S.effectiveTimingPct,S.driftPct),{document:k,summary:{total:f.length,cached:f.length-w,executed:w,passed:I,regressed:D.length-I,missingBaseline:P,failed:f.filter((F)=>F.harnessFailed).length,results:f,unmatched:j},baseline:c,aborted:!1}}function je(o){let e=[`${o.total} workloads`,`${o.cached} cached`,`${o.executed} executed`];if(o.missingBaseline>0)e.push(`${o.missingBaseline} skipped (no matching baseline workload)`);if(o.failed>0){let c=o.results.filter((p)=>p.harnessFailed).map((p)=>m(p.workload));e.push(`${o.failed} failed (harness error, a command exited non-zero or produced no samples: ${c.join(", ")})`)}let s=o.results.filter((c)=>c.comparison?.verdict==="fail").map((c)=>{let p=c.comparison.timing,g=m(c.workload);return p?`${t(p.medianDeltaPct)} median on ${g}`:g});return e.push(`${o.passed} passed ${o.regressed} regressed${s.length>0?` (${s.join(", ")})`:""}`,"",`Profile CI: ${o.regressed>0||o.failed>0?"\u2717":"\u2713"}`),`${e.join(`
|
|
4
|
+
`)}
|
|
5
|
+
`}async function He(o,e){let{results:s,environment:c}=await ve(o,!0),p=r(s.map((C)=>C.workload),s.map((C)=>C.run),c),g=A(o,e);return await u(p,g),g}async function Xe(o){let e;try{e=(await Array.fromAsync(new Bun.Glob("*.json").scan({cwd:o.baselineDir}))).map((p)=>p.replace(/\.json$/,"")).sort()}catch{return[]}return(await Promise.all(e.map(async(c)=>{let p=A(o,c);try{let g=await a(p);return{name:c,path:p,createdAt:g.createdAt,toolVersion:g.toolVersion,bunVersion:g.bunVersion,workloads:g.workloads.length,...g.git!==void 0&&{git:g.git}}}catch{return}}))).filter((c)=>c!==void 0)}class H extends Error{}var en=["table","json","jsonl","markdown","minimal"],ke=["collapsed","mermaid","speedscope","cpuprofile"],nn=[...en,...ke];function Sn(o,e,s={}){if(s.allowAuto&&e==="auto")return Ze();let c=s.min??1,p=e?.trim()===""?Number.NaN:Number(e);if(!Number.isInteger(p)||p<c)throw new H(`Invalid ${o} "${e}": expected an integer \u2265 ${c}${s.allowAuto?' (or "auto")':""}`);return p}function Pn(o,e){return e.split(",").map((s)=>{let c=/^\d+$/.test(s)?Number(s):Number.NaN;if(!(c<=255))throw new H(`Invalid ${o} "${e}": expected exit codes 0-255, comma-separated`);return c})}var X=(o,e)=>({dest:o,spec:e}),b={str:(o)=>X(o,{kind:"string"}),int:(o,e=1,s=!1)=>X(o,{kind:"int",min:e,allowAuto:s}),num:(o,e)=>X(o,{kind:"number",min:e}),on:(o)=>X(o,{kind:"bool",value:!0}),off:(o)=>X(o,{kind:"bool",value:!1}),oneOf:(o,e)=>X(o,{kind:"enum",values:e}),list:(o)=>X(o,{kind:"list"}),words:(o)=>X(o,{kind:"words"}),exitCodes:(o)=>X(o,{kind:"exitCodes"})},Oe={format:"table",quiet:!1,help:!1},pe={...Oe,noiseCheck:!0},xe={"--help":b.on("help"),"-h":b.on("help")},ye={...xe,"--export-json":b.str("exportJson"),"--format":b.oneOf("format",en),"--quiet":b.on("quiet")},Te={"--no-noise-check":b.off("noiseCheck")},le={"--config":b.str("config")},Fe={...ye,...Te,"--timeout":b.int("timeoutMs"),"--out-dir":b.str("outDir")},Ee={...Fe,...le,"--filter":b.str("filter"),"--preload":b.list("preload"),"--bun-flags":b.words("bunFlags")};function ne(o,{command:e,flags:s,args:c,positional:p,rest:g}){let C=c;for(let f=0;f<o.length;f++){let w=o[f];if(w==="--"&&g){g(o.slice(f+1),c);break}let k=w.startsWith("--")?w.indexOf("="):-1,S=k>0?w.slice(0,k):w,N=Object.hasOwn(s,S)?s[S]:void 0;if(!N||k>0&&N.spec.kind==="bool"){if(w.startsWith("-")||!p)throw new H(`Unknown flag "${w}" for "ostia ${e}".`);p(w,c);continue}let D=()=>{if(k>0)return w.slice(k+1);if(f+1>=o.length)throw new H(`Missing value for ${S}.`);return o[++f]},{dest:P,spec:I}=N;switch(I.kind){case"string":C[P]=D();break;case"int":C[P]=Sn(S,D(),I);break;case"number":{let B=D(),j=Number(B);if(B===""||!Number.isFinite(j)||j<I.min)throw new H(`Invalid ${S} "${B}": expected a number \u2265 ${I.min}`);C[P]=j;break}case"bool":C[P]=I.value;break;case"list":C[P].push(D());break;case"words":C[P].push(...q(D()));break;case"exitCodes":C[P].push(...k>0?Pn(S,w.slice(k+1)):Array.from({length:255},(B,j)=>j+1));break;case"enum":{let B=D();if(!I.values.includes(B))throw new H(`Invalid ${S} "${B}": expected one of: ${I.values.join(", ")}`);C[P]=B;break}}}return c}var U=(o)=>Bun.write(Bun.stdout,o),tn=(o)=>Bun.write(Bun.stderr,o);class R extends Error{code;data;constructor(o,e,s){super(e);this.code=o;this.data=s}}async function Ae(o,e,s){try{return await s()}catch(c){if(c instanceof R)throw c;if(c instanceof l)throw new R("invalid-flag",`${e}: ${c.message}`);throw new R(o,`${e}: ${T(c)}`)}}var ln=new Set(["minimal","json","jsonl"]);async function vn(){let{isatty:o}=await import("tty");if(!o(2))return!0;let e=process.argv.slice(2);return e.some((s,c)=>s==="--format"&&ln.has(e[c+1]??"")||s.startsWith("--format=")&&ln.has(s.slice(9)))}async function se(o,e,s){if(await tn(e.endsWith(`
|
|
6
|
+
`)?e:`${e}
|
|
7
|
+
`),!await vn())return;await tn(`${JSON.stringify({event:"error",protocolVersion:M,code:o,message:e.split(`
|
|
8
|
+
`)[0],...s&&{data:s}})}
|
|
9
|
+
`)}async function G(o,e){return await U(o),e?0:2}async function ce(o,e){if(o.text)await U(o.text);if(!o.files||o.files.length===0)return;if(e)for(let s of o.files){let c=s.path?`${e}/${s.path}`:e;await Bun.write(c,s.content),await U(`wrote ${c}
|
|
10
|
+
`)}else if(o.files.length===1)await U(o.files[0].content);else for(let s of o.files)await U(`--- ${s.path??"(unnamed)"} ---
|
|
11
|
+
${s.content}
|
|
12
|
+
`)}async function Me(o,{exportJson:e,format:s,quiet:c}){let p=s==="json"&&!c?Y(o):void 0;if(e)if(p!==void 0)await Qe(p,e);else await u(o,e);return p}async function ue(o,e,s={}){let c=await Me(o,e);if(e.quiet)return;if(c!==void 0)await U(c);else await ce(await h[e.format].render(o,s))}var fn=(o)=>o==="--help"||o==="-h";async function $e(o,e){let s=new AbortController,c=()=>s.abort();process.on("SIGINT",c);try{return{result:await Ae("spawn-failed",o,()=>e(s.signal)),aborted:s.signal.aborted}}finally{process.off("SIGINT",c)}}async function Se(o){let e=await an(o);if(!e&&o!==void 0)throw new R("config-missing",`Config file ${o} not found.`);return e}async function Pe(o,e){let s=await Se(e);if(!s){let c=te.join(" or ");throw new R("config-missing",o?`No ${c} found. "${o}" needs configured workloads.`:`No ${c} found.`)}if(o&&s.workloads.length===0){let c=e??await Ye()??te[1];throw new R("config-missing",`${c} has no "workloads" configured.`)}return s}function pn(o){return o.matched===0?2:o.verdict==="fail"?1:0}var On=["ns","us","ms","s"],Tn={...Fe,"--samples":b.int("samples"),"--budget":b.int("budgetMs"),"--min-samples":b.int("minSamples"),"--warmup":b.int("warmup",0),"--no-interleave":b.off("interleave"),"--prepare":b.list("prepare"),"--time-source":b.str("timeSource"),"--time-unit":b.oneOf("timeUnit",On),"--cpu":b.on("cpu"),"--heap":b.on("heap"),"--cpu-interval":b.int("cpuIntervalUs"),"--ignore-failure":b.exitCodes("ignoreExitCodes")};function Fn(o){let e={...pe,commands:[],argvCommand:[],prepare:[],interleave:!0,cpu:!1,heap:!1,ignoreExitCodes:[]};return ne(o,{command:"time",flags:Tn,args:e,positional:(s,c)=>c.commands.push(s),rest:(s,c)=>{c.argvCommand=s}})}async function En(o){let e=Fn(o),s=[...e.commands,...e.argvCommand.length>0?[e.argvCommand]:[]];if(e.help||s.length===0)return G(rn,e.help);if(e.prepare.length>1&&e.prepare.length!==s.length)throw new R("invalid-flag",`--prepare given ${e.prepare.length} times for ${s.length} command(s): give it once (applies to all) or once per command.`);if(e.timeUnit!==void 0&&e.timeSource===void 0)throw new R("invalid-flag","--time-unit only applies with --time-source.");if(e.cpuIntervalUs!==void 0&&!e.cpu)throw new R("invalid-flag","--cpu-interval only applies with --cpu.");if(e.timeSource!==void 0)try{new RegExp(e.timeSource)}catch(k){throw new R("invalid-flag",`Invalid --time-source regex: ${T(k)}`)}let c=e.timeSource!==void 0?{pattern:e.timeSource,unit:e.timeUnit}:void 0,p=s.map((k,S)=>({command:k,prepare:e.prepare.length===1?e.prepare[0]:e.prepare[S]})),{result:g,aborted:C}=await $e("Run failed",(k)=>be({commands:p,timeSource:c,samples:e.samples,budgetMs:e.budgetMs,minSamples:e.minSamples,warmup:e.warmup,interleave:e.interleave,cpu:e.cpu,heap:e.heap,cpuIntervalUs:e.cpuIntervalUs,timeoutMs:e.timeoutMs,ignoreExitCodes:e.ignoreExitCodes,outDir:e.outDir,noiseCheck:e.noiseCheck,signal:k}));if(await ue(g,e),C)return 130;let f=g.workloads.map((k)=>g.measurements.find((S)=>S.workloadId===k.id&&S.phase==="timing")),w=f.some((k)=>k?.timing&&ge(k,e.ignoreExitCodes));if(w||f.some((k)=>!k?.timing)){let k=(N)=>g.measurements.some((D)=>D.warnings.some((P)=>P.code===N)),S=w?"command-failed":k("timeout")?"timeout":k("time-source-no-match")?"time-source-no-match":"command-failed";throw new R(S,"One or more commands failed to produce a clean measurement; see the report above for details.")}return 0}var Mn={...Ee,"--budget":b.int("budgetMs"),"--samples":b.int("samples"),"--min-samples":b.int("minSamples"),"--jobs":b.int("jobs",1,!0),"--gc":b.on("gc"),"--no-gc":b.off("gc"),"--cpu":b.on("cpu"),"--no-cpu":b.off("cpu"),"--cpu-interval":b.int("cpuIntervalUs"),"--alloc":b.on("alloc"),"--no-alloc":b.off("alloc"),"--peak-mem":b.on("peakMem"),"--no-peak-mem":b.off("peakMem"),"--isolate":b.on("isolate"),"--no-isolate":b.off("isolate")};function Rn(o){let e={...pe,suites:[],preload:[],bunFlags:[]};return ne(o,{command:"bench",flags:Mn,args:e,positional:(s,c)=>c.suites.push(s)})}async function Nn(o){let e=Rn(o);if(e.help)return G(Ge,!0);let s=await Se(e.config),c=await re(e,s?.bench);if(c.suites.length===0)return G(Ge,!1);let{result:p,aborted:g}=await $e("Bench failed",(C)=>K({...c,signal:C}));return await ue(p,e),g?130:0}var Dn={...Ee,"--base":b.str("base"),"--base-setup":b.list("baseSetup"),"--rounds":b.int("rounds",3),"--threshold":b.num("thresholdPct",0),"--geomean-threshold":b.num("geomeanThresholdPct",0),"--confirm":b.int("confirm",0),"--alloc":b.on("alloc"),"--no-alloc":b.off("alloc"),"--peak-mem":b.on("peakMem"),"--no-peak-mem":b.off("peakMem"),"--mem-threshold":b.num("memThresholdPct",0),"--keep-trees":b.int("keepTrees"),"--clean":b.on("clean"),"--progress":b.on("progress"),"--no-progress":b.off("progress")};function In(o){switch(o.phase){case"setup":return`[ab] base setup: ${o.command}`;case"measure":return`[ab] suite ${o.suite}/${o.suites} ${o.file} \xB7 pass ${o.pass}/${o.passes} \xB7 task ${o.task}/${o.tasks} ${o.label}`;case"confirm":return`[ab] confirming flagged tasks \xB7 repeat ${o.repeat}/${o.repeats} ${o.label}`;case"memory":return`[ab] memory \xB7 process ${o.run}/${o.runs} ${y(o.side)} ${o.label}`}}function Bn(o){let e=!1;return{onProgress:(s)=>{let c=In(s);if(!o){Re(2,`${c}
|
|
13
|
+
`);return}let p=process.stderr.columns||80;Re(2,`\r\x1B[K${c.slice(0,p-1)}`),e=!0},done:()=>{if(e)Re(2,"\r\x1B[K");e=!1}}}function _n(o){let e={...pe,suites:[],baseSetup:[],preload:[],bunFlags:[],clean:!1};return ne(o,{command:"ab",flags:Dn,args:e,positional:(s,c)=>c.suites.push(s)})}async function Ln(o){let e=_n(o);if(e.help)return G(Ve,!0);let s=await Se(e.config);if(e.clean){let Z=await cn({outDir:e.outDir??s?.bench?.outDir});if(!e.quiet)await Bun.write(Bun.stderr,`Removed ${Z} cached base tree(s).
|
|
14
|
+
`);return 0}let{suites:c,filter:p,preload:g,bunFlags:C,timeoutMs:f,outDir:w,noiseCheck:k}=await re(e,s?.bench);if(c.length===0)return G(Ve,!1);let{isatty:S}=await import("tty"),N=S(2),D=e.progress??(N&&!e.quiet)?Bn(N):void 0,{result:P,aborted:I}=await $e("A/B run failed",async(Z)=>{try{return await he({suites:c,base:e.base,baseSetup:e.baseSetup.length>0?e.baseSetup:s?.ab?.setup,rounds:e.rounds,thresholdPct:e.thresholdPct,geomeanThresholdPct:e.geomeanThresholdPct,confirm:e.confirm,alloc:e.alloc??s?.ab?.alloc,peakMem:e.peakMem??s?.ab?.peakMem,memThresholdPct:e.memThresholdPct??s?.ab?.memThresholdPct,filter:p,preload:g,bunFlags:C,timeoutMs:f,outDir:w,keepTrees:e.keepTrees??s?.ab?.keepTrees,noiseCheck:k,signal:Z,onProgress:D?.onProgress})}catch(Q){if(Q instanceof _)throw new R("invalid-flag",`--base: ${Q.message}`);if(Q instanceof J)throw new R("command-failed",Q.message);if(Q instanceof V)throw new R("suite-failed",Q.message,{side:Q.side});throw Q}finally{D?.done()}}),B=P.ab,j=I?130:pn({matched:B.matched+B.threw,verdict:B.verdict}),F=new Map(P.workloads.map((Z)=>[Z.id,Z])),ie=(Z=[])=>Z.flatMap((Q)=>F.get(Q)??[]);if(await ue(P,e,{protocol:{command:"ab",exitCode:j,unmatched:{baseOnly:ie(P.unmatched?.baseOnly),candOnly:ie(P.unmatched?.candOnly)},...e.exportJson&&{exportedTo:e.exportJson}}}),j===2){let Z=B.newSuites?.length===c.length;await se("no-matches",Z?`No suite exists at ${B.base.ref}; nothing was paired. Use "ostia bench" to time new suites.`:`No task exists both at ${B.base.ref} and in the working tree; nothing was paired.`)}return j}var Un={...ye,...le,"--baseline":b.str("baseline")};function Wn(o){let e={...Oe,paths:[]};return ne(o,{command:"compare",flags:Un,args:e,positional:(s,c)=>c.paths.push(s)})}async function Gn(o){let e=Wn(o);if(e.help)return G(Je,!0);let s=e.baseline?1:2;if(e.paths.length>s)throw new H(e.baseline?`"ostia compare --baseline" takes one candidate path, got ${e.paths.length}.`:`"ostia compare" takes two document paths, got ${e.paths.length}.`);let[c,p]=e.baseline?[e.baseline,e.paths[0]]:e.paths;if(!c||!p)return G(Je,!1);let[g,C]=await Ae("document-load-failed","Failed to load documents",()=>Promise.all([a(c),a(p)])),f=await Se(e.config),w=f?.thresholds??x,k=f?e.config??await Ye()??te[1]:"defaults",S=fe(g,C,w),N={...C,comparisons:S.comparisons,comparisonSummary:S.summary,unmatched:{baseOnly:S.unmatched.baseOnly.map((I)=>I.id),candOnly:S.unmatched.candOnly.map((I)=>I.id)},compared:S.compared};if(!e.quiet&&(e.format==="table"||e.format==="markdown")){if(await U(`thresholds: ${k}
|
|
15
|
+
`),g.git&&C.git)await U(`base ${L(g.git)} \u2192 cand ${L(C.git)}
|
|
16
|
+
`)}let P=pn(S.summary);if(await ue(N,e,{protocol:{command:"compare",exitCode:P,unmatched:S.unmatched,baseGit:g.git,candGit:C.git,...e.exportJson&&{exportedTo:e.exportJson}}}),S.summary.matched===0)await se("no-matches","No workload matched between base and candidate; nothing was compared.");return P}var gn={...xe,"--format":b.oneOf("format",nn),"--measurement":b.str("measurementId"),"--out-dir":b.str("outDir")};function jn(o){return ne(o,{command:"report",flags:gn,args:{format:"table",help:!1},positional:(s,c)=>{if(c.path!==void 0)throw new H(`"ostia report" takes exactly one document path, got "${c.path}" and "${s}".`);c.path=s}})}var un="No CPU evidence in this document; rerun with --cpu (ostia time) or --cpu (ostia bench)";async function hn(o,{format:e,measurementId:s,outDir:c}){let p=ke.includes(e),g=[s!==void 0&&"--measurement",c!==void 0&&"--out-dir"].filter((w)=>w!==!1);if(!p&&g.length>0)throw new H(`${g.join(" and ")} only apply to the visualization formats (${ke.join(", ")}), not --format ${e}.`);let C=await Ae("document-load-failed",`Failed to load ${o}`,()=>a(o));if(p&&!s&&!C.measurements.some((w)=>w.phase==="cpu"))throw new R("no-cpu-evidence",un);let f=await h[e].render(C,{measurementId:s});if(!f.text&&(!f.files||f.files.length===0))throw new R("no-cpu-evidence",s?`No CPU evidence found for measurement "${s}".`:un);return await ce(f,c),0}async function Hn(o){let e=jn(o);if(e.help||!e.path)return G(ze,e.help);return hn(e.path,e)}var Vn={...ye,...Te,...le,"--full":b.on("full"),"--baseline":b.str("baseline"),"--save-baseline":b.on("saveBaseline")};function qn(o){let e={...pe,full:!1,saveBaseline:!1};return ne(o,{command:"ci",flags:Vn,args:e})}var bn=(o)=>new R("baseline-missing",o.message);function Jn(o){if(o instanceof de)throw bn(o);if(o instanceof E)throw new R("document-load-failed",o.message);throw o}async function Kn(o){let e=qn(o);if(e.help)return G(on,!0);let s=await Pe("ostia ci",e.config),c=e.noiseCheck?s:{...s,noiseCheck:!1},p=e.full||e.saveBaseline,{result:g,aborted:C}=await $e("CI run failed",(P)=>We({config:c,full:p,baselineName:e.baseline,signal:P}).catch(Jn)),{document:f,summary:w}=g;if(C)return await ue(f,e),130;let k=e.baseline??c.baseline,S=A(c,k),N=await Me(f,e);if(e.saveBaseline&&w.regressed===0&&w.failed===0)await u(f,S);let D=w.failed>0?2:w.regressed>0?1:0;if(w.failed>0){let P=w.results.filter((I)=>I.harnessFailed).map((I)=>m(I.workload));await se("command-failed",`${w.failed} workload(s) failed (harness error, a command exited non-zero or produced no samples): ${P.join(", ")}`)}if(e.quiet)return D;if(N!==void 0)await U(N);else if(e.format==="table"){if(await U(je(w)),f.comparisons&&f.comparisons.length>0)await ce(await h.table.render(f,{}))}else if(e.format==="markdown")await U(`## ostia ci
|
|
17
|
+
|
|
18
|
+
Baseline: \`${k}\` (\`${S}\`) \xB7 ${w.cached} cached, ${w.executed} executed
|
|
19
|
+
|
|
20
|
+
`),await ce(await h.markdown.render(f,{}));else await ce(await h[e.format].render(f,{protocol:{command:"ci",exitCode:D,unmatched:w.unmatched,baseGit:g.baseline.git,candGit:f.git,baseline:{name:k,path:S},cached:w.cached,executed:w.executed,failed:w.failed,missingBaseline:w.missingBaseline,...e.exportJson&&{exportedTo:e.exportJson}}}));return D}var dn=/^[A-Za-z0-9._-]+$/;function we(o){return new R("invalid-flag",`${o}
|
|
21
|
+
Run 'ostia baseline --help'.`)}function wn(o){if(o.startsWith("-"))throw we(`Invalid baseline name "${o}": names can't start with "-".`);if(!dn.test(o))throw we(`Invalid baseline name "${o}": expected to match ${dn}.`)}var zn={...xe,...le};function Cn(o,e,s){return ne(o,{command:e,flags:zn,args:{help:!1},positional:(c,p)=>{if(!s)throw we(`"ostia ${e}" takes no arguments, got "${c}".`);if(p.name!==void 0)throw we(`"ostia ${e}" takes at most one name argument, got "${p.name}" and "${c}".`);p.name=c}})}async function Zn(o){let{name:e,help:s,config:c}=Cn(o,"baseline save",!0);if(s)return G(ee,!0);if(e!==void 0)wn(e);let p=await Pe("ostia baseline save",c);return await U(`Wrote ${await He(p,e)}
|
|
22
|
+
`),0}async function Yn(o){let{help:e,config:s}=Cn(o,"baseline list",!1);if(e)return G(ee,!0);let c=await Pe(void 0,s),p=await Xe(c);if(p.length===0)return await U(`No baselines found in ${c.baselineDir}.
|
|
23
|
+
`),0;for(let g of p){let C=g.git?` ${L(g.git)}`:"";await U(`${g.name} ${g.workloads} workloads created ${g.createdAt} toolVersion ${g.toolVersion}${C}
|
|
24
|
+
`)}return 0}async function Qn(o){let[e,...s]=o;if(!e||fn(e))return G(ee,!!e);wn(e);let c=ne(s,{command:"baseline show",flags:{...gn,...le},args:{format:"table",help:!1},positional:(C)=>{throw we(`"ostia baseline show" takes one name, got "${e}" and "${C}".`)}});if(c.help)return G(ze,!0);let p=await Pe(void 0,c.config),g=A(p,e);if(!await Bun.file(g).exists())throw bn(new Ce(g));return hn(g,c)}async function kn(o,e,s,c,p,g=""){if(o===void 0||fn(o))return G(c,o!==void 0);let C=Object.hasOwn(s,o)?s[o]:void 0;try{if(!C)throw new R("invalid-flag",p(o));return await C(e)}catch(f){if(f instanceof R)await se(f.code,f.message,f.data);else if(f instanceof d)await se("config-invalid",f.message);else if(f instanceof H)await se("invalid-flag",`${f.message}
|
|
25
|
+
Run 'ostia ${g}${o} --help'.`);else await se("internal",`Internal error: ${f instanceof Error?f.stack??f.message:String(f)}`);return 2}}function Xn(o){let[e,...s]=o;return kn(e,s,{save:Zn,list:Yn,show:Qn},ee,(c)=>`Unknown "ostia baseline ${c}". Run "ostia baseline --help".`,"baseline ")}function zt(){let[o,...e]=process.argv.slice(2);return kn(o,e,{time:En,bench:Nn,ab:Ln,compare:Gn,report:Hn,ci:Kn,baseline:Xn},sn,(s)=>`Unknown subcommand "${s}". Run "ostia --help".`)}export{zt as main};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var rn=`ostia time [flags] <command...>
|
|
3
3
|
ostia time [flags] -- <argv...>
|
|
4
4
|
|
|
5
5
|
Time commands as subprocesses. Each <command> is whitespace-split into argv (no shell);
|
|
@@ -35,7 +35,7 @@ Examples:
|
|
|
35
35
|
ostia time --prepare "rm -rf dist" "bun build.ts"
|
|
36
36
|
ostia time --time-source "built in (\\d+)ms" "bun build.ts"
|
|
37
37
|
ostia time -- bun -e "console.log('a b')"
|
|
38
|
-
`,
|
|
38
|
+
`,Ge=`ostia bench [flags] <suite.ts...>
|
|
39
39
|
|
|
40
40
|
Run in-process group()/task() suites, each file in its own child process. With no files,
|
|
41
41
|
uses ostia.config's "bench" section; each flag overrides its config field.
|
|
@@ -72,7 +72,7 @@ Examples:
|
|
|
72
72
|
ostia bench bench/*.ts
|
|
73
73
|
ostia bench bench/*.ts --filter parse --cpu --alloc
|
|
74
74
|
ostia bench --preload ./bench/dom-setup.ts --bun-flags="--conditions=browser" bench/*.ts
|
|
75
|
-
`,
|
|
75
|
+
`,Ve=`ostia ab [flags] <suite.ts...>
|
|
76
76
|
|
|
77
77
|
Pair every task on a git ref's committed tree (base) against the working tree (candidate), in
|
|
78
78
|
one process, alternating ~10ms batches, and gate on the per-round time ratio. Drift between
|
|
@@ -124,11 +124,13 @@ Examples:
|
|
|
124
124
|
ostia ab bench/*.ts --filter parse --format minimal
|
|
125
125
|
ostia ab bench/*.ts --base-setup "bun scripts/generate.ts"
|
|
126
126
|
ostia ab bench/paint.bench.ts --alloc --peak-mem
|
|
127
|
-
`,
|
|
127
|
+
`,Je=`ostia compare <base.json> <candidate.json>
|
|
128
128
|
ostia compare <candidate.json> --baseline <base.json>
|
|
129
129
|
|
|
130
|
-
Compare two ProfileDocuments by workload id
|
|
131
|
-
present (the same ones "ostia ci"
|
|
130
|
+
Compare two ProfileDocuments by workload id (or a task's former names, from its
|
|
131
|
+
"aliases"). Gates on ostia.config's "thresholds" when present (the same ones "ostia ci"
|
|
132
|
+
uses), else the defaults, widened by machine noise and drift. Tasks on only one side are
|
|
133
|
+
listed under "Not compared"; with --format json, "compared" holds one row per task.
|
|
132
134
|
|
|
133
135
|
Flags:
|
|
134
136
|
--baseline PATH the base document, when only the candidate is positional
|
|
@@ -140,7 +142,7 @@ Flags:
|
|
|
140
142
|
|
|
141
143
|
Exactly two document paths (one with --baseline); anything more is an error.
|
|
142
144
|
Exit codes: 0 pass, 1 a workload regressed, 2 nothing matched or a harness error.
|
|
143
|
-
`,
|
|
145
|
+
`,ze=`ostia report <document.json> [flags]
|
|
144
146
|
|
|
145
147
|
Render a saved ProfileDocument. Files, not a GUI for the visualization formats -
|
|
146
148
|
hand the output to speedscope.app, flamegraph.pl, or a Mermaid renderer.
|
|
@@ -168,7 +170,7 @@ Examples:
|
|
|
168
170
|
ostia report doc.json --format markdown
|
|
169
171
|
ostia report doc.json --format speedscope --out-dir node_modules/.cache/ostia/viz
|
|
170
172
|
ostia report doc.json --format collapsed | flamegraph.pl > flame.svg
|
|
171
|
-
`,
|
|
173
|
+
`,on=`ostia ci [flags]
|
|
172
174
|
|
|
173
175
|
Run ostia.config's workloads (reusing cached runs whose declared inputs are unchanged),
|
|
174
176
|
compare against a saved baseline, and gate on regressions.
|
|
@@ -188,7 +190,7 @@ Flags:
|
|
|
188
190
|
Exit codes: 0 pass, 1 regression, 2 harness error (missing config/baseline, a workload
|
|
189
191
|
failed or produced no samples, or an onMissingBaseline "fail" mismatch), 130 Ctrl-C (the
|
|
190
192
|
partial document is exported; nothing is compared or saved).
|
|
191
|
-
`,
|
|
193
|
+
`,ee=`ostia baseline <save|list|show> [args]
|
|
192
194
|
|
|
193
195
|
Manage the baseline ProfileDocuments "ostia ci" gates against and "ostia compare --baseline"
|
|
194
196
|
reads.
|
|
@@ -211,7 +213,7 @@ Examples:
|
|
|
211
213
|
ostia baseline list
|
|
212
214
|
ostia baseline show main
|
|
213
215
|
ostia baseline show main --format markdown
|
|
214
|
-
`,
|
|
216
|
+
`,sn=`ostia - profiling and benchmarking for Bun
|
|
215
217
|
|
|
216
218
|
Commands:
|
|
217
219
|
time Time commands N times and report timing/CPU/heap
|
|
@@ -224,4 +226,4 @@ Commands:
|
|
|
224
226
|
|
|
225
227
|
Run "ostia <command> --help" for details.
|
|
226
228
|
`;
|
|
227
|
-
export{
|
|
229
|
+
export{rn,Ge,Ve,Je,ze,on,ee,sn};
|
package/cli.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var t=process.argv[2];if(t===void 0||t==="--help"||t==="-h"){let{MAIN_HELP:i}=await import("./chunk-
|
|
3
|
+
var t=process.argv[2];if(t===void 0||t==="--help"||t==="-h"){let{MAIN_HELP:i}=await import("./chunk-82vs1rw1.js");await Bun.write(Bun.stdout,i),process.exit(t===void 0?2:0)}var{main:e}=await import("./chunk-r6hwb84z.js");process.exit(await e());
|
package/index.d.ts
CHANGED
|
@@ -120,6 +120,8 @@ export interface CompareResult {
|
|
|
120
120
|
baseOnly: Workload[];
|
|
121
121
|
candOnly: Workload[];
|
|
122
122
|
};
|
|
123
|
+
/** Every task on either side; see `ProfileDocument.compared`. */
|
|
124
|
+
compared: ComparedTask[];
|
|
123
125
|
summary: ComparisonSummary;
|
|
124
126
|
}
|
|
125
127
|
|
|
@@ -146,6 +148,10 @@ export interface ProfileDocument {
|
|
|
146
148
|
baseOnly: string[];
|
|
147
149
|
candOnly: string[];
|
|
148
150
|
};
|
|
151
|
+
/** Every task on either side of the comparison, one entry each: what
|
|
152
|
+
* `--format markdown` prints, flat for scripts. Present wherever
|
|
153
|
+
* `comparisons` is. */
|
|
154
|
+
compared?: ComparedTask[];
|
|
149
155
|
/** Machine conditions at measurement time; absent when the noise check was
|
|
150
156
|
* skipped. */
|
|
151
157
|
environment?: Environment;
|
|
@@ -169,6 +175,10 @@ interface NoiseFloor {
|
|
|
169
175
|
floorPct: number;
|
|
170
176
|
referenceMedianNs: number;
|
|
171
177
|
samples: number;
|
|
178
|
+
/** How much slower (positive) the reference ran at the end of the run than
|
|
179
|
+
* at the start, percent: the machine's drift over the run. Absent when the
|
|
180
|
+
* run didn't re-measure it (`profile()`, older documents). */
|
|
181
|
+
driftPct?: number;
|
|
172
182
|
}
|
|
173
183
|
|
|
174
184
|
interface Environment {
|
|
@@ -218,6 +228,10 @@ export interface Workload {
|
|
|
218
228
|
/** From `task(..., { params })` or a `sweep()` point. Part of the id, so
|
|
219
229
|
* points sharing a task name don't collide. */
|
|
220
230
|
params?: Record<string, string | number | boolean>;
|
|
231
|
+
/** Ids this task had under its former names (`task(..., { aliases })`), so
|
|
232
|
+
* `compare` and `ab` match a base measured before a rename. Never part of
|
|
233
|
+
* the id. */
|
|
234
|
+
formerIds?: string[];
|
|
221
235
|
/** From `task.skip()` / `group.skip()`: never measured, so no `Measurement`.
|
|
222
236
|
* Renderers print a "- skipped" row; `compare` treats it as `unchanged` with
|
|
223
237
|
* a `skipped` warning. */
|
|
@@ -358,6 +372,11 @@ interface MemoryEvidence {
|
|
|
358
372
|
/** `--peak-mem`: how far one call raised RSS, garbage included; median over
|
|
359
373
|
* 3 fresh processes. A `peak-hidden` warning says when it may read low. */
|
|
360
374
|
peakBytes?: number;
|
|
375
|
+
/** In-process timing: the JS heap's size as of its last collection, just
|
|
376
|
+
* before the task's warmup and just after its last trial. Read without
|
|
377
|
+
* forcing a GC, so it never perturbs the timing. */
|
|
378
|
+
heapUsedBeforeBytes?: number;
|
|
379
|
+
heapUsedAfterBytes?: number;
|
|
361
380
|
}
|
|
362
381
|
|
|
363
382
|
interface JitTierBreakdown {
|
|
@@ -554,10 +573,63 @@ interface ComparisonSummary {
|
|
|
554
573
|
/** `Comparison.thresholds.effectiveTimingPct`, which is the same for the
|
|
555
574
|
* whole document pair. */
|
|
556
575
|
effectiveTimingPct: number;
|
|
576
|
+
/** The machine's drift, percent, added to the timing threshold: the
|
|
577
|
+
* largest of each run's own drift (`NoiseFloor.driftPct`) and how far the
|
|
578
|
+
* reference loop's speed moved between the two runs. Absent when either
|
|
579
|
+
* document lacks a noise check. */
|
|
580
|
+
driftPct?: number;
|
|
557
581
|
/** `"fail"` when any comparison's verdict is `"fail"`. */
|
|
558
582
|
verdict: "pass" | "fail";
|
|
559
583
|
}
|
|
560
584
|
|
|
585
|
+
interface ComparedTask {
|
|
586
|
+
/** The candidate's workload id; the base's on a `missing-cand` task. */
|
|
587
|
+
workloadId: string;
|
|
588
|
+
/** Display name: the label, else the command, else the id. */
|
|
589
|
+
task: string;
|
|
590
|
+
group?: string;
|
|
591
|
+
/** Set when the base was matched through one of the task's `aliases`: the
|
|
592
|
+
* base's workload id and display name. */
|
|
593
|
+
renamedFrom?: {
|
|
594
|
+
workloadId: string;
|
|
595
|
+
task: string;
|
|
596
|
+
};
|
|
597
|
+
verdict: "improved" | "unchanged" | "regressed" | "missing-base" | "missing-cand";
|
|
598
|
+
/** The `Comparison` holding this task's frame and heap-type deltas and
|
|
599
|
+
* warnings; absent on a one-sided task. */
|
|
600
|
+
comparisonId?: string;
|
|
601
|
+
/** Whether the comparison passed the gate (timing, frames, heap types);
|
|
602
|
+
* absent on a one-sided task, which never fails it. */
|
|
603
|
+
pass?: boolean;
|
|
604
|
+
/** Absent on a one-sided or skipped task. */
|
|
605
|
+
timing?: {
|
|
606
|
+
unit: "ns";
|
|
607
|
+
baseMedian: number;
|
|
608
|
+
candMedian: number;
|
|
609
|
+
/** Absent on a document compared before ostia recorded it. */
|
|
610
|
+
baseSamples?: number;
|
|
611
|
+
candSamples: number;
|
|
612
|
+
medianDeltaPct: number;
|
|
613
|
+
/** Absent on a thin (<5 samples a side) comparison, with `pValue`. */
|
|
614
|
+
ci95?: [number, number];
|
|
615
|
+
pValue?: number;
|
|
616
|
+
/** `Comparison.thresholds.effectiveTimingPct`. */
|
|
617
|
+
thresholdPct: number;
|
|
618
|
+
};
|
|
619
|
+
/** Memory readings present on both sides; informational, never gated. */
|
|
620
|
+
memory?: MemoryDelta[];
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
interface MemoryDelta {
|
|
624
|
+
/** `heapUsedBefore`/`heapUsedAfter`: in-process heap around the timing
|
|
625
|
+
* run; `retained`: `--alloc`; `peak`: `--peak-mem`; `maxRss`: subprocess
|
|
626
|
+
* timing. */
|
|
627
|
+
reading: "heapUsedBefore" | "heapUsedAfter" | "retained" | "peak" | "maxRss";
|
|
628
|
+
baseBytes: number;
|
|
629
|
+
candBytes: number;
|
|
630
|
+
deltaPct: number;
|
|
631
|
+
}
|
|
632
|
+
|
|
561
633
|
export interface PrepareRun {
|
|
562
634
|
phase: "warmup" | "timing" | "cpu" | "heap";
|
|
563
635
|
index: number;
|
|
@@ -753,6 +825,10 @@ export interface TaskOptions {
|
|
|
753
825
|
/** Per-task hard floor on trials; overrides the suite-wide `--min-samples` /
|
|
754
826
|
* `minSamples`. */
|
|
755
827
|
minSamples?: number;
|
|
828
|
+
/** Former names of this task in the same group, so `compare` and `ab`
|
|
829
|
+
* match a base measured before a rename instead of reporting the old name
|
|
830
|
+
* as removed and the new one as new. */
|
|
831
|
+
aliases?: string[];
|
|
756
832
|
/** What this task measures and why. Flows into `Workload.description` so the
|
|
757
833
|
* intent travels with the numbers instead of living only in a source comment. */
|
|
758
834
|
description?: string;
|
|
@@ -984,6 +1060,8 @@ interface MinimalWarning {
|
|
|
984
1060
|
}
|
|
985
1061
|
|
|
986
1062
|
interface MinimalDelta {
|
|
1063
|
+
/** The base's median, ns: the row's own `median` is the candidate's. */
|
|
1064
|
+
baseMedian?: number;
|
|
987
1065
|
medianPct: number;
|
|
988
1066
|
meanPct: number;
|
|
989
1067
|
verdict: "improved" | "regressed" | "unchanged";
|
|
@@ -995,6 +1073,8 @@ interface MinimalDelta {
|
|
|
995
1073
|
/** The threshold actually tested against, after machine noise widened it. */
|
|
996
1074
|
effectiveTimingPct: number;
|
|
997
1075
|
matched: true;
|
|
1076
|
+
/** The base task's name, when it was matched through an alias. */
|
|
1077
|
+
renamedFrom?: string;
|
|
998
1078
|
}
|
|
999
1079
|
|
|
1000
1080
|
interface MinimalPaired {
|
|
@@ -1110,6 +1190,8 @@ interface MinimalSummaryLine {
|
|
|
1110
1190
|
missingBaseline?: number;
|
|
1111
1191
|
geomeanPct: number | null;
|
|
1112
1192
|
effectiveTimingPct: number;
|
|
1193
|
+
/** `compare`/`ci`: the machine's drift, added to the timing threshold. */
|
|
1194
|
+
driftPct?: number;
|
|
1113
1195
|
noiseFloorPct?: number;
|
|
1114
1196
|
/** `ci` only. */
|
|
1115
1197
|
baseline?: {
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{x,fe,_,V,J,he,K,be,bn,M,h,wn,yn,kn,Pn}from"./chunk-pdv5zb3w.js";import"./chunk-fc36fd0b.js";import{r,u,E,a,xn,Mn,Tn}from"./chunk-5m601yfv.js";export{_ as AbBaseError,J as AbSetupError,V as AbSuiteError,x as DEFAULT_THRESHOLDS,M as MINIMAL_PROTOCOL_VERSION,E as OstiaDocumentError,he as ab,K as bench,fe as compareDocuments,r as createDocument,Pn as defineConfig,xn as group,Tn as keep,a as loadDocument,kn as profile,bn as range,h as renderers,wn as run,u as saveDocument,yn as sweep,Mn as task,be as time};
|
package/package.json
CHANGED
package/runner.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{u,
|
|
4
|
-
`),2;let t=i?JSON.parse(i):{},p,l;if(t.peakMemFor)l=await
|
|
5
|
-
`),2;let a;try{a=
|
|
6
|
-
`),2}let n=(e)=>
|
|
7
|
-
`),2;await
|
|
3
|
+
import{u,D,ue,nn,de,g,B,U,pe}from"./chunk-5m601yfv.js";import{H,G,ne}from"./chunk-dvqggjkn.js";async function c(){let[r,o,i]=process.argv.slice(2);if(!r||!o)return process.stderr.write(`bench runner: usage: runner.ts <suiteFile> <outputPath> [optsJson]
|
|
4
|
+
`),2;let t=i?JSON.parse(i):{},p,l;if(t.peakMemFor)l=await G(),await import("./index.js"),p=H();for(let e of t.preload??[])await import(e);ue(),await import(r);let d=D();if(d.length===0)return process.stderr.write(`bench runner: ${r} registered no tasks (no task() calls found).
|
|
5
|
+
`),2;let a;try{a=B(d,t.filter,r,!t.workloadIds&&!t.peakMemFor)}catch(e){return process.stderr.write(`bench runner: ${e.message}
|
|
6
|
+
`),2}let n=(e)=>U(r,e).id;if(t.workloadIds){let e=new Set(t.workloadIds);a=a.filter((s)=>e.has(n(s)))}if(t.peakMemFor){let e=a.find((f)=>n(f)===t.peakMemFor);if(!e)return process.stderr.write(`bench runner: no task with workload id ${t.peakMemFor} in ${r}.
|
|
7
|
+
`),2;await g(e,"before"),await e.opts?.before?.();let s=await ne(e.fn,p,l);return await e.opts?.after?.(),await g(e,"after"),await Bun.write(o,JSON.stringify(s)),0}if(t.planPath){let e=a.map((s)=>({workloadId:n(s),isolate:nn(s,t.isolate??!1),peakMem:!s.skipped&&de(s,t.peakMem??!1)}));await Bun.write(t.planPath,JSON.stringify({tasks:e}))}let k=t.workloadIds?a:a.filter((e)=>!nn(e,t.isolate??!1)),m=await pe(r,k,t);return await u(m,o),0}c().then((r)=>process.exit(r));
|
package/chunk-9cr8k2g1.js
DELETED
package/chunk-jvjh4223.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{T,l,be,mn,we,K,B,n,c,w,o,ye,M,e,t,ae,ln,U,y,dn,i,q,a,ke,Pe,Y,xe,d,R,I,Te,Me,Re,_,k,s,Se,pn,Z,ve,r,S,$e,Ce,p,h,Xe,ce,Oe,v,Ae,Ie,De,Fe,Be,E,fn,N,X,We,Le,de}from"./chunk-jzfv4c07.js";import{b,O,un,se}from"./chunk-zf3y6chk.js";import{appendFileSync as yo,existsSync as Ln,lstatSync as ko,readdirSync as ar,realpathSync as At,renameSync as Po,statSync as Ro,symlinkSync as Mo,unlinkSync as xo,utimesSync as To}from"fs";import{mkdir as $o}from"fs/promises";import{relative as mr,sep as So}from"path";function Vr(u){let f=u>>>0;return()=>{f=f+1831565813|0;let D=Math.imul(f^f>>>15,1|f);return D=D+Math.imul(D^D>>>7,61|D)^D,((D^D>>>14)>>>0)/4294967296}}var st=2000,Hr=2000;function zt(u,f,D){if(u.length<=D)return u;let A=[...u];for(let W=0;W<D;W++){let L=W+Math.floor(f()*(A.length-W)),j=A[W];A[W]=A[L],A[L]=j}return A.slice(0,D)}class vt{sorted;rankOf;counts;n;constructor(u){let f=u.length,D=new Uint32Array(f);for(let A=0;A<f;A++)D[A]=A;D.sort((A,W)=>u[A]-u[W]),this.sorted=new Float64Array(f),this.rankOf=new Uint32Array(f);for(let A=0;A<f;A++)this.sorted[A]=u[D[A]],this.rankOf[D[A]]=A;this.n=f,this.counts=new Uint32Array(f)}resampleMedian(u){let{n:f,counts:D,sorted:A,rankOf:W}=this;D.fill(0);for(let me=0;me<f;me++)D[W[Math.floor(u()*f)]]++;let L=f+1>>1,j=f%2===0?L+1:L,oe=0,H=-1;for(let me=0;me<f;me++){if(oe+=D[me],H<0&&oe>=L)H=me;if(oe>=j)return H===me?A[me]:(A[H]+A[me])/2}return A[f-1]}}function Gr(u,f){let D=new Float64Array(u.length+f.length+1);return D.set(u),D[u.length]=Number.NaN,D.set(f,u.length+1),Bun.hash.crc32(D)}function Kt(u,f,D={}){if(u.length===0||f.length===0)throw RangeError("bootstrapMedianDiffCi: both sides need samples");let A=D.seed??Gr(u,f),W=Vr(A),L=D.iterations??Hr,j=u.length>st||f.length>st,oe=new vt(zt(u,W,st)),H=new vt(zt(f,W,st)),me=o(oe.sorted,0.5),Q=new Float64Array(L);for(let ie=0;ie<L;ie++){let ee=oe.resampleMedian(W),Ue=H.resampleMedian(W)-ee;Q[ie]=me===0?Ue===0?0:Ue*(1/0):Ue/me*100}return Q.sort(),{ci95:[o(Q,0.025),o(Q,0.975)],seed:A,data:{subsampled:j,iterations:L}}}function zr(u){let f=u<0?-1:1,D=Math.abs(u),A=0.254829592,W=-0.284496736,L=1.421413741,j=-1.453152027,oe=1.061405429,H=0.3275911,me=1/(1+0.3275911*D),Q=1-((((1.061405429*me+-1.453152027)*me+1.421413741)*me+-0.284496736)*me+0.254829592)*me*Math.exp(-D*D);return f*Q}function Kr(u){return 0.5*(1+zr(u/Math.SQRT2))}function Jt(u,f){let D=u.length,A=f.length,W=D+A;if(D===0||A===0)return{u:0,z:0,pValue:1};let L=w(u),j=w(f),oe=0,H=0,me=0,Q=0,ie=0;while(me<D||Q<A){let Ve=Q>=A||me<D&&L[me]<=j[Q]?L[me]:j[Q],Ee=0;while(me<D&&L[me]===Ve)Ee++,me++;let _e=0;while(Q<A&&j[Q]===Ve)_e++,Q++;let je=Ee+_e,He=ie+(je+1)/2;if(oe+=Ee*He,je>1)H+=je**3-je;ie+=je}let ee=oe-D*(D+1)/2,Ne=D*A/2,Ue=Math.sqrt(D*A*(W+1-H/(W*(W-1)))/12),ue=Ue===0?0:(ee-Ne)/Ue,le=Math.min(1,Math.max(0,2*(1-Kr(Math.abs(ue)))));return{u:ee,z:ue,pValue:le}}var P={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},It=5;function it(u,f){if(u===0)return f===0?0:1/0;return(f-u)/u*100}function Yt(u){let f=new Map;for(let D of u.measurements){let A=`${D.workloadId}\x00${D.phase}`;if(!f.has(A))f.set(A,D)}return(D,A)=>f.get(`${D}\x00${A}`)}function Jr(u,f,D){return{base:Yt(u),cand:Yt(f),candWorkloads:new Map(f.workloads.map((A)=>[A.id,A])),environmentMismatch:Yr(u,f),effectiveTimingPct:Math.max(D.timingPct,u.environment?.noise.floorPct??0,f.environment?.noise.floorPct??0)}}function Yr(u,f){let D=[["platform.os",u.platform.os,f.platform.os],["platform.arch",u.platform.arch,f.platform.arch],["bunVersion",u.bunVersion,f.bunVersion]];if(u.environment&&f.environment)D.push(["cpuModel",u.environment.cpuModel,f.environment.cpuModel],["cores",u.environment.cores,f.environment.cores]);let A=D.filter(([,W,L])=>W!==L).map(([W,L,j])=>({field:W,base:L,cand:j}));if(A.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${A.map((W)=>W.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:A}}}function qr(u){let f=[];for(let A of u){if(!A.timing)continue;let W=1+A.timing.medianDeltaPct/100;if(Number.isFinite(W)&&W>0)f.push(Math.log(W))}if(f.length===0)return null;let D=f.reduce((A,W)=>A+W,0)/f.length;return(Math.exp(D)-1)*100}function Je(u,f,D=P){let A=Jr(u,f,D);return{effectiveTimingPct:A.effectiveTimingPct,compare:(W)=>eo(A,W,D),unmatched(){let W=new Set(u.workloads.map((L)=>L.id));return{baseOnly:u.workloads.filter((L)=>!A.candWorkloads.has(L.id)),candOnly:f.workloads.filter((L)=>!W.has(L.id))}}}}function ze(u,f){let D=0,A=0,W=0;for(let L of u){if(!L.timing)continue;if(L.timing.verdict==="regressed")D++;else if(L.timing.verdict==="improved")A++;else W++}return{matched:u.length,regressed:D,improved:A,unchanged:W,geomeanPct:qr(u),effectiveTimingPct:f,verdict:u.some((L)=>L.verdict==="fail")?"fail":"pass"}}function pe(u,f,D=P){let A=Je(u,f,D),W=[];for(let L of f.workloads){let j=A.compare(L.id);if(j)W.push(j)}return{comparisons:W,unmatched:A.unmatched(),summary:ze(W,A.effectiveTimingPct)}}function Qr(u,f,D,A){let W=u.samples,L=f.samples,j=it(u.median,f.median),oe=it(u.mean,f.mean),H=(ie,ee)=>{if(ie>D)return"regressed";if(ee<-D)return"improved";return"unchanged"};if(W.length<It||L.length<It)return{timing:{medianDeltaPct:j,meanDeltaPct:oe,verdict:H(j,j)},warning:{code:"thin-comparison",message:`Only ${W.length} baseline / ${L.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${It}+ per side).`,data:{baseSamples:W.length,candSamples:L.length}}};let me=Kt(W,L,{iterations:A.bootstrapIterations}),Q=Jt(W,L);return{timing:{medianDeltaPct:j,meanDeltaPct:oe,ci95:me.ci95,pValue:Q.pValue,seed:me.seed,verdict:Q.pValue<A.alpha?H(me.ci95[0],me.ci95[1]):"unchanged"}}}function Xr(u,f,D){let A=(ie)=>new Map(ie.totals.map((ee)=>[ie.frames[ee.frameIx].key,ee.selfUs])),W=(ie)=>new Map(ie.frames.map((ee)=>[ee.key,ee.name])),L=A(u),j=A(f),oe=W(u),H=W(f),me=[...new Set([...L.keys(),...j.keys()])].map((ie)=>{let ee=L.get(ie)??0,Ne=j.get(ie)??0;return{frameKey:ie,name:H.get(ie)??oe.get(ie)??ie,baseSelfUs:ee,candSelfUs:Ne,deltaPct:it(ee,Ne)}}).sort((ie,ee)=>Math.abs(ee.deltaPct)-Math.abs(ie.deltaPct)),Q=me.some((ie)=>(ie.baseSelfUs>=D.minFrameSelfUs||ie.candSelfUs>=D.minFrameSelfUs)&&ie.deltaPct>D.frameSelfPct);return{frames:me,failed:Q}}function Zr(u,f,D){let A=new Map(u.typeCounts.map((j)=>[j.type,j])),W=new Map(f.typeCounts.map((j)=>[j.type,j])),L=[...new Set([...A.keys(),...W.keys()])].map((j)=>{let oe=A.get(j),H=W.get(j);return{type:j,baseCount:oe?.count??0,candCount:H?.count??0,baseBytes:oe?.retainedBytes,candBytes:H?.retainedBytes,deltaPct:it(oe?.count??0,H?.count??0)}}).sort((j,oe)=>Math.abs(oe.deltaPct)-Math.abs(j.deltaPct));return{heapTypes:L,failed:L.some((j)=>j.deltaPct>D.heapTypePct)}}function eo(u,f,D){let{effectiveTimingPct:A}=u,W=u.base(f,"timing"),L=u.cand(f,"timing"),j=u.base(f,"cpu"),oe=u.cand(f,"cpu"),H=u.base(f,"heap"),me=u.cand(f,"heap"),Q=u.candWorkloads.get(f),ie=W?.id??j?.id??H?.id,ee=L?.id??oe?.id??me?.id??Q?.id;if(!ie||!ee)return;let Ne=!1,Ue=[];if(u.environmentMismatch)Ue.push(u.environmentMismatch);let ue;if(W?.timing&&Q?.skipped&&!L?.timing)ue={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},Ue.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:f}});else if(W?.timing&&L?.timing){let Ee=Qr(W.timing,L.timing,A,D);if(ue=Ee.timing,Ee.warning)Ue.push(Ee.warning);if(ue.verdict==="regressed")Ne=!0}let le;if(j?.cpu&&oe?.cpu){let Ee=Xr(j.cpu,oe.cpu,D);le=Ee.frames,Ne||=Ee.failed}let Ve;if(H?.heap&&me?.heap){let Ee=Zr(H.heap,me.heap,D);Ve=Ee.heapTypes,Ne||=Ee.failed}return{id:e("cmp",ie,ee),baselineMeasurementId:ie,candidateMeasurementId:ee,timing:ue,...Ue.length>0&&{warnings:Ue},frames:le,heapTypes:Ve,thresholds:{...D,effectiveTimingPct:A},verdict:Ne?"fail":"pass"}}class m extends Error{}var qt=(u)=>typeof u==="object"&&u!==null&&!Array.isArray(u),tt=(u)=>(f)=>typeof f==="number"&&Number.isInteger(f)&&f>=u,Dn=(u)=>(f)=>typeof f==="number"&&Number.isFinite(f)&&f>=u,En=(u)=>typeof u==="string",no=(u)=>typeof u==="boolean",nt=(u)=>Array.isArray(u)&&u.every(En),Qt=(...u)=>(f)=>u.includes(f),rn=(u,f)=>({ok:u,expects:f}),On=rn(tt(1),"a positive integer"),to=rn(tt(0),"a non-negative integer"),Ot=rn(En,"a string"),Nn=rn(no,"a boolean"),at=rn(nt,"an array of strings"),ro={timingPct:rn(Dn(0),"a non-negative number"),frameSelfPct:rn(Dn(0),"a non-negative number"),heapTypePct:rn(Dn(0),"a non-negative number"),minFrameSelfUs:rn(Dn(0),"a non-negative number"),alpha:rn((u)=>Dn(0)(u)&&u<=1,"a number in [0, 1]"),bootstrapIterations:On},oo={suites:at,preload:at,bunFlags:at,jobs:rn((u)=>tt(1)(u)||u==="auto",'a positive integer or "auto"'),budgetMs:rn(Dn(0),"a non-negative number"),samples:On,minSamples:On,gc:Nn,cpu:Nn,cpuIntervalUs:On,alloc:Nn,peakMem:Nn,filter:Ot,isolate:Nn,outDir:Ot,timeoutMs:On},so={setup:rn((u)=>En(u)||nt(u),"a command string or an array of them"),keepTrees:On,alloc:Nn,peakMem:Nn,memThresholdPct:rn(Dn(0),"a non-negative number")},io=["inputs","prepare","timeSource","ignoreExitCodes"],ao={label:Ot,command:rn((u)=>nt(u)&&u.length>0,"a non-empty array of strings (argv, no shell)"),suites:rn((u)=>nt(u)&&u.length>0,"a non-empty array of glob strings"),inputs:at,prepare:rn((u)=>En(u)||nt(u)||typeof u==="function","a command string, an argv array, or (ostia.config.ts) a function"),timeSource:rn((u)=>qt(u)&&(En(u.pattern)||u.pattern instanceof RegExp)&&(u.group===void 0||tt(0)(u.group))&&(u.unit===void 0||Qt("ns","us","ms","s")(u.unit)),'an object { pattern, group?, unit? } with a regex source string (or RegExp) pattern, an integer group, and unit "ns" | "us" | "ms" | "s"'),timeoutMs:On,ignoreExitCodes:rn((u)=>Array.isArray(u)&&u.every((f)=>tt(0)(f)&&f<=255),"an array of exit codes 0-255")},mo={samples:On,budgetMs:rn(Dn(0),"a non-negative number"),minSamples:On,warmup:to,outDir:rn((u)=>En(u)&&u!=="","a non-empty string"),baselineDir:rn((u)=>En(u)&&u!=="","a non-empty string"),baseline:rn((u)=>En(u)&&u!=="","a non-empty string"),onMissingBaseline:rn(Qt("warn","fail"),'"warn" or "fail"'),noiseCheck:Nn},Dt=(u)=>typeof u==="function"?"a function":u instanceof RegExp?String(u):JSON.stringify(u)??String(u);function et(u,f,D,A,W){let L=D===""?"":`${D}.`;for(let[j,oe]of Object.entries(u)){if(oe===void 0)continue;let H=Object.hasOwn(f,j)?f[j]:void 0;if(!H){if(!j.startsWith("$"))W(`${A}: unknown key "${L}${j}" is ignored.`)}else if(!H.ok(oe))throw new m(`${A}: "${L}${j}" must be ${H.expects}, got ${Dt(oe)}.`)}}function mt(u,f,D){if(!qt(u))throw new m(`${D}: "${f}" must be an object, got ${Dt(u)}.`);return u}function uo(u,f,D,A){let W=`workloads[${f}]`,L=mt(u,W,D),j=(H)=>L[H]!==void 0;if(j("command")===j("suites"))throw new m(`${D}: "${W}" needs exactly one of "command" or "suites".`);if(et(L,ao,W,D,A),j("suites")){for(let H of io)if(j(H))A(`${D}: "${W}.${H}" applies to command workloads only; ignored on a suites workload.`)}let oe=L.timeSource?.pattern;if(typeof oe==="string")try{new RegExp(oe)}catch(H){throw new m(`${D}: "${W}.timeSource.pattern" is not a valid regex: ${H.message}`)}}function Xt(u,f,D){let{thresholds:A,workloads:W,bench:L,ab:j,...oe}=u;if(et(oe,mo,"",f,D),A!==void 0)et(mt(A,"thresholds",f),ro,"thresholds",f,D);if(L!==void 0)et(mt(L,"bench",f),oo,"bench",f,D);if(j!==void 0)et(mt(j,"ab",f),so,"ab",f,D);if(W!==void 0){if(!Array.isArray(W))throw new m(`${f}: "workloads" must be an array, got ${Dt(W)}.`);W.forEach((H,me)=>{uo(H,me,f,D)})}}var An="node_modules/.cache/ostia",co=".ostia/baselines",lo={warmup:3,outDir:An,baselineDir:co,baseline:"main",thresholds:P,workloads:[]},po={runs:"samples"},ne=["ostia.config.ts","ostia.config.json"],er=(u)=>console.warn(`ostia: ${u}`);function Zt(u){return Object.fromEntries(Object.entries(u).filter(([,f])=>f!==void 0))}function fo(u,f){if(typeof u!=="object"||u===null||Array.isArray(u))throw new m(`${f}: expected an object.`);for(let[A,W]of Object.entries(po))if(A in u)throw new m(`${f}: "${A}" was renamed to "${W}".`);Xt(u,f,er);let D=Zt(u);return{...lo,...D,thresholds:{...P,...D.thresholds&&Zt(D.thresholds)}}}async function go(u){let f=u.startsWith("/")?u:`${process.cwd()}/${u}`,D=Bun.file(f);if(!await D.exists())return;try{if(!u.endsWith(".ts"))return await D.json();let A=(await import(f)).default;if(A===void 0)throw Error('no default export; use "export default defineConfig({ ... })"');return A}catch(A){throw new m(`${u}: ${T(A)}`)}}async function nr(){let u=[];for(let f of ne)if(await Bun.file(f).exists())u.push(f);return u}async function on(u){let f=u;if(f===void 0){let A=await nr();if(A.length>1)er(`${A.join(" and ")} both exist; using ${A[0]} and ignoring the rest.`);f=A[0]}if(f===void 0)return;let D=await go(f);return D===void 0?void 0:fo(D,f)}function C(u,f){return`${u.baselineDir}/${f??u.baseline}.json`}async function Ke(){return(await nr())[0]}var ho=10,bo=3000,wo=3;function tr(u,f){return u!==void 0&&u!==0&&!f.has(u)}function Nt(u){if(_n("time",u),u.timeSource)be(u.timeSource);let f=u.warmup??wo,D=u.samples,A=u.minSamples??ho,W=D!==void 0?0:(u.budgetMs??bo)*1e6,L=u.timeSource!==void 0,j=u.ignoreExitCodes??[],oe=new Set(j),H=[],me=0,Q=0,ie=!1,ee;function Ne(){if(ie)return!0;if(D!==void 0)return Q>=D;return Q>=A&&me>=W}async function Ue(ue,le){if(u.prepare)await we(u.prepare,{phase:ue,index:le},{cwd:u.cwd,env:u.env,timeoutMs:u.timeoutMs,signal:u.signal});return mn(u)}return{async warmup(){for(let ue=0;ue<f;ue++){if(u.signal?.aborted)return;await Ue("warmup",ue)}},async step(){if(Ne()||u.signal?.aborted)return!1;let ue=await Ue("timing",Q);if(u.signal?.aborted)return!1;if(ue.timeSourceNoMatch)ee??=ue.timeSourceMissOutput;let le=ue.exitCode??void 0;if(H.push({i:Q,wallNs:ue.wallNs,exitCode:le,userNs:ue.userNs,systemNs:ue.systemNs,maxRssBytes:ue.maxRssBytes,...ue.reportedNs!==void 0&&{reportedNs:ue.reportedNs},...ue.timedOut&&{timedOut:!0},...ue.timeSourceNoMatch&&{timeSourceNoMatch:!0}}),me+=ue.wallNs,Q++,tr(le,oe))ie=!0;return!0},done:Ne,result(){let ue=H.filter((He)=>!He.timedOut&&!He.timeSourceNoMatch),le=ue.map((He)=>L?He.reportedNs:He.wallNs),Ve=[],Ee=H.filter((He)=>He.timedOut).length;if(Ee>0)Ve.push({code:"timeout",message:`${Ee} of ${H.length} trial(s) timed out after ${u.timeoutMs}ms.`,data:{timeoutMs:u.timeoutMs,trials:Ee}});let _e=H.filter((He)=>He.timeSourceNoMatch).length;if(_e>0&&u.timeSource){let{pattern:He}=u.timeSource;Ve.push({code:"time-source-no-match",message:`${_e} of ${H.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof He==="string"?He:He.source,trials:_e,...ee!==void 0&&{output:ee}}})}if(le.length===0)return{trials:H,warnings:Ve};let je=c(le);return Ve.push(...ye(je,ue.map((He)=>He.exitCode),L?"reported":"subprocess",j)),{trials:H,timing:je,warnings:Ve}}}}async function Et(u){await u.warmup();while(await u.step());}async function sn(u){let f=Nt(u);return await Et(f),f.result()}function fe(u,f=[]){if(!u.timing)return!0;let D=new Set(f);return u.trials.some((A)=>tr(A.exitCode,D))}function _n(u,f){for(let[D,A]of Object.entries({samples:f.samples,minSamples:f.minSamples}))if(A!==void 0&&(!Number.isFinite(A)||A<1))throw RangeError(`${u}: ${D} must be >= 1, got ${A}`);if(f.budgetMs!==void 0&&!Number.isFinite(f.budgetMs))throw RangeError(`${u}: budgetMs must be finite, got ${f.budgetMs}`);if(f.warmup!==void 0&&(!Number.isFinite(f.warmup)||f.warmup<0))throw RangeError(`${u}: warmup must be >= 0, got ${f.warmup}`);if(f.timeoutMs!==void 0&&(!Number.isFinite(f.timeoutMs)||f.timeoutMs<=0))throw RangeError(`${u}: timeoutMs must be > 0, got ${f.timeoutMs}`)}class F extends l{}class G extends Error{side;constructor(u,f){super(u);this.side=f}}class V extends Error{}var Co=new URL("./ab-runner.ts",import.meta.url).pathname,Fn={keepTrees:5,base:"HEAD",rounds:15,thresholdPct:10,geomeanThresholdPct:1.5,memThresholdPct:10,confirm:2},rr=1048576,vo=16384;function or(u,f){let D=Bun.spawnSync(["git",...u],{cwd:f,stdout:"pipe",stderr:"ignore"});return D.success?D.stdout.toString().trim():void 0}var Ft=`
|
|
3
|
-
;globalThis.__ostia_ab_base__;
|
|
4
|
-
`,Io="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function Oo(u){for await(let f of new Bun.Glob(Io).scan({cwd:u,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(f)||!ko(f).isFile())continue;yo(f,Ft)}}function Do(u,f,D){if(D.length===0)return`${u}/${f}`;return`${u}/${f}-${e("ab-setup",D).slice(-8)}`}var No=20,Eo=65536,Ao=1000;function sr(u){let f=u.getReader(),D=new TextDecoder,A="",W=(async()=>{try{for(;;){let L=await f.read();if(L.done)return;A=(A+D.decode(L.value,{stream:!0})).slice(-Eo)}}catch{}})();return{done:W,stop:async()=>(await f.cancel().catch(()=>{}),await W,A)}}async function Fo(u,f,D,A){let W=Bun.spawn(["sh","-c",u],{cwd:f,env:D,stdout:"pipe",stderr:"pipe",stdin:"ignore",detached:!0}),L=()=>{try{process.kill(-W.pid,"SIGKILL")}catch{}},j=!1,oe=A.timeoutMs===void 0?void 0:setTimeout(()=>{j=!0,L()},A.timeoutMs);if(A.signal?.addEventListener("abort",L),A.signal?.aborted)L();let H=sr(W.stdout),me=sr(W.stderr),Q;try{let ie=await W.exited;L(),await Promise.race([Promise.all([H.done,me.done]),new Promise((Ue)=>{Q=setTimeout(Ue,Ao)})]);let[ee,Ne]=await Promise.all([H.stop(),me.stop()]);return{exitCode:ie,timedOut:j,output:Ne.trim()||ee.trim()}}finally{clearTimeout(oe),clearTimeout(Q),A.signal?.removeEventListener("abort",L)}}async function Wo(u,f,D){let A=At(D.toplevel),W=At(D.cwd),L=mr(A,W),j=L&&Ln(`${u}/${L}`)?`${u}/${L}`:u,oe=[];for(let[H,me]of[[`${A}/node_modules`,`${u}/node_modules`],[`${W}/node_modules`,`${j}/node_modules`]]){if(!Ln(H)||Ln(me))continue;Mo(H,me),oe.push(me)}try{for(let H of D.commands){D.onProgress?.({phase:"setup",command:H});let{exitCode:me,timedOut:Q,output:ie}=await Fo(H,j,{...process.env,OSTIA_AB_SHA:f,OSTIA_AB_CANDIDATE_DIR:W},D);if(D.signal?.aborted)return!1;if(me===0&&!Q)continue;let ee=ie.split(`
|
|
5
|
-
`).slice(-No).join(`
|
|
6
|
-
`),Ne=Q?`timed out after ${D.timeoutMs}ms`:`exited ${me}`;throw new V(`Base setup ${Ne}: ${H}${ee?`
|
|
7
|
-
${ee}`:""}`)}return!0}finally{for(let H of oe)xo(H)}}async function Bo(u,f,D){if(Ln(f))return!0;let A=`${f}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;await h(A),await $o(A,{recursive:!0});let W=Bun.spawn(["git","archive","--format=tar",u],{cwd:D.cwd,stdout:"pipe",stderr:"pipe"}),L=Bun.spawn(["tar","-x","-C",A],{stdin:W.stdout,stderr:"pipe"}),[j,oe]=await Promise.all([W.exited,L.exited]);if(j!==0||oe!==0){let H=await new Response(j!==0?W.stderr:L.stderr).text();throw await h(A),Error(`Could not extract ${u}: ${H.trim()}`)}try{if(!await Wo(A,u,D))return await h(A),!1}catch(H){throw await h(A),H}await Oo(A);try{Po(A,f)}catch{await h(A)}return!0}var Uo=3600000;function _o(u){try{return process.kill(u,0),!0}catch(f){return f.code==="EPERM"}}function Lo(u){let f=new Date;try{To(u,f,f)}catch{}}async function jo(u,f){if(!Ln(u))return 0;let D=Date.now(),A=[],W=[];for(let L of ar(u)){let j=`${u}/${L}`,oe=/\.tmp-(\d+)(?:-\w+)?$/.exec(L);if(oe){if(!_o(Number(oe[1])))A.push(j);continue}try{W.push({path:j,mtimeMs:Ro(j).mtimeMs})}catch{}}W.sort((L,j)=>j.mtimeMs-L.mtimeMs);for(let L of W.slice(f))if(D-L.mtimeMs>Uo)A.push(L.path);for(let L of A)await h(L);return A.length}async function an(u={}){let f=u.cwd??process.cwd(),D=`${S(f,u.outDir??An)}/ab`;if(!Ln(D))return 0;let A=ar(D).length;return await h(D),A}function Vo(u,f,D,A){let W=u.paired,L=[...D.base,...D.cand],j=(oe,H)=>{let me=un(p(D.base.map(oe)),p(D.cand.map(oe)),A,H);if(!O(W))me.verdict="unchanged";return me};if(f.alloc){let oe=Math.min(...L.map((H)=>H.alloc.calls));W.retained=j((H)=>H.alloc.bytesPerOp,vo/oe)}if(f.peakMem){let oe=L.map((Q)=>Q.peak),H=Oe(oe),me=Math.max(...oe.map((Q)=>Q.slackBytes));if(W.peak=j((Q)=>Q.peak.peakBytes,H?Math.max(rr,me):rr),H)u.warnings.push(H)}}function Ho(u,f,D){let A=new Map(f.measurements.map((L)=>[L.workloadId,L])),W=u.measurements.map((L)=>{let j=A.get(L.workloadId);if(!j)return L;if(L.threw&&j.threw&&L.threw.side!==j.threw.side)return{...L,threw:{side:"both",message:`${L.threw.message}
|
|
8
|
-
${j.threw.message}`}};if(L.threw)return L;if(j.threw)return j;let oe=L.paired,H=j.paired;if(!oe||!H||!L.timing||!j.timing)return L;let me=[...oe.ratios,...H.ratios],Q=[...oe.baseSamples,...H.baseSamples],ie=se(me,D),ee=c([...L.timing.samples,...j.timing.samples]);if(oe.batch>1)ee.batch=oe.batch;return{...L,timing:ee,diagnosticWallNs:(L.diagnosticWallNs??0)+(j.diagnosticWallNs??0),paired:{rounds:oe.rounds+H.rounds,batch:oe.batch,baseSamples:Q,baseMedianNs:p(Q),ratios:me,...ie,verdict:ie.flagged??"unchanged",sameOutput:oe.sameOutput&&H.sameOutput}}});return{...u,measurements:W}}function Go(u){if(!u.repeats?.length)return u.medianRatio;return p([u.medianRatio,...u.repeats.map((f)=>f.medianRatio)])}function ir(u,f){let D=u.filter((le)=>!le.threw).map((le)=>le.paired).filter((le)=>le!==void 0),A=(le)=>D.filter((Ve)=>Ve.verdict===le).length,W=D.filter(O),L=W.reduce((le,Ve)=>le+Math.log(Go(Ve)),0),j=W.length>0?(Math.exp(L/W.length)-1)*100:null,oe=A("regressed"),H=A("improved"),me=u.filter((le)=>le.threw),Q=me.some((le)=>le.threw?.side==="cand"),{memThresholdPct:ie,...ee}=f,Ne=D.filter((le)=>le.retained||le.peak).map((le)=>[le.retained?.verdict,le.peak?.verdict]),Ue=Ne.filter((le)=>le.includes("regressed")),ue=Ne.length>0&&{thresholdPct:ie??Fn.memThresholdPct,regressed:Ue.length,improved:Ne.filter((le)=>le.includes("improved")&&!le.includes("regressed")).length};return{...ee,matched:D.length,regressed:oe,improved:H,unchanged:D.length-oe-H,unconfirmed:D.filter((le)=>le.confirmed===!1).length,outputDiffers:D.filter((le)=>!le.sameOutput).length,notComparable:D.length-W.length,threw:me.length,...ue&&{memory:ue},geomeanPct:j,verdict:oe>0||Q||Ue.length>0||j!==null&&j>f.geomeanThresholdPct?"fail":"pass"}}async function ge(u){let f=u.base??Fn.base,D=u.rounds??Fn.rounds,A=u.thresholdPct??Fn.thresholdPct,W=u.geomeanThresholdPct??Fn.geomeanThresholdPct,L=u.memThresholdPct??Fn.memThresholdPct,j=u.confirm??Fn.confirm,oe=u.keepTrees??Fn.keepTrees;if(!Number.isInteger(oe)||oe<1)throw RangeError(`ab: keepTrees must be an integer >= 1, got ${oe}`);if(!Number.isInteger(D)||D<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${D}`);if(!Number.isInteger(j)||j<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${j}`);for(let[Ye,Qe]of Object.entries({thresholdPct:A,geomeanThresholdPct:W,memThresholdPct:L}))if(!Number.isFinite(Qe)||Qe<0)throw RangeError(`ab: ${Ye} must be >= 0, got ${Qe}`);_n("ab",{timeoutMs:u.timeoutMs});let H=u.cwd??process.cwd(),me=S(H,u.outDir??An),Q=Ce(me,"ab"),ie=u.suites.map((Ye)=>S(H,Ye));for(let[Ye,Qe]of ie.entries())$e(u.suites[Ye],Qe);let ee=or(["rev-parse","--show-toplevel"],H);if(ee===void 0)throw new F(`${H} is not inside a git repository.`);let Ne=or(["rev-parse","--verify","--quiet",`${f}^{commit}`],H);if(Ne===void 0)throw new F(`"${f}" is not a commit in ${ee}.`);let Ue=typeof u.baseSetup==="string"?[u.baseSetup]:u.baseSetup??[],ue=Do(`${me}/ab`,Ne,Ue),le=await Bo(Ne,ue,{commands:Ue,toplevel:ee,cwd:H,timeoutMs:u.timeoutMs,signal:u.signal,onProgress:u.onProgress}),Ve={base:{ref:f,sha:Ne},rounds:D,thresholdPct:A,geomeanThresholdPct:W,memThresholdPct:L};if(!le){let Ye=t([],[]);return Ye.unmatched={baseOnly:[],candOnly:[]},Ye.ab=ir([],Ve),Ye}let{environment:Ee,noiseWarning:_e}=v(u.noiseCheck),je=ie.map((Ye,Qe)=>{let kn=mr(ee,At(Ye));if(kn===".."||kn.startsWith(`..${So}`))throw new l(`${u.suites[Qe]} is outside ${ee}.`);return Ln(`${ue}/${kn}`)?`${ue}/${kn}`:""}),He=await Promise.all(ie.map(async(Ye,Qe)=>{if(!je[Qe])return!1;let kn=await Bun.file(je[Qe]).text(),Rn=await Bun.file(Ye).text();return(kn.endsWith(Ft)?kn.slice(0,-Ft.length):kn)!==Rn})),Tn=(u.preload??[]).map((Ye)=>S(H,Ye)),Ge=u.bunFlags??[],en=u.onProgress,cn=0,Sn=async(Ye,Qe={},kn)=>{Lo(ue);let Rn=`${Q}/${e("ab-run",ie[Ye],cn++)}.json`,Bn={filter:u.filter,rounds:D,thresholdPct:A,preload:Tn,progress:en!==void 0&&!Qe.workloadIds&&!Qe.memoryFor,...Qe},Xn;try{Xn=await Ie(["bun",...Ge,Co,ie[Ye],je[Ye],Rn,JSON.stringify(Bn)],{cwd:H,label:"A/B suite",name:u.suites[Ye],timeoutMs:u.timeoutMs,signal:u.signal,env:kn,errorFile:`${Rn}.error`,...Bn.progress&&{ipc:(Un)=>en?.({phase:"measure",suite:Ye+1,suites:ie.length,file:u.suites[Ye],pass:Qe.candFirst?2:1,passes:2,...Un})}})}catch(Un){let Zn=Bun.file(`${Rn}.side`);if(!await Zn.exists())throw Un;throw new G(Un.message,await Zn.text())}return Xn?Rn:void 0},tn=async(Ye,Qe={})=>{let kn=await Sn(Ye,{...Qe,rounds:Math.ceil(D/2)});if(!kn)return;let Rn=await Sn(Ye,{...Qe,planPath:void 0,rounds:Math.floor(D/2),candFirst:!0});if(!Rn)return;return Ho(await a(kn),await a(Rn),A)};try{let Ye=[],Qe=[],kn=new Map,Rn=[],Bn=[],Xn=[];for(let Ze=0;Ze<ie.length;Ze++){let Pn=`${Q}/${e("ab-plan",ie[Ze])}.json`,Cn=await tn(Ze,{alloc:u.alloc,peakMem:u.peakMem,planPath:Pn});if(!Cn)break;let In=await Bun.file(Pn).json();for(let Mn of In.memory)Xn.push({...Mn,suite:Ze});Ye.push(...Cn.workloads),Qe.push(...Cn.measurements);for(let Mn of Cn.measurements){if(kn.set(Mn.workloadId,Ze),!He[Ze]||!Mn.paired)continue;if(Mn.paired.suiteChanged=!0,!O(Mn.paired))Mn.paired.verdict="unchanged";Mn.warnings.push({code:"suite-changed",message:O(Mn.paired)?"The suite file differs from the base's copy, so each side may run a different benchmark.":"The suite file differs from the base's copy and so does the output: each side likely ran a different benchmark. Left out of the verdict, geomean and memory verdict."})}Rn.push(...Cn.unmatched?.baseOnly??[]),Bn.push(...Cn.unmatched?.candOnly??[])}let Un=Qe.filter((Ze)=>Ze.paired?.flagged&&j>0&&O(Ze.paired)),Zn=new Map(Ye.map((Ze)=>[Ze.id,Ze.entry?.task??Ze.id])),_r=0;for(let Ze of Un){let Pn=Ze.paired,Cn=Pn.flagged;Pn.repeats=[];for(let In=0;In<j&&!u.signal?.aborted;In++){en?.({phase:"confirm",repeat:++_r,repeats:Un.length*j,label:Zn.get(Ze.workloadId)??Ze.workloadId});let jn=(await tn(kn.get(Ze.workloadId),{workloadIds:[Ze.workloadId]}))?.measurements[0];if(jn?.threw){Ze.threw={...jn.threw,repeat:In+1};break}let vn=jn?.paired;if(!vn)break;Pn.repeats.push({medianRatio:vn.medianRatio,ratioP25:vn.ratioP25,ratioP75:vn.ratioP75,...vn.flagged&&{flagged:vn.flagged}})}Pn.confirmed=!Ze.threw&&Pn.repeats.length===j&&Pn.repeats.every((In)=>In.flagged===Cn),Pn.verdict=Pn.confirmed?Cn:"unchanged"}let Vt=new Map(Qe.map((Ze)=>[Ze.workloadId,Ze])),Ht=Xn.filter(({workloadId:Ze})=>{let Pn=Vt.get(Ze);return Pn?.paired&&!Pn.threw}),Lr=Ht.length*ce*2,jr=0;for(let Ze of Ht){let{workloadId:Pn,suite:Cn,peakMem:In}=Ze,Mn={base:[],cand:[]};for(let jn=0;jn<ce&&!u.signal?.aborted;jn++)for(let vn of["base","cand"]){if(u.signal?.aborted)break;en?.({phase:"memory",run:++jr,runs:Lr,side:vn,label:Zn.get(Pn)??Pn});let Gt=await Sn(Cn,{memoryFor:{...Ze,side:vn}},In?{OSTIA_PEAK_MEM:"1"}:void 0);if(Gt)Mn[vn].push(await Bun.file(Gt).json())}if(Mn.base.length===0||Mn.cand.length===0)continue;Vo(Vt.get(Pn),Ze,Mn,L)}Ae(Qe,_e,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites had already completed.":void 0);let Ct=t(Ye,Qe,Ee);return Ct.unmatched={baseOnly:Rn,candOnly:Bn},Ct.ab=ir(Qe,{...Ve,newSuites:u.suites.filter((Ze,Pn)=>!je[Pn])}),await jo(`${me}/ab`,oe),Ct}finally{await h(Q)}}import{resolve as zo}from"path";var Ko=["node_modules",".git"],ur=/[*?[\]{}!]/;function Jo(u,f){let D=u.split("/"),A=D.findIndex((L)=>ur.test(L)),W=A<0?D.length:A;return[D.slice(W),f.split("/").slice(W)]}async function J(u,f){let D=new Set;for(let A of u){if(!ur.test(A)){if(await Bun.file(zo(f,A)).exists())D.add(A);continue}for await(let W of new Bun.Glob(A).scan({cwd:f,dot:!0})){let[L,j]=Jo(A,W);if(!j.some((H)=>Ko.includes(H)&&!L.includes(H)))D.add(W)}}return[...D].sort()}var Yo=new URL("./runner.ts",import.meta.url).pathname;function qe(){return Math.max(1,navigator.hardwareConcurrency||1)}async function te(u,f,D=process.cwd()){return{suites:u.suites.length>0?u.suites:f?.suites?await J(f.suites,D):[],budgetMs:u.budgetMs??f?.budgetMs,samples:u.samples??f?.samples,minSamples:u.minSamples??f?.minSamples,jobs:u.jobs??(f?.jobs==="auto"?qe():f?.jobs),gc:u.gc??f?.gc??!1,cpu:u.cpu??f?.cpu??!1,cpuIntervalUs:u.cpuIntervalUs??f?.cpuIntervalUs,alloc:u.alloc??f?.alloc??!1,peakMem:u.peakMem??f?.peakMem??!1,filter:u.filter??f?.filter,isolate:u.isolate??f?.isolate??!1,preload:u.preload.length>0?u.preload:f?.preload??[],bunFlags:u.bunFlags.length>0?u.bunFlags:f?.bunFlags??[],outDir:u.outDir??f?.outDir,noiseCheck:u.noiseCheck,timeoutMs:u.timeoutMs??f?.timeoutMs,cwd:D}}function qo(u,f){if(!f?.length)return[];let D=p(f.map((W)=>W.peakBytes)),A=Oe(f);return[y({workload:u,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:p(f.map((W)=>W.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:D},warnings:A?[A]:[],artifacts:[]})]}async function z(u){_n("bench",u);let f=u.jobs??1;if(!Number.isInteger(f)||f<1)throw RangeError(`bench: jobs must be an integer >= 1, got ${f}`);let D=u.cwd??process.cwd(),A=Ce(S(D,u.outDir??An),"bench"),W=u.suites.map((ee)=>S(D,ee));for(let[ee,Ne]of W.entries())$e(u.suites[ee],Ne);let L=(u.preload??[]).map((ee)=>S(D,ee)),j=u.bunFlags??[],{environment:oe,noiseWarning:H}=v(u.noiseCheck),me={budgetMs:u.budgetMs,samples:u.samples,minSamples:u.minSamples,gc:u.gc,cpu:u.cpu,cpuIntervalUs:u.cpuIntervalUs,alloc:u.alloc,peakMem:u.peakMem,noiseCheck:!1},Q=(ee,Ne,...Ue)=>`${A}/${e(ee,W[Ne],...Ue)}.json`,ie=async(ee,Ne)=>{let Ue=new Set,ue=0,le,Ve=async()=>{while(le===void 0&&!u.signal?.aborted&&ue<ee.length){let Ee=ee[ue++];try{if(!await Ie(["bun",...j,Yo,W[Ee.suiteIndex],Ee.outPath,JSON.stringify(Ee.runnerOpts)],{label:"Bench suite",name:u.suites[Ee.suiteIndex],cwd:D,env:Ne,timeoutMs:u.timeoutMs,signal:u.signal,inFlight:Ue}))return}catch(_e){le??=_e instanceof Error?_e:Error(String(_e));for(let je of Ue)je.kill()}}};if(await Promise.all(Array.from({length:Math.min(f,ee.length)},Ve)),le)throw le};try{let ee=W.map((Ge,en)=>({planPath:Q("bench-plan",en),outPath:Q("bench-primary",en)}));await ie(ee.map((Ge,en)=>({suiteIndex:en,outPath:Ge.outPath,runnerOpts:{...me,filter:u.filter,isolate:u.isolate,preload:L,planPath:Ge.planPath}})));let Ne=await Promise.all(ee.map(async(Ge)=>await Bun.file(Ge.planPath).exists()?(await Bun.file(Ge.planPath).json()).tasks:[])),Ue=await Promise.all(ee.map((Ge)=>Xe(Ge.outPath))),ue=Ne.flatMap((Ge,en)=>Ge.filter((cn)=>cn.isolate).map((cn)=>({task:cn,suiteIndex:en}))),le=ue.map((Ge,en)=>Q("bench-item",Ge.suiteIndex,en));await ie(ue.map((Ge,en)=>({suiteIndex:Ge.suiteIndex,outPath:le[en],runnerOpts:{...me,workloadIds:[Ge.task.workloadId],preload:L,markIsolated:!0}})));let Ve=new Map;await Promise.all(ue.map(async(Ge,en)=>{let cn=await Xe(le[en]);if(cn)Ve.set(Ge.task,cn)}));let Ee=Ne.flatMap((Ge,en)=>Ge.filter((cn)=>cn.peakMem).flatMap((cn)=>Array.from({length:ce},()=>({workloadId:cn.workloadId,suiteIndex:en})))),_e=Ee.map((Ge,en)=>Q("bench-peak",Ge.suiteIndex,en));await ie(Ee.map((Ge,en)=>({suiteIndex:Ge.suiteIndex,outPath:_e[en],runnerOpts:{filter:u.filter,preload:L,peakMemFor:Ge.workloadId}})),{OSTIA_PEAK_MEM:"1"});let je=new Map;for(let Ge=0;Ge<Ee.length;Ge++){let en=Bun.file(_e[Ge]);if(!await en.exists())continue;let cn=Ee[Ge].workloadId,Sn=je.get(cn)??[];Sn.push(await en.json()),je.set(cn,Sn)}let He=[],Tn=[];return Ne.forEach((Ge,en)=>{let cn=Ue[en];if(!cn)return;let Sn=Map.groupBy(cn.measurements,(Ye)=>Ye.workloadId),tn=0;for(let Ye of Ge){let Qe,kn;if(Ye.isolate){let Rn=Ve.get(Ye);if(!Rn)continue;Qe=Rn.workloads[0],kn=Rn.measurements.filter((Bn)=>Bn.workloadId===Qe.id)}else Qe=cn.workloads[tn++],kn=Sn.get(Qe.id)??[];He.push(Qe),Tn.push(...kn,...qo(Qe,je.get(Qe.id)))}}),Ae(Tn,H,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed.":void 0),t(He,Tn,oe)}finally{await h(A)}}function gn(u,f,D=8){if(D<=1)throw RangeError(`range: multiplier must be > 1, got ${D}`);if(u<=0)throw RangeError(`range: start must be > 0, got ${u}`);let A=[];for(let W=u;W<=f;W*=D)A.push(W);if(!A.includes(f))A.push(f);return A}function cr(u){return u.cpu!==void 0}function Wt(u,f){if(f){let D=u.measurements.find((A)=>A.id===f);return D&&cr(D)?[D]:[]}return u.measurements.filter((D)=>D.phase==="cpu"&&cr(D))}function Vn(u,f,D,A){return{files:Wt(u,f.measurementId).map((W)=>({path:`${W.id}.${D}`,content:A(W)}))}}function Hn(u){let f=u.nodes,D=f.length,A=Qo(u),W=new Int32Array(D).fill(-1);for(let H=0;H<D;H++)for(let me of f[H].children){let Q=A(me);if(Q!==-1)W[Q]=H}let L=[];for(let H=0;H<D;H++)if(W[H]===-1)L.push(H);let j=[],oe=[];for(let H=L.length-1;H>=0;H--)oe.push(L[H]);while(oe.length>0){let H=oe.pop();j.push(H);for(let me of f[H].children){let Q=A(me);if(Q!==-1&&W[Q]===H)oe.push(Q)}}return{count:D,indexOf:A,parentIx:W,roots:L,order:j}}function Qo(u){let f=u.nodes,D=f.length,A=1/0,W=-1/0,L=!0;for(let oe=0;oe<D;oe++){let H=f[oe].id;if(!Number.isInteger(H)){L=!1;break}if(H<A)A=H;if(H>W)W=H}if(L&&D>0&&W-A<D*4+64){let oe=W-A+1,H=new Int32Array(oe).fill(-1);for(let me=0;me<D;me++)H[f[me].id-A]=me;return(me)=>{let Q=me-A;return Q>=0&&Q<oe?H[Q]:-1}}let j=new Map;for(let oe=0;oe<D;oe++)j.set(f[oe].id,oe);return(oe)=>j.get(oe)??-1}function dr(u,f){let{count:D,indexOf:A,parentIx:W,order:L}=f,j=new Float64Array(D),oe=new Float64Array(D),H=u.samples?.nodeIds??[],me=u.samples?.timeDeltasUs??[];for(let ie=0;ie<H.length;ie++){let ee=A(H[ie]);if(ee===-1)continue;j[ee]+=me[ie]??0,oe[ee]+=1}let Q=new Float64Array(D);for(let ie=L.length-1;ie>=0;ie--){let ee=L[ie];Q[ee]+=j[ee];let Ne=W[ee];if(Ne>=0)Q[Ne]+=Q[ee]}return{selfUs:j,totalUs:Q,samples:oe}}var lr={name:"collapsed",async render(u,f={}){return Vn(u,f,"collapsed.txt",({cpu:D})=>{let{nodes:A,frames:W}=D,L=Hn(D),j=Array(L.count);for(let Q of L.order){let ie=I(W[A[Q].frameIx]),ee=L.parentIx[Q];j[Q]=ee===-1?ie:`${j[ee]};${ie}`}let oe=new Float64Array(L.count),H=[];for(let Q of D.samples?.nodeIds??[]){let ie=L.indexOf(Q);if(ie===-1)continue;if(oe[ie]++===0)H.push(ie)}let me=H.map((Q)=>`${j[Q]} ${oe[Q]}`);return me.length>0?`${me.join(`
|
|
9
|
-
`)}
|
|
10
|
-
`:""})}};var pr={name:"cpuprofile",async render(u,f={}){let D=[],A=[];for(let W of Wt(u,f.measurementId)){let{origin:L}=W.cpu;if(L!=="cpu-prof"&&L!=="inspector"){A.push(`${W.id} (origin ${L} has no .cpuprofile artifact to pass through)`);continue}let j=W.artifacts.find((H)=>H.kind==="cpuprofile");if(!j){A.push(`${W.id} (no cpuprofile artifact recorded on this run)`);continue}let oe=Bun.file(j.path);if(!await oe.exists()){A.push(`${W.id} (artifact missing on disk: ${j.path})`);continue}D.push({path:`${W.id}.cpuprofile`,content:await oe.text()})}if(D.length===0&&A.length>0)return{text:`No .cpuprofile artifacts available:
|
|
11
|
-
${A.map((W)=>` - ${W}`).join(`
|
|
12
|
-
`)}
|
|
13
|
-
`};return{files:D}}};var fr={name:"json",async render(u){return{text:q(u)}}};var gr={name:"jsonl",async render(u){let{measurements:f,...D}=u;return{text:`${[M({kind:"document",...D}),...f.map((W)=>M({kind:"measurement",...W}))].join(`
|
|
14
|
-
`)}
|
|
15
|
-
`}}};var hr=0.5;function $n(u){return new Map(u.workloads.map((f)=>[f.id,f]))}function Gn(u){return u.measurements.filter((f)=>f.phase==="timing"&&f.timing!==void 0)}function zn(u){return u.measurements.filter((f)=>f.phase==="timing"&&f.timing===void 0)}function Kn(u,f){let D=new Set(f.map((A)=>A.workloadId));return u.workloads.filter((A)=>A.skipped&&!D.has(A.id))}function ut(u){for(let f of u.comparisons??[]){let D=f.warnings?.find((A)=>A.code==="environment-mismatch");if(D)return D}return}function ct(u){return(u.warnings??[]).filter((f)=>f.code!=="environment-mismatch")}function dt(u){let f=$n(u),D=new Map(u.measurements.map((A)=>[A.id,A]));return(A)=>{let W=D.get(A.candidateMeasurementId),L=W?.workloadId??A.candidateMeasurementId;return{run:W,workloadId:L,workload:f.get(L)}}}function lt(u,f){return(u.frames??[]).slice(0,f).filter((D)=>Math.abs(D.deltaPct)>=hr)}function pt(u,f){return(u.heapTypes??[]).slice(0,f).filter((D)=>Math.abs(D.deltaPct)>=hr)}function Jn(u){let f=new Map;for(let D of u.measurements){if(D.phase!=="memstats"||!D.memory)continue;let A=f.get(D.workloadId)??{warnings:[]};if(D.memory.bytesPerOp!==void 0)A.retained=D.memory.bytesPerOp;if(D.memory.peakBytes!==void 0)A.peak=D.memory.peakBytes;A.warnings.push(...D.warnings),f.set(D.workloadId,A)}return f}function rt(u,f){let D=f.get(u.workloadId)?.warnings;return D?.length?[...u.warnings,...D]:u.warnings}function ft(u){return[{header:"Retained/op",read:(D)=>D.retained},{header:"Peak mem",read:(D)=>D.peak}].filter((D)=>{for(let A of u.values())if(D.read(A)!==void 0)return!0;return!1}).map((D)=>({header:D.header,cell:(A)=>{let W=u.get(A),L=W&&D.read(W);return L===void 0?void 0:R(L)}}))}function br(u){return u.phase==="paired"&&u.threw!==void 0}function wr(u){return u.phase==="paired"&&u.threw===void 0&&u.timing!==void 0&&u.paired!==void 0}function Yn(u){return u.measurements.filter(wr)}function ht(u){return u.measurements.filter(br)}function yr(u){let f=[];for(let D of u.measurements)if(br(D))f.push({kind:"threw",run:D});else if(wr(D))f.push({kind:"timed",run:D});return f}function bt(u){return`${b(u.side)} threw${u.repeat?` (repeat ${u.repeat})`:""}`}function gt(u){return r((u-1)*100)}function Xo(u){if(!O(u))return"not comparable";if(!u.flagged)return"";let f=u.repeats?.length?` (repeats: ${u.repeats.map((D)=>gt(D.medianRatio)).join(", ")})`:"";if(u.confirmed===void 0)return`${u.flagged}${f}`;return`${u.confirmed?`${u.flagged}, confirmed`:`${u.flagged}? unconfirmed`}${f}`}function wt(u){if(!u.newSuites?.length)return;return`New suite${u.newSuites.length>1?"s":""}, not at ${u.base.ref}: ${u.newSuites.join(", ")}`}function yt(u){let f=u.paired,D=B(Math.min(f.baseMedianNs,u.timing.median));return{base:n(f.baseMedianNs,D),candidate:n(u.timing.median,D),change:gt(f.medianRatio),spread:`${gt(f.ratioP25)}\u2026${gt(f.ratioP75)}`,verdict:Xo(f)}}function kt(u){return Yn(u).flatMap((f)=>{let D=[],{retained:A,peak:W}=f.paired;if(A)D.push({run:f,reading:"retained/op",change:A});if(W)D.push({run:f,reading:"peak",change:W});return D})}function Zo(u){let f=Math.round(u.baseBytes),D=Math.round(u.candBytes)-f;if(D===0)return"0B";let A=`${D>0?"+":"-"}${R(Math.abs(D))}`;if(f===0||u.baseBytes<u.floorBytes)return A;return`${A} (${r(D/f*100)})`}function Pt({reading:u,change:f}){return{reading:u,base:R(f.baseBytes),candidate:R(f.candBytes),change:Zo(f),verdict:f.verdict==="unchanged"?"":f.verdict}}function Rt(u){let f=u.memory?` \xB7 memory threshold ${u.memory.thresholdPct}%`:"";return`working tree vs ${u.base.ref} (${u.base.sha.slice(0,7)}) \xB7 ${u.rounds} rounds \xB7 threshold ${u.thresholdPct}% \xB7 geomean threshold ${u.geomeanThresholdPct}%${f}`}function Mt(u){let f=u.geomeanPct===null?"Geomean -":`Geomean ${r(u.geomeanPct)} (threshold ${u.geomeanThresholdPct}%)`,D=[u.unconfirmed>0&&`${u.unconfirmed} unconfirmed`,u.notComparable>0&&`${u.notComparable} not comparable`,u.threw>0&&`${u.threw} threw`].filter(Boolean),A=D.length>0?` (${D.join(", ")})`:"",W=u.memory?` \xB7 memory: ${u.memory.regressed} regressed, ${u.memory.improved} improved`:"";return`${f} \xB7 ${u.regressed} regressed, ${u.improved} improved, ${u.unchanged} unchanged of ${u.matched}${A}${W} \xB7 ${u.verdict}`}function xt(u){let f=$n(u),D=(A)=>s(f.get(A),A);return{outputDiffers:Yn(u).filter((A)=>!A.paired.sameOutput).map((A)=>D(A.workloadId)),baseOnly:(u.unmatched?.baseOnly??[]).map(D),candOnly:(u.unmatched?.candOnly??[]).map(D)}}function Wn(u){if(!u?.entry)return;if(u.entry.group!==void 0)return u.entry.group;let f=u.entry.task,D=f.lastIndexOf("/");return D===-1?void 0:f.slice(0,D)}function kr(u,f){return f!==void 0&&u.startsWith(`${f}/`)?u.slice(f.length+1):u}function qn(u){if(u.length<2)return;let f=Math.min(...u.map((W)=>W.run.timing.median)),D=new Map;for(let W of u){let L=Wn(W.workload);if(L===void 0)continue;let j=D.get(L);if(j)j.push(W);else D.set(L,[W])}let A=new Map;for(let W of u){let L=Wn(W.workload),j=f;if(L!==void 0){let oe=D.get(L),H=oe.find((me)=>me.workload?.baseline);j=H?H.run.timing.median:Math.min(...oe.map((me)=>me.run.timing.median))}A.set(W,W.run.timing.median/j)}return A}var Pr=10,Rr=10,xn=(u)=>pn(String(u));function Qn(u,f){return[`| ${u.join(" | ")} |`,`|${u.map(()=>"---").join("|")}|`,...f.map((D)=>`| ${D.join(" | ")} |`)]}function es(u){if(!u?.params)return"";return` (${Object.entries(u.params).map(([D,A])=>`${D}=${A}`).join(", ")})`}function ot(u,f){return xn(s(u,f)+es(u))}function Bt(u){return`${u.message} (\`${u.code}\`)`}function Mr(u,f){return f.map((D)=>`- **${u}**: ${Bt(D)}`)}function ns(u){let f;for(let D of u){let A=D?.params?Object.keys(D.params):void 0;if(A?.length!==2)return;if(f===void 0)f=A;else if(A.some((W,L)=>W!==f[L]))return}return f}var xr={name:"markdown",async render(u){let f=$n(u),D=u.git?` \xB7 ${_(u.git)}`:"",A=ut(u);return{text:["# Profile Report","",`Bun ${u.bunVersion} \xB7 ostia ${u.toolVersion} \xB7 ${u.platform.os}/${u.platform.arch} \xB7 ${u.createdAt}${D}`,"",...u.environment?[Re(u.environment),""]:[],...A?[`> \u26A0 ${A.message}`,""]:[],...u.ab?ts(u,u.ab,f):[],...rs(u,f),...os(u,f),...as(u)].join(`
|
|
16
|
-
`)}}};function ts(u,f,D){let A=Yn(u),W=["## A/B","",Rt(f),""];if(A.length>0)W.push(...Qn(["Task","Base","Candidate","Change","p25\u2026p75","Verdict"],A.map((Q)=>{let ie=yt(Q);return[ot(D.get(Q.workloadId),Q.workloadId),ie.base,ie.candidate,ie.change,ie.spread,ie.verdict?`**${xn(ie.verdict)}**`:""]})),"");let L=kt(u);if(L.length>0)W.push(...Qn(["Task","Memory","Base","Candidate","Change","Verdict"],L.map((Q)=>{let ie=Pt(Q);return[ot(D.get(Q.run.workloadId),Q.run.workloadId),ie.reading,ie.base,ie.candidate,ie.change,ie.verdict?`**${ie.verdict}**`:""]})),"");let j=ht(u);if(j.length>0){W.push(`Threw (${j.length}):`,"");for(let Q of j){let ie=Q.threw.message.split(`
|
|
17
|
-
`)[0].replaceAll("`","'");W.push(`- **${ot(D.get(Q.workloadId),Q.workloadId)}**: ${bt(Q.threw)}: \`${ie}\``)}W.push("")}let oe=xt(u),H=(Q,ie)=>ie.length>0?`${Q}: ${ie.map(xn).join(", ")}`:void 0;for(let Q of[H("Output differs from the base",oe.outputDiffers),wt(f),H("Base only",oe.baseOnly),H("Candidate only",oe.candOnly)])if(Q)W.push(Q,"");let me=A.flatMap((Q)=>Mr(s(D.get(Q.workloadId),Q.workloadId),Q.warnings));if(me.length>0)W.push(...me,"");return W.push(`**${Mt(f)}**`,""),W}function rs(u,f){let D=Gn(u),A=zn(u),W=Jn(u),L=[...Kn(u,D).map((ee)=>({id:ee.id,workload:ee,status:"skipped"})),...A.map((ee)=>({id:ee.workloadId,workload:f.get(ee.workloadId),status:"no samples"}))];if(D.length===0&&L.length===0)return[];let j=["## Timing",""],oe=D.map((ee)=>({run:ee,workload:f.get(ee.workloadId)})),H=new Map,me=[];for(let ee of oe){let Ne=Wn(ee.workload);if(Ne===void 0)me.push(ee);else if(H.has(Ne))H.get(Ne).push(ee);else H.set(Ne,[ee])}let Q=[];for(let[ee,Ne]of H){let Ue=ns(Ne.map((ue)=>ue.workload));if(Ue)Q.push({group:ee,keys:Ue,rows:Ne});else me.push(...Ne)}if(me.length>0||L.length>0){let ee=qn(oe),Ne=[],Ue=new Map(me.map((ue)=>[ue,Z(ue.run)]));if([...Ue.values()].some(Boolean))Ne.push({header:"User/Sys",cell:(ue)=>{let le=Ue.get(ue);return le?ve(le):"-"}});for(let ue of ft(W))Ne.push({header:ue.header,cell:(le)=>ue.cell(le.run.workloadId)??"-"});if(ee)Ne.push({header:"Relative",cell:(ue)=>Se(ee.get(ue),!!ue.workload?.baseline)});j.push(...Qn(["Task","Median","Spread (p75\u2026p99)","Mean \xB1 SD","Range","MAD",...Ne.map((ue)=>ue.header)],[...me.map((ue)=>{let le=ue.run.timing,Ve=B(le.median);return[ot(ue.workload,ue.run.workloadId),n(le.median,Ve),Y(le.p75,le.p99,Ve),`${n(le.mean,Ve)} \xB1 ${n(le.stddev,Ve)}`,Y(le.min,le.max,Ve),n(le.mad,Ve),...Ne.map((Ee)=>Ee.cell(ue))]}),...L.map(({id:ue,workload:le,status:Ve})=>[ot(le,ue),`- ${Ve}`,"-","-","-","-",...Ne.map(()=>"-")])]),"")}for(let{group:ee,keys:[Ne,Ue],rows:ue}of Q){let le=[],Ve=[],Ee=new Map;for(let{run:_e,workload:je}of ue){let He=je.params[Ne],Tn=je.params[Ue];if(!le.includes(He))le.push(He);if(!Ve.includes(Tn))Ve.push(Tn);Ee.set(`${He} ${Tn}`,_e.timing.median)}j.push(`### ${xn(ee)} (${xn(Ne)} \xD7 ${xn(Ue)})`,"",...Qn([`${xn(Ne)} \\ ${xn(Ue)}`,...Ve.map(xn)],le.map((_e)=>[xn(_e),...Ve.map((je)=>{let He=Ee.get(`${_e} ${je}`);return He===void 0?"-":n(He)})])),"")}let ie=[...D,...A].flatMap((ee)=>Mr(s(f.get(ee.workloadId),ee.workloadId),rt(ee,W)));if(ie.length>0)j.push("### Warnings","",...ie,"");return j}function os(u,f){let D=[];for(let A of u.measurements){if(A.phase!=="cpu"&&A.phase!=="heap")continue;let W=s(f.get(A.workloadId),A.workloadId);D.push(A.phase==="cpu"?`## CPU capture - ${W}`:`## Heap snapshot - ${W}`,"",`instrumented, diagnostic wall ${xe(A.diagnosticWallNs??0)}ms`,"",...A.phase==="cpu"?ss(A):is(A));let L=[...A.artifacts.map((j)=>`- artifact: \`${j.path}\``),...A.warnings.map((j)=>`- ! ${Bt(j)}`)];if(L.length>0)D.push(...L,"")}return D}function ss(u){let{cpu:f}=u;if(!f)return[];let D=[`origin: \`${f.origin}\`, interval: ${f.samplingIntervalUs}\xB5s, samples: ${X(f)}`,"",...Qn(["Self %","Self (ms)","Total (ms)","Frame"],Te(f,Pr).map((A)=>[`${A.pct}%`,d(A.selfUs),d(A.totalUs),xn(I(A.frame))])),""];if(u.jit){let A=u.jit.tiers;D.push(`JIT tiers: LLInt ${A.llint} \xB7 Baseline ${A.baseline} \xB7 DFG ${A.dfg} \xB7 FTL ${A.ftl}`,"")}return D}function is(u){let{heap:f}=u;if(!f)return[];return[Me(f),"",...Qn(["Count","Type"],f.typeCounts.slice(0,Rr).map((D)=>[String(D.count),xn(D.type)])),""]}function as(u){if(!u.comparisons||u.comparisons.length===0)return[];let f=dt(u),D=["## Comparisons",""];for(let A of u.comparisons){let{run:W,workload:L,workloadId:j}=f(A);if(D.push(`### ${A.verdict==="pass"?"\u2713":"\u2717"} ${s(L,j)}`,""),A.timing){let{medianDeltaPct:oe,ci95:H,pValue:me,verdict:Q}=A.timing,ie=Q==="unchanged"&&me!==void 0&&me>=A.thresholds.alpha?"~":"",ee=[];if(W?.timing)ee.push(`n=${W.timing.samples.length}`);if(H)ee.push(`95% CI [${r(H[0])}, ${r(H[1])}]`);if(me!==void 0)ee.push(`p=${me.toFixed(4)}`);ee.push(`threshold ${A.thresholds.effectiveTimingPct.toFixed(1)}%`),D.push(`- timing: ${ie}${r(oe)} median, ${ee.join(", ")} (**${Q}**)`)}for(let oe of lt(A,Pr))D.push(`- frame \`${xn(oe.name)}\`: ${r(oe.deltaPct)} self-time (${d(oe.baseSelfUs)}ms \u2192 ${d(oe.candSelfUs)}ms)`);for(let oe of pt(A,Rr))D.push(`- heap \`${xn(oe.type)}\`: ${r(oe.deltaPct)} count (${oe.baseCount} \u2192 ${oe.candCount})`);for(let oe of ct(A))D.push(`- ! ${Bt(oe)}`);D.push("")}return D}var ms=15;function us(u,f,D){return`${u.replace(/"/g,"'")} (self ${d(f)}ms, total ${d(D)}ms)`}function cs(u,f,D,A){let W=[];if(A<=0)return W;for(let L=0;L<f;L++){if(L===D)continue;let j=u[L];if(W.length===A&&j<=u[W[A-1]])continue;let oe=W.length;while(oe>0&&u[W[oe-1]]<j)oe--;if(W.splice(oe,0,L),W.length>A)W.pop()}return W}var Tr={name:"mermaid",async render(u,f={}){let D=f.topN??ms;return Vn(u,f,"mermaid.md",({cpu:A})=>{let{nodes:W,frames:L}=A,j=Hn(A),{selfUs:oe,totalUs:H}=dr(A,j),{parentIx:me}=j,Q=j.roots[0]??-1,ie=new Set(Q!==-1?[Q]:[]);for(let Ue of cs(oe,j.count,Q,D)){let ue=[];for(let le=Ue;le!==-1;le=me[le])ue.push(le);for(let le=ue.length-1;le>=0;le--)ie.add(ue[le])}let ee=(Ue)=>`n${W[Ue].id}`,Ne=["graph TD"];for(let Ue of ie){let ue=I(L[W[Ue].frameIx]);Ne.push(` ${ee(Ue)}["${us(ue,oe[Ue],H[Ue])}"]`)}for(let Ue of ie){let ue=me[Ue];if(ue!==-1&&ie.has(ue))Ne.push(` ${ee(ue)} --> ${ee(Ue)}`)}return`${Ne.join(`
|
|
18
|
-
`)}
|
|
19
|
-
`})}};var x=2;function nn(u){return Number.isFinite(u)?Number(u.toPrecision(6)):u}function $r(u){return{base:Math.round(u.baseBytes),cand:Math.round(u.candBytes),verdict:u.verdict,floor:Math.round(u.floorBytes)}}function Ut(u){return u.map((f)=>f.data?{code:f.code,data:f.data}:{code:f.code})}function _t(u,f){if(f?.entry?.group!==void 0)u.group=f.entry.group;if(f?.description!==void 0)u.description=f.description;if(f?.groupDescription!==void 0)u.groupDescription=f.groupDescription;if(f?.params!==void 0)u.params=f.params}function Cr(u){if(!u?.timing)return;let f={medianPct:nn(u.timing.medianDeltaPct),meanPct:nn(u.timing.meanDeltaPct),verdict:u.timing.verdict,pass:u.verdict==="pass",effectiveTimingPct:nn(u.thresholds.effectiveTimingPct),matched:!0};if(u.timing.ci95)f.ci95=[nn(u.timing.ci95[0]),nn(u.timing.ci95[1])];if(u.timing.pValue!==void 0)f.pValue=nn(u.timing.pValue);return f}function Sr(u,f,D,A,W,L){let j={event:"run",protocolVersion:x,schemaVersion:u.schemaVersion,workloadId:f.id,task:s(f,f.id),...D,batch:1,warnings:Ut(A)};if(_t(j,f),L!==void 0)j.noiseFloorPct=nn(L);let oe=Cr(W);if(oe)j.delta=oe;return j}function ds(u){let f=$n(u),D=u.environment?.noise.floorPct,A=(ue)=>({run:ue,workload:f.get(ue.workloadId)}),W=Gn(u).map(A),L=qn(W),j=[...W,...Yn(u).map(A)],oe=new Map((u.comparisons??[]).map((ue)=>[ue.candidateMeasurementId,ue])),H=Jn(u),me=new Map;for(let ue of u.measurements){if(ue.phase!=="cpu"||ue.warnings.length===0)continue;let le=me.get(ue.workloadId)??[];me.set(ue.workloadId,[...le,...ue.warnings])}let Q=(ue,le)=>[...ue.warnings,...me.get(ue.workloadId)??[],...H.get(ue.workloadId)?.warnings??[],...le?.warnings??[]],ie=Kn(u,j.map((ue)=>ue.run)).map((ue)=>Sr(u,ue,{skipped:!0},oe.get(ue.id)?.warnings??[],oe.get(ue.id),D)),ee=zn(u).flatMap((ue)=>{let le=f.get(ue.workloadId);if(!le)return[];let Ve=oe.get(ue.id);return Sr(u,le,{samples:0},Q(ue,Ve),Ve,D)}),Ne=j.map((ue)=>{let{run:le,workload:Ve}=ue,Ee=le.timing,_e=oe.get(le.id),je={event:"run",protocolVersion:x,schemaVersion:u.schemaVersion,workloadId:le.workloadId,task:s(Ve,le.workloadId),unit:"ns",samples:Ee.samples.length,batch:Ee.batch??1,mean:nn(Ee.mean),median:nn(Ee.median),stddev:nn(Ee.stddev),stddevPct:nn(Ee.mean===0?0:Ee.stddev/Ee.mean*100),min:nn(Ee.min),max:nn(Ee.max),warnings:Ut(Q(le,_e))};je.p75=nn(Ee.p75),je.p99=nn(Ee.p99),je.mad=nn(Ee.mad);let He=Z(le);if(He)je.userNs=nn(He.userNs),je.systemNs=nn(He.systemNs);let Tn=H.get(le.workloadId),Ge=Tn?.retained??le.paired?.retained?.candBytes;if(Ge!==void 0)je.retainedBytesPerOp=Math.round(Ge);let en=Tn?.peak??le.paired?.peak?.candBytes;if(en!==void 0)je.peakBytes=Math.round(en);_t(je,Ve);let cn=L?.get(ue);if(cn!==void 0)je.relative=nn(cn);if(Ve?.baseline)je.baseline=!0;if(D!==void 0)je.noiseFloorPct=nn(D);let Sn=Cr(_e);if(Sn)je.delta=Sn;let tn=le.paired;if(tn)je.paired={baseMedian:nn(tn.baseMedianNs),medianRatio:nn(tn.medianRatio),ratioP25:nn(tn.ratioP25),ratioP75:nn(tn.ratioP75),rounds:tn.rounds,verdict:tn.verdict,...tn.flagged&&{flagged:tn.flagged},...tn.confirmed!==void 0&&{confirmed:tn.confirmed},...tn.repeats&&{repeats:tn.repeats.map((Ye)=>nn(Ye.medianRatio))},sameOutput:tn.sameOutput,...tn.suiteChanged&&{suiteChanged:!0},...tn.retained&&{retained:$r(tn.retained)},...tn.peak&&{peak:$r(tn.peak)}};return je}),Ue=ht(u).map((ue)=>{let le=f.get(ue.workloadId),Ve={event:"run",protocolVersion:x,schemaVersion:u.schemaVersion,workloadId:ue.workloadId,task:s(le,ue.workloadId),batch:1,warnings:Ut(ue.warnings)};if(_t(Ve,le),D!==void 0)Ve.noiseFloorPct=nn(D);return Ve.threw=ue.threw,Ve});return[...Ne,...ee,...Ue,...ie]}function ls(u){if(!u.unmatched)return[];let f=(D,A)=>({event:"unmatched",protocolVersion:x,workloadId:D.id,task:s(D,D.id),side:A});return[...u.unmatched.baseOnly.map((D)=>f(D,"base")),...u.unmatched.candOnly.map((D)=>f(D,"cand"))]}function ps(u){return u===0?"pass":u===1?"fail":"error"}function fs(u,f){let D=f.command==="ab"&&u.ab?{...u.ab,effectiveTimingPct:u.ab.thresholdPct}:u.comparisonSummary,A=(f.unmatched?.baseOnly.length??0)+(f.unmatched?.candOnly.length??0),W={event:"summary",protocolVersion:x,command:f.command,matched:D?.matched??0,regressed:D?.regressed??0,improved:D?.improved??0,unchanged:D?.unchanged??0,unmatched:A,geomeanPct:D?.geomeanPct!==void 0?D.geomeanPct:null,effectiveTimingPct:nn(D?.effectiveTimingPct??0),verdict:ps(f.exitCode),exitCode:f.exitCode};if(f.command==="ci"){if(W.cached=f.cached??0,W.executed=f.executed??0,W.failed=f.failed??0,W.missingBaseline=f.missingBaseline??0,f.baseline)W.baseline=f.baseline}if(f.command==="ab"&&u.ab){if(W.base=u.ab.base,W.geomeanThresholdPct=u.ab.geomeanThresholdPct,W.unconfirmed=u.ab.unconfirmed,W.outputDiffers=u.ab.outputDiffers,u.ab.notComparable!==void 0)W.notComparable=u.ab.notComparable;if(u.ab.threw!==void 0)W.threw=u.ab.threw;if(u.ab.newSuites?.length)W.newSuites=u.ab.newSuites;if(u.ab.memory)W.memory=u.ab.memory}if(u.environment)W.noiseFloorPct=nn(u.environment.noise.floorPct);if(f.baseGit||f.candGit)W.git={...f.baseGit&&{base:f.baseGit},...f.candGit&&{cand:f.candGit}};if(f.exportedTo)W.exportedTo=f.exportedTo;return W}var vr={name:"minimal",async render(u,f={}){let D=[...ds(u)];if(f.protocol)D.push(...ls(f.protocol)),D.push(fs(u,f.protocol));let A=D.map((W)=>JSON.stringify(W));return{text:A.length>0?`${A.join(`
|
|
20
|
-
`)}
|
|
21
|
-
`:""}}};var gs="https://www.speedscope.app/file-format-schema.json",Ir={name:"speedscope",async render(u,f={}){let D=$n(u);return Vn(u,f,"speedscope.json",(A)=>{let{cpu:W}=A,{nodes:L}=W,j=Hn(W),oe=W.samples?.nodeIds??[],H=W.samples?.timeDeltasUs??[],me=Array(j.count);for(let Ue of j.order){let ue=j.parentIx[Ue],le=L[Ue].frameIx;me[Ue]=ue===-1?[le]:[...me[ue],le]}let Q=oe.map((Ue)=>{let ue=j.indexOf(Ue);return ue===-1?[]:me[ue]}),ie=D.get(A.workloadId),ee=ie?.label??ie?.command?.join(" ")??ie?.entry?.task??"profile",Ne={$schema:gs,exporter:"ostia",name:ee,activeProfileIndex:0,shared:{frames:W.frames.map((Ue)=>({name:I(Ue),file:Ue.url,line:Ue.line!==void 0?Ue.line+1:void 0}))},profiles:[{type:"sampled",name:ee,unit:"microseconds",startValue:0,endValue:H.reduce((Ue,ue)=>Ue+ue,0),samples:Q,weights:H}]};return`${JSON.stringify(Ne,null,2)}
|
|
22
|
-
`})}};var Or=5,Dr=5,hs=10;function jt(u,f){let D=(H)=>H.group!==void 0?" ":"",A=(H)=>kr(H.label,H.group),W=4;for(let H of f)W=Math.max(W,D(H).length+A(H).length);let L=`${"Task".padEnd(W)} ${u.map((H)=>H.header.padEnd(H.width)).join(" ")}`,j=[L,"-".repeat(L.length)],oe;for(let H of f){if(H.group!==void 0&&H.group!==oe)j.push(`${H.group}:`);oe=H.group;let me=D(H),Q=(me+A(H)).padEnd(W),ie=H.data;if(j.push(ie===void 0?`${Q} - ${H.status}`:`${Q} ${u.map((ee)=>ee.cell(ie).padEnd(ee.width)).join(" ")}`),H.warnings.length>0)j.push(`${me} ! ${H.warnings.map((ee)=>ee.code).join(", ")}`)}return j}function Nr(u){let f=u.flatMap((D)=>D.warnings.map((A)=>` ${D.label}: ${A.message}`));return f.length>0?["","Warnings:",...f]:[]}function Lt(u){return{text:`${u.map((f)=>f.trimEnd()).join(`
|
|
23
|
-
`)}
|
|
24
|
-
`}}var Er={name:"table",async render(u){let f=u.environment?[Re(u.environment),""]:[];if(u.ab)return Lt(ws(u,u.ab,f));let D=Gn(u),A=zn(u),W=ys(u);if(D.length===0&&A.length===0&&Kn(u,D).length===0)return W.length>0?Lt([...f,...W]):{text:`(no timing runs)
|
|
25
|
-
`};let L=[...f,...bs(u,D,A)],j=ks(u);if(j.length>0)L.push("",...j);if(W.length>0)L.push("",...W);return Lt(L)}};function bs(u,f,D){let A=Jn(u),W=new Map(f.map((ee)=>[ee.workloadId,ee])),L=new Map(D.map((ee)=>[ee.workloadId,ee])),j=[],oe=[];for(let ee of u.workloads){let Ne=W.get(ee.id),Ue=k(ee),ue=Wn(ee);if(Ne){let le={run:Ne,workload:ee};oe.push(le),j.push({label:Ue,group:ue,data:le,warnings:rt(Ne,A)})}else if(L.has(ee.id)){let le=rt(L.get(ee.id),A);j.push({label:Ue,group:ue,status:"no samples",warnings:le})}else if(ee.skipped)j.push({label:Ue,group:ue,status:"skipped",warnings:[]})}let H=({run:ee})=>B(ee.timing.median),me=new Map(oe.map((ee)=>[ee,Z(ee.run)])),Q=qn(oe),ie=[{header:"Median",width:10,cell:(ee)=>n(ee.run.timing.median,H(ee))},{header:"Spread",width:18,cell:(ee)=>Y(ee.run.timing.p75,ee.run.timing.p99,H(ee))},{header:"Range",width:18,cell:(ee)=>Y(ee.run.timing.min,ee.run.timing.max,H(ee))}];if([...me.values()].some(Boolean))ie.push({header:"User/Sys",width:18,cell:(ee)=>{let Ne=me.get(ee);return Ne?ve(Ne):""}});for(let ee of ft(A))ie.push({header:ee.header,width:Math.max(ee.header.length,hs),cell:(Ne)=>ee.cell(Ne.run.workloadId)??""});if(Q)ie.push({header:"Relative",width:8,cell:(ee)=>Se(Q.get(ee),!!ee.workload?.baseline)});return[...jt(ie,j),...Nr(j)]}function ws(u,f,D){let A=$n(u),W=[...D,`A/B: ${Rt(f)}`,""],L=[],j=yr(u).map(({kind:Q,run:ie})=>{let ee=A.get(ie.workloadId),Ne=s(ee,ie.workloadId),Ue;if(Q==="threw"){let ue=bt(ie.threw);L.push({label:Ne,verdict:ue,message:ie.threw.message}),Ue={base:"-",candidate:"-",change:"",spread:"",verdict:ue}}else Ue=yt(ie);return{label:Ne,group:Wn(ee),data:Ue,warnings:ie.warnings}});if(j.length>0)W.push(...jt([{header:"Base",width:10,cell:(Q)=>Q.base},{header:"Candidate",width:10,cell:(Q)=>Q.candidate},{header:"Change",width:9,cell:(Q)=>Q.change},{header:"p25\u2026p75",width:18,cell:(Q)=>Q.spread},{header:"Verdict",width:7,cell:(Q)=>Q.verdict}],j));let oe=kt(u);if(oe.length>0)W.push("","Memory:",...jt([{header:"Reading",width:11,cell:(Q)=>Q.reading},{header:"Base",width:10,cell:(Q)=>Q.base},{header:"Candidate",width:10,cell:(Q)=>Q.candidate},{header:"Change",width:18,cell:(Q)=>Q.change},{header:"Verdict",width:7,cell:(Q)=>Q.verdict}],oe.map((Q)=>{let ie=A.get(Q.run.workloadId);return{label:s(ie,Q.run.workloadId),group:Wn(ie),data:Pt(Q),warnings:[]}})));let H=xt(u);if(L.length>0){W.push("",`Threw (${L.length}):`);for(let Q of L){let[ie,...ee]=Q.message.split(`
|
|
26
|
-
`);W.push(` ${Q.label}: ${Q.verdict}: ${ie}`);for(let Ne of ee)W.push(` ${Ne}`)}}if(H.outputDiffers.length>0)W.push("",`Output differs from the base (${H.outputDiffers.length}):`,...H.outputDiffers.map((Q)=>` ${Q}`));let me=wt(f);if(me)W.push("",me);if(H.baseOnly.length>0||H.candOnly.length>0){if(W.push("","Unmatched:"),H.baseOnly.length>0)W.push(` base only: ${H.baseOnly.join(", ")}`);if(H.candOnly.length>0)W.push(` candidate only: ${H.candOnly.join(", ")}`)}return W.push(...Nr(j),"",Mt(f)),W}function ys(u){if(!u.comparisons||u.comparisons.length===0)return[];let f=[],D=dt(u),A=ut(u);if(A)f.push(`\u26A0 ${A.message}`,"");let W=[];for(let L of u.comparisons){let{workload:j,workloadId:oe}=D(L),H=s(j,oe);if(f.push(`${L.verdict==="pass"?"\u2713":"\u2717"} ${H}`),L.timing){let{medianDeltaPct:Q,ci95:ie,pValue:ee,verdict:Ne}=L.timing;if(ie&&ee!==void 0){let Ue=ee<0.001?"p<0.001":`p=${ee.toFixed(3)}`;f.push(` timing: ${r(Q)} median, 95% CI [${r(ie[0])}, ${r(ie[1])}], ${Ue} (${Ne})`)}else f.push(` timing: ${r(Q)} median (${Ne})`)}for(let Q of lt(L,Or))f.push(` frame ${Q.name}: ${r(Q.deltaPct)} self-time (${d(Q.baseSelfUs)}ms -> ${d(Q.candSelfUs)}ms)`);for(let Q of pt(L,Dr))f.push(` heap ${Q.type}: ${r(Q.deltaPct)} count (${Q.baseCount} -> ${Q.candCount})`);let me=ct(L);if(me.length>0){f.push(` ! ${me.map((Q)=>Q.code).join(", ")}`);for(let Q of me)W.push(` ${H}: ${Q.message}`)}}if(W.length>0)f.push("","Comparison warnings:",...W);return f}function ks(u){let f=$n(u),D=[];for(let A of u.measurements){if(A.phase!=="cpu"&&A.phase!=="heap")continue;let W=f.get(A.workloadId),L=s(W,A.workloadId);if(A.phase==="cpu")if(A.cpu){D.push(`CPU capture - ${L} (instrumented, ${A.cpu.samplingIntervalUs}\xB5s interval, ${X(A.cpu)} samples, diagnostic wall ${xe(A.diagnosticWallNs??0)}ms)`);for(let j of Te(A.cpu,Or))D.push(` ${j.pct.padStart(5)}% ${d(j.selfUs).padStart(8)}ms self ${j.frame?.name??"?"}`)}else D.push(`CPU capture - ${L} (instrumented, no evidence captured)`);else if(A.heap){D.push(`Heap snapshot - ${L} (instrumented, ${Me(A.heap)})`);for(let j of A.heap.typeCounts.slice(0,Dr))D.push(` ${String(j.count).padStart(6)} ${j.type}`)}else D.push(`Heap snapshot - ${L} (instrumented, no evidence captured)`);for(let j of A.artifacts)D.push(` artifact: ${j.path}`);for(let j of A.warnings)D.push(` ! ${j.message}`)}return D}var g={table:Er,json:fr,markdown:xr,jsonl:gr,minimal:vr,collapsed:lr,mermaid:Tr,speedscope:Ir,cpuprofile:pr};async function hn(u={}){let f=E();if(f.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let D=Bun.main,A;try{A=N(f,u.filter,D)}catch(L){throw Error(`run(): ${L.message}`)}let W=await de(D,A,u);if(!u.quiet){let L=u.format??"table",{text:j}=await g[L].render(W,{});if(j)process.stdout.write(j)}return W}function bn(u,f){let D=Object.keys(u),A=(W,L)=>{if(W===D.length){fn(L,()=>f(L));return}let j=D[W];for(let oe of u[j])A(W+1,{...L,[j]:oe})};A(0,{})}function Ps(u){return u.startsWith("file://")?u.slice(7):u}function Tt(u,f,D){let A=u.nodes,W=A.length,{frames:L,intern:j}=De(),oe=new Map,H=Array(W);for(let Ee=0;Ee<W;Ee++){let _e=A[Ee],je=_e.callFrame,He=j(je.functionName,Ps(je.url)||void 0,je.lineNumber>=0?je.lineNumber:void 0,je.columnNumber>=0?je.columnNumber:void 0);H[Ee]={id:_e.id,frameIx:He,children:_e.children??[]},oe.set(_e.id,Ee)}let me=new Float64Array(W),Q=new Float64Array(W),{samples:ie,timeDeltas:ee}=u;for(let Ee=0;Ee<ie.length;Ee++){let _e=oe.get(ie[Ee]);if(_e===void 0)continue;me[_e]+=ee[Ee]??0,Q[_e]+=1}let Ne=new Int32Array(W).fill(-1);for(let Ee=0;Ee<W;Ee++){let _e=A[Ee].children;if(!_e)continue;for(let je of _e){let He=oe.get(je);if(He!==void 0)Ne[He]=Ee}}let Ue=[],ue=[];for(let Ee=W-1;Ee>=0;Ee--)if(Ne[Ee]===-1)ue.push(Ee);while(ue.length>0){let Ee=ue.pop();Ue.push(Ee);let _e=A[Ee].children;if(!_e)continue;for(let je of _e){let He=oe.get(je);if(He!==void 0&&Ne[He]===Ee)ue.push(He)}}let le=new Float64Array(W);for(let Ee=Ue.length-1;Ee>=0;Ee--){let _e=Ue[Ee];le[_e]+=me[_e];let je=Ne[_e];if(je>=0)le[je]+=le[_e]}let Ve=new Map;for(let Ee=0;Ee<W;Ee++)Fe(Ve,H[Ee].frameIx,me[Ee],le[Ee],Q[Ee]);return{origin:f,samplingIntervalUs:D,frames:L,nodes:H,totals:Be(Ve),samples:{nodeIds:u.samples,timeDeltasUs:u.timeDeltas}}}async function Ar(u,f={}){let D=f.intervalUs??We,{Session:A}=await import("inspector/promises"),W=new A;W.connect();try{await W.post("Profiler.enable"),await W.post("Profiler.setSamplingInterval",{interval:D});let L=Bun.nanoseconds();await W.post("Profiler.start");let j=await u(),{profile:oe}=await W.post("Profiler.stop"),H=Bun.nanoseconds()-L,me=Tt(oe,"inspector",D);return{result:j,cpu:me,diagnosticWallNs:H}}finally{W.disconnect()}}function Rs(u){return u.replace(/[\s"']/g,"\\$&")}function Ms(u,f,D){let A=u[0];if(A&&/(^|[\\/])bun(\.exe)?$/.test(A))return{argv:[A,...f,...u.slice(1)],env:D};let W={...process.env,...D},L=f.map(Rs).join(" ");return{argv:u,env:{...W,BUN_OPTIONS:W.BUN_OPTIONS?`${W.BUN_OPTIONS} ${L}`:L}}}async function $t(u,f,D){let A=`${u.artifactDir}/${u.fileName}`,{argv:W,env:L}=Ms(u.argv,f,u.env),j=Bun.nanoseconds(),H=await Bun.spawn(W,{cwd:u.cwd,env:L,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,me=Bun.nanoseconds()-j,Q=Bun.file(A);if(!await Q.exists())return{diagnosticWallNs:me,exitCode:H,warnings:[{code:"artifact-missing",message:`Expected ${D.what} at ${A} after exit ${H}, found nothing. The workload's argv[0] must be a \`bun\` binary for ${D.kind} capture.`,data:{artifactPath:A,argv:u.argv}}]};return{diagnosticWallNs:me,exitCode:H,artifactPath:A,raw:await Q.json(),warnings:[]}}async function Fr(u){let{raw:f,...D}=await $t(u,["--cpu-prof","--cpu-prof-dir",u.artifactDir,"--cpu-prof-name",u.fileName,"--cpu-prof-interval",String(u.intervalUs)],{what:"a .cpuprofile",kind:"CPU"});if(!f)return D;if(f.samples.length===0)D.warnings.push({code:"empty-profile",message:"CPU capture produced zero samples."});return{...D,cpu:Tt(f,"cpu-prof",u.intervalUs)}}function Wr(u){let{node_fields:D,node_types:A}=u.snapshot.meta,W=D.indexOf("type"),L=D.indexOf("self_size"),j=D.length,oe=A[0];if(W===-1||L===-1||!Array.isArray(oe))return{origin:"heap-prof",typeCounts:[],objectCount:u.snapshot.node_count};let H=oe.length,me=Array(H),Q=new Map,ie=[],ee=(Ee)=>{let _e={type:Ee,count:0,bytes:0};return ie.push(_e),_e},Ne=0,Ue=u.nodes,ue=Ue.length;for(let Ee=0;Ee<ue;Ee+=j){let _e=Ue[Ee+W],je=Ue[Ee+L]??0;Ne+=je;let He;if(_e>=0&&_e<H)He=me[_e]??=ee(oe[_e]);else if(He=Q.get(_e),He===void 0)He=ee(`unknown(${_e})`),Q.set(_e,He);He.count++,He.bytes+=je}ie.sort((Ee,_e)=>_e.count-Ee.count);let le=ie.slice(0,20).map(({type:Ee,count:_e,bytes:je})=>({type:Ee,count:_e,retainedBytes:je})),Ve=ie.slice(20);if(Ve.length>0)le.push({type:"other",count:Ve.reduce((Ee,_e)=>Ee+_e.count,0),retainedBytes:Ve.reduce((Ee,_e)=>Ee+_e.bytes,0)});return{origin:"heap-prof",heapSizeBytes:Ne,objectCount:u.snapshot.node_count,typeCounts:le}}async function Br(u){let{raw:f,...D}=await $t(u,["--heap-prof","--heap-prof-dir",u.artifactDir,"--heap-prof-name",u.fileName],{what:"a heap snapshot",kind:"heap"});return f?{...D,heap:Wr(f)}:D}var St=1000;function re(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function he(u){_n("time",u);let f=i({samples:u.samples??null,budgetMs:u.budgetMs??null,minSamples:u.minSamples??null,warmup:u.warmup??null,cpu:u.cpu??!1,heap:u.heap??!1,cpuIntervalUs:u.cpuIntervalUs??St}),D=`${u.outDir??An}/artifacts`,A=u.noiseCheck===!1?void 0:ke(),W=A?Pe(A):void 0,L=[],j=[],oe=u.commands.map((ie)=>{let ee=typeof ie==="string"||Array.isArray(ie)?{command:ie}:ie,Ne=Array.isArray(ee.command)?ee.command:K(ee.command),Ue=ee.prepare??u.prepare,ue=ee.timeSource??u.timeSource,le=ae(Ne,ee.label??(Array.isArray(ee.command)?void 0:ee.command),{prepare:Ue,timeSource:ue});return{argv:Ne,workload:le,prepare:Ue,timeSource:ue,timeoutMs:ee.timeoutMs??u.timeoutMs,ignoreExitCodes:ee.ignoreExitCodes??u.ignoreExitCodes}}),H=(u.interleave??!0)&&oe.length>1,me=oe.map((ie)=>Nt({argv:ie.argv,cwd:u.cwd,env:u.env,samples:u.samples,budgetMs:u.budgetMs,minSamples:u.minSamples,warmup:u.warmup,prepare:ie.prepare,timeSource:ie.timeSource,timeoutMs:ie.timeoutMs,ignoreExitCodes:ie.ignoreExitCodes,signal:u.signal})),Q=async(ie)=>{let{argv:ee,workload:Ne,prepare:Ue}=oe[ie];L.push(Ne);let ue=me[ie].result(),le=U({workload:Ne,configFingerprint:f,trials:ue.trials,timing:ue.timing,warnings:W&&j.length===0?[...ue.warnings,W]:ue.warnings,interleaved:H?!0:void 0});if(j.push(le),!u.signal?.aborted)j.push(...await xs({workload:Ne,argv:ee,timingMeasurementId:le.id,cfgFp:f,opts:u,artifactDir:D,prepare:Ue}))};if(H){for(let ee of me)await ee.warmup();let ie=!0;while(ie){ie=!1;for(let ee of me)if(await ee.step())ie=!0}for(let ee=0;ee<oe.length;ee++)await Q(ee)}else for(let ie=0;ie<oe.length;ie++)await Et(me[ie]),await Q(ie);if(u.signal?.aborted&&j.length>0){let ie=j[j.length-1];ie.warnings=[...ie.warnings,re()]}return t(L,j,A)}async function xs({workload:u,argv:f,timingMeasurementId:D,cfgFp:A,opts:W,artifactDir:L,prepare:j}){let oe=[],H=async(Q)=>{if(j)await we(j,{phase:Q,index:0},{cwd:W.cwd,env:W.env})},me=(Q)=>({argv:f,cwd:W.cwd,env:W.env,artifactDir:L,fileName:`${D}-${Q}`});if(W.cpu){await H("cpu");let Q=await Fr({...me("cpu.cpuprofile"),intervalUs:W.cpuIntervalUs??St});oe.push(await Ur({workload:u,phase:"cpu",configFingerprint:A,artifactKind:"cpuprofile",...Q}))}if(W.heap){await H("heap");let Q=await Br(me("heap.heapsnapshot"));oe.push(await Ur({workload:u,phase:"heap",configFingerprint:A,artifactKind:"heapsnapshot",...Q}))}return oe}async function Ur({artifactPath:u,artifactKind:f,...D}){let A=y({...D,artifacts:[]});if(u)A.artifacts=[await dn(A.id,f,u)];return A}async function wn(u,f={}){if(f.name!==void 0&&(typeof f.name!=="string"||!f.name))throw TypeError("profile(): name must be a non-empty string");let D=ln(u,f.name),A=f.cpuIntervalUs??St,W=i({intervalUs:A,origin:f.origin??"inspector"}),L=(H,me)=>({result:H,measurement:me,document:t([D],[me])});if(f.signal?.aborted){let H=Bun.nanoseconds(),me=await u();return L(me,y({workload:D,phase:"cpu",configFingerprint:W,diagnosticWallNs:Bun.nanoseconds()-H,warnings:[re()],artifacts:[]}))}let j=f.origin==="jsc"?await Le(u,{intervalUs:A}):{...await Ar(u,{intervalUs:A}),jit:void 0},oe=j.cpu.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];return L(j.result,y({workload:D,phase:"cpu",configFingerprint:W,diagnosticWallNs:j.diagnosticWallNs,cpu:j.cpu,jit:j.jit,warnings:oe,artifacts:[]}))}function yn(u){return u}
|
|
27
|
-
export{P,Je,ze,pe,m,ne,on,C,Ke,sn,fe,F,G,V,an,ge,J,qe,te,z,re,he,gn,x,g,hn,bn,wn,yn};
|
package/chunk-jzfv4c07.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
function T(m){return m instanceof Error?m.message:String(m)}class l extends Error{}var Vn={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function B(m){let g=Math.abs(m);if(g>=1e9)return"s";if(g>=1e6)return"ms";if(g>=1000)return"\xB5s";return"ns"}function Kn(m){let g=Math.floor(Math.log10(Math.max(Math.abs(m),1)))+1;return Math.max(1,3-g)}function n(m,g=B(m)){let b=m/Vn[g];return`${b.toFixed(Kn(b))} ${g}`}function c(m){if(m.length===0)throw Error("computeTimingStats: samples must be non-empty");let g=m.length,b=w(m),x=0;for(let J=0;J<g;J++)x+=m[J];let P=x/g,F=o(b,0.5),O=0;for(let J=0;J<g;J++){let se=m[J]-P;O+=se*se}let G=Math.sqrt(O/g),C=b[0],H=b[g-1],j=o(b,0.25),ne=o(b,0.75),oe=ne-j,fe=j-1.5*oe,Q=ne+1.5*oe,te=j-3*oe,ee=ne+3*oe,re=0,ge=0;for(let J=0;J<g;J++){let se=m[J];if(se<te||se>ee)ge++;else if(se<fe||se>Q)re++}let je=o(b,0.99),V=new Float64Array(g);for(let J=0;J<g;J++)V[J]=Math.abs(m[J]-F);V.sort();let z=o(V,0.5);return{unit:"ns",samples:m,mean:P,median:F,stddev:G,min:C,max:H,outliers:{mild:re,severe:ge},p25:j,p75:ne,p99:je,mad:z}}function w(m){let g=new Float64Array(m.length);return g.set(m),g.sort(),g}function o(m,g){let b=m.length;if(b===1)return m[0];let x=g*(b-1),P=Math.floor(x),F=Math.ceil(x);if(P===F)return m[P];let O=x-P;return m[P]*(1-O)+m[F]*O}var zn=5000000;function ye(m,g,b="subprocess",x=[]){let P=[],F=m.samples[0];if(F!==void 0){let C=m.p75-m.p25;if(F>m.median+3*C&&F>2*m.median&&C>0)P.push({code:"slow-first-run",message:`First run took ${n(F)}, much slower than the median ${n(m.median)}. Consider more warmup.`,data:{firstNs:F,medianNs:m.median}})}if(b!=="inprocess"&&m.outliers.mild+m.outliers.severe>0)P.push({code:"outliers-detected",message:`${m.outliers.mild+m.outliers.severe} outlier(s) detected (${m.outliers.severe} severe, ${m.outliers.mild} mild).`,data:m.outliers});if(b==="subprocess"&&m.median<zn)P.push({code:"fast-command",message:`Median run time (${(m.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:m.median}});let O=new Set(x),G=g.filter((C)=>C!==void 0&&C!==0&&!O.has(C));if(G.length>0)P.push({code:"nonzero-exit",message:`${G.length} of ${g.length} trial(s) exited non-zero.`,data:{exitCodes:G}});return P}function M(m,g){return JSON.stringify(nn(m),null,g)}function nn(m){if(Array.isArray(m))return m.some((b)=>b!==null&&typeof b==="object")?m.map(nn):m;if(m!==null&&typeof m==="object"){let g=m,b={};for(let x of Object.keys(g).sort())b[x]=nn(g[x]);return b}return m}function e(m,...g){let b=Bun.CryptoHasher.hash("sha256",M(g),"hex");return`${m}_${b.slice(0,16)}`}import{rename as tt,rm as rt}from"fs/promises";import{isAbsolute as ot,relative as it}from"path";class rn extends Error{}var wn=new WeakMap;function yn(m){if(typeof m.pattern!=="string")return m.pattern;let g=wn.get(m);if(!g)g=new RegExp(m.pattern),wn.set(m,g);return g}function be(m){let g=yn(m);if(/[gyd]/.test(g.flags))throw RangeError("timeSource pattern must not use the g, y or d flag")}var qn={ns:1,us:1000,ms:1e6,s:1e9};function Ke(m,g){let b=m!==void 0?AbortSignal.timeout(m):void 0,x=b&&g?AbortSignal.any([b,g]):b??g;return{spawn:x?{signal:x,killSignal:"SIGKILL"}:{},timedOut:()=>b?.aborted??!1}}async function mn(m){let g=m.timeSource!==void 0,b=Bun.nanoseconds(),x=Ke(m.timeoutMs,m.signal),P=Bun.spawn(m.argv,{cwd:m.cwd,env:m.env,stdout:g?"pipe":"ignore",stderr:g?"pipe":"ignore",stdin:"ignore",...x.spawn}),F=g?Promise.all([new Response(P.stdout).text(),new Response(P.stderr).text()]):void 0,O=await P.exited,G=Bun.nanoseconds(),C=P.resourceUsage?.(),H=x.timedOut(),j={wallNs:G-b,exitCode:H?null:O,userNs:C?Number(C.cpuTime.user)*1000:void 0,systemNs:C?Number(C.cpuTime.system)*1000:void 0,maxRssBytes:C?.maxRSS,...H&&{timedOut:!0}};if(F){let[ne,oe]=await F;if(m.timeSource&&!H)try{j.reportedNs=Yn(m.timeSource,ne,oe,m.argv)}catch(fe){if(!(fe instanceof rn))throw fe;j.timeSourceNoMatch=!0,j.timeSourceMissOutput=Zn(ne,oe)}}return j}function Yn(m,g,b,x=[]){let P=yn(m),F=m.group??1,O=P.exec(g)??P.exec(b),G=x.length>0?` for "${x.join(" ")}"`:"";if(!O)throw new rn(`timeSource pattern ${P} did not match the output${G}. Output was:
|
|
3
|
-
${Tn(g,b)}`);let C=O[F];if(C===void 0)throw Error(`timeSource pattern ${P} matched${G} but has no capture group ${F} (matched text: "${O[0]}").`);let H=Number(C);if(!Number.isFinite(H))throw Error(`timeSource pattern ${P} group ${F} captured "${C}"${G}, which is not a number.`);return H*qn[m.unit??"ms"]}function Tn(m,g){let x=(F)=>F.length>800?`${F.slice(0,800)}\u2026(${F.length-800} more)`:F,P=[];if(m.trim())P.push(`--- stdout ---
|
|
4
|
-
${x(m.trimEnd())}`);if(g.trim())P.push(`--- stderr ---
|
|
5
|
-
${x(g.trimEnd())}`);return P.length>0?P.join(`
|
|
6
|
-
`):"(empty)"}var tn=2048;function Zn(m,g){let b=Tn(m,g);if(Buffer.byteLength(b,"utf8")<=tn)return b;let x=b.slice(0,tn);while(Buffer.byteLength(x,"utf8")>tn)x=x.slice(0,-1);return`${x}\u2026`}var Xn=1048576;async function Qn(m,g=Xn){let b=Math.floor(g/2),x=m.getReader(),P=[],F=0,O=[],G=0,C=0;try{for(;;){let{done:fe,value:Q}=await x.read();if(fe)break;if(!Q||Q.byteLength===0)continue;C+=Q.byteLength;let te=Q;if(F<b){let ee=b-F;if(te.byteLength<=ee){P.push(te),F+=te.byteLength;continue}P.push(te.subarray(0,ee)),F+=ee,te=te.subarray(ee)}O.push(te),G+=te.byteLength;while(G>b&&O.length>0){let ee=O[0],re=G-b;if(ee.byteLength<=re)O.shift(),G-=ee.byteLength;else O[0]=ee.subarray(re),G-=re}}}finally{x.releaseLock()}let H=new TextDecoder,j=H.decode(Buffer.concat(P));if(C<=F+G)return j;let ne=H.decode(Buffer.concat(O)),oe=C-F-G;return`${j}
|
|
7
|
-
\u2026(${oe} bytes elided)\u2026
|
|
8
|
-
${ne}`}async function we(m,g,b){if(typeof m==="function"){await m(g);return}let x=on(m),P=Ke(b.timeoutMs,b.signal),F=Bun.spawn(x,{cwd:b.cwd,env:b.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...P.spawn}),O=Qn(F.stderr).catch(()=>""),G=await F.exited,C=P.timedOut();if(!C&&b.signal?.aborted)return;if(!C&&G===0)return;let H=C?`timed out after ${b.timeoutMs}ms`:`exited with code ${G}`,j=(await O).trim();throw Error(`prepare command "${x.join(" ")}" ${H} before ${g.phase} trial ${g.index}.${j?`
|
|
9
|
-
${j}`:""}`)}function on(m){if(m===void 0||typeof m==="function")return;return Array.isArray(m)?m:K(m)}function Sn(m){if(m===void 0)return;return{pattern:typeof m.pattern==="string"?m.pattern:m.pattern.source,...m.group!==void 0&&{group:m.group},...m.unit!==void 0&&{unit:m.unit}}}function K(m){return m.trim().split(/\s+/).filter(Boolean)}var Mn={name:"ostia",version:"0.2.10",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 ie=Mn.version;var Rn;function sn(m){let g=Bun.spawnSync(["git",...m],{timeout:200,stdout:"pipe",stderr:"ignore"});return g.success?g.stdout.toString().trim():void 0}function nt(){try{let m=sn(["rev-parse","--short","HEAD"]);if(m===void 0)return;return{sha:m,branch:sn(["rev-parse","--abbrev-ref","HEAD"])??"HEAD",dirty:(sn(["status","--porcelain"])?.length??0)>0}}catch{return}}function vn(){return Rn??={git:nt()},Rn.git}function He(m){return Object.fromEntries(Object.entries(m).filter(([,g])=>g!==void 0))}function an(m,g,b){return e("run",m,g,b,Bun.version,ie)}function t(m,g,b){let x=vn();return{schemaVersion:2,toolVersion:ie,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:m,measurements:g,...He({environment:b,git:x})}}function ae(m,g,b={}){if(b.timeSource)be(b.timeSource);let x=on(b.prepare),P=Sn(b.timeSource),F=typeof b.prepare==="function"?b.prepare.toString():x;return{id:e("wl","subprocess",m,...F!==void 0||P!==void 0?[F??null,P??null]:[]),kind:"subprocess",command:m,label:g,...He({prepare:x,timeSource:P})}}function ln(m,g){return{id:g===void 0?e("wl","inprocess",m.name,m.toString()):e("wl","inprocess-named",g),kind:"inprocess",label:g}}function Nn(m,g,b={}){let x=ot(m)?it(process.cwd(),m):m,P=b.params!==void 0?e("wl","inprocess-entry",x,g,b.params):e("wl","inprocess-entry",x,g),{group:F,...O}=b;return{id:P,kind:"inprocess",entry:{file:m,task:g,...He({group:F})},...He(O)}}function U(m){return{id:an(m.workload.id,"timing",m.configFingerprint),workloadId:m.workload.id,phase:"timing",instrumented:!1,configFingerprint:m.configFingerprint,trials:m.trials,timing:m.timing,warnings:m.warnings,artifacts:[],memory:st(m.trials),...He({interleaved:m.interleaved})}}function st(m){let g=m.map((b)=>b.maxRssBytes).filter((b)=>b!==void 0);if(g.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...g)}}function y(m){return{id:an(m.workload.id,m.phase,m.configFingerprint),workloadId:m.workload.id,phase:m.phase,instrumented:!0,configFingerprint:m.configFingerprint,trials:[{i:0,wallNs:m.diagnosticWallNs,exitCode:m.exitCode}],diagnosticWallNs:m.diagnosticWallNs,cpu:m.cpu,heap:m.heap,memory:m.memory,jit:m.jit,warnings:m.warnings,artifacts:m.artifacts}}function Ye(m){return{id:an(m.workload.id,"paired",m.configFingerprint),workloadId:m.workload.id,phase:"paired",instrumented:!1,configFingerprint:m.configFingerprint,trials:[],..."threw"in m?{threw:m.threw}:{timing:m.timing,paired:m.paired},diagnosticWallNs:m.diagnosticWallNs,warnings:m.warnings,artifacts:[]}}async function dn(m,g,b){let x=await Bun.file(b).arrayBuffer();return{id:e("art",m,g,b),kind:g,path:b,sha256:Bun.CryptoHasher.hash("sha256",x,"hex"),bytes:x.byteLength}}function i(m){return e("cfg",m)}function q(m){return`${M(m,2)}
|
|
10
|
-
`}async function Ze(m,g){let b=`${g}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;try{await Bun.write(b,m),await tt(b,g)}catch(x){throw await rt(b,{force:!0}),x}}async function u(m,g){await Ze(q(m),g)}class A extends Error{code;path;schemaVersion;constructor(m,g,b={}){super(g);this.name="OstiaDocumentError",this.code=m,this.path=b.path,this.schemaVersion=b.schemaVersion}}async function a(m){let g=await Bun.file(m).text(),b;try{b=JSON.parse(g)}catch(P){let F=T(P);throw new A("invalid-json",`${m}: invalid JSON (${F})`,{path:m})}let x=b!==null&&typeof b==="object"?b.schemaVersion:void 0;if(typeof x!=="number")throw new A("not-a-document",`${m}: not a ProfileDocument (missing schemaVersion)`,{path:m});if(x!==2)throw new A("unsupported-schema",`${m}: unsupported ProfileDocument schemaVersion ${x} (this ostia reads 2)`,{path:m,schemaVersion:x});return at(b,m),ut(ct(b))}var En=(m)=>typeof m==="object"&&m!==null&&!Array.isArray(m);function at(m,g){let b=(x)=>new A("not-a-document",`${g}: malformed document: ${x}`,{path:g});if(!Array.isArray(m.workloads))throw b('"workloads" must be an array');if(!Array.isArray(m.measurements))throw b('"measurements" must be an array');m.workloads.forEach((x,P)=>{if(!En(x)||typeof x.id!=="string")throw b(`workloads[${P}] must be an object with a string "id"`)}),m.measurements.forEach((x,P)=>{if(!En(x)||typeof x.id!=="string"||typeof x.workloadId!=="string"||typeof x.phase!=="string")throw b(`measurements[${P}] must be an object with string "id", "workloadId" and "phase"`);for(let F of["trials","warnings","artifacts"])if(!Array.isArray(x[F]))throw b(`measurements[${P}].${F} must be an array`)})}function ut(m){let g=(b)=>{if(b.ratioP25!==void 0||b.p25===void 0)return;b.ratioP25=b.p25,b.ratioP75=b.p75,delete b.p25,delete b.p75};for(let b of m.measurements){if(!b.paired)continue;g(b.paired);for(let x of b.paired.repeats??[])g(x)}return m}function ct(m){for(let g of m.measurements){let b=g.timing;if(!b||b.mad!==void 0||b.samples.length===0)continue;g.timing={...c(b.samples),...b.batch!==void 0&&{batch:b.batch}}}return m}function Y(m,g,b){return`${n(m,b)}\u2026${n(g,b)}`}function xe(m){return(m/1e6).toFixed(3)}function d(m){return(m/1000).toFixed(2)}function R(m){if(m<1024)return`${m.toFixed(0)}B`;if(m<1048576)return`${(m/1024).toFixed(2)}KiB`;return`${(m/1048576).toFixed(2)}MiB`}function I(m){return m?.name||"(anonymous)"}function Te(m,g){let b=m.totals.reduce((x,P)=>x+P.selfUs,0)||1;return m.totals.slice(0,g).map((x)=>({frame:m.frames[x.frameIx],selfUs:x.selfUs,totalUs:x.totalUs,pct:(x.selfUs/b*100).toFixed(1)}))}function Me(m){return`${m.objectCount??"?"} objects, ${R(m.heapSizeBytes??0)}`}function Re(m){return`${m.cpuModel} \xB7 ${m.cores} cores \xB7 load ${m.loadAvg1.toFixed(1)} \xB7 noise floor ${m.noise.floorPct.toFixed(1)}%`}function _(m){return`${m.sha} (${m.branch}${m.dirty?", dirty":""})`}function k(m){return m.label??m.command?.join(" ")??m.entry?.task??m.id}function s(m,g){return m?k(m):g}function Se(m,g){if(m===1)return g?"1.00\xD7 (baseline)":"1.00\xD7";if(m>1)return`${m.toFixed(2)}\xD7 slower`;return`${(1/m).toFixed(2)}\xD7 faster`}function pn(m){return m.replace(/\|/g,"\\|").replace(/</g,"<").replace(/>/g,">").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function Z(m){let g=[],b=[];for(let x of m.trials){if(x.timedOut||x.timeSourceNoMatch)continue;if(x.userNs===void 0||x.systemNs===void 0)continue;g.push(x.userNs),b.push(x.systemNs)}if(g.length===0)return;return{userNs:o(w(g),0.5),systemNs:o(w(b),0.5)}}function ve(m){return`${n(m.userNs)}/${n(m.systemNs)}`}function r(m){let g=m.toFixed(1);if(Number(g)===0)return"0.0%";return`${m>0?"+":""}${g}%`}import{statSync as ft}from"fs";import{rm as gt}from"fs/promises";import{isAbsolute as bt}from"path";import un from"os";var mt=200,Fn=64,lt=(()=>{let m=new Uint8Array(4096);for(let g=0;g<m.length;g++)m[g]=g*2654435761&255;return m})();function pt(m,g){let b=g;for(let x=0;x<m.length;x++)b^=m[x],b=Math.imul(b,16777619);return b>>>0}function dt(m){let g=c(m);return{floorPct:g.median===0?0:g.mad/g.median*100,referenceMedianNs:g.median,samples:m.length}}function An(m=mt){let g=m*1e6,b=[],x=0,P=Bun.nanoseconds();while(Bun.nanoseconds()-P<g){let F=Bun.nanoseconds();for(let O=0;O<Fn;O++)x^=pt(lt,O);b.push((Bun.nanoseconds()-F)/Fn)}return dt(b)}var $n=0.75;function ke(){let[m=0,g=0]=un.loadavg();return{cpuModel:un.cpus()[0]?.model??"unknown",cores:un.availableParallelism(),loadAvg1:m,loadAvg5:g,noise:An()}}function Pe(m){if(m.loadAvg1<=m.cores*$n)return;return{code:"noisy-machine",message:`Load average ${m.loadAvg1.toFixed(2)} exceeds ${$n*100}% of ${m.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:m.loadAvg1,cores:m.cores}}}function S(m,g){return bt(g)?g:`${m}/${g}`}class In extends l{}function $e(m,g){if(!ft(g,{throwIfNoEntry:!1})?.isFile())throw new In(`Suite not found: ${m}`)}function Ce(m,g){return`${m}/${g}-tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`}function p(m){return o(Float64Array.from(m).sort(),0.5)}function h(m){return gt(m,{recursive:!0,force:!0})}async function Xe(m){return await Bun.file(m).exists()?a(m):void 0}var ce=3,ht=16777216;function Oe(m){let g=p(m.map((x)=>x.peakBytes)),b=Math.max(...m.map((x)=>x.slackBytes));if(b<ht||b<=g/4)return;return{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${R(b)} 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:b,processes:m.length}}}function v(m){let g=m===!1?void 0:ke();return{environment:g,noiseWarning:g&&Pe(g)}}function Ae(m,g,b){let x=m[0],P=m[m.length-1];if(!x||!P)return;if(g)x.warnings.push(g);if(b)P.warnings.push({code:"aborted",message:b})}async function Ie(m,g){let b=Ke(g.timeoutMs,g.signal),x=Bun.spawn(m,{cwd:g.cwd,...g.env&&{env:{...process.env,...g.env}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...g.ipc&&{ipc:g.ipc},...b.spawn});g.inFlight?.add(x);let P;try{P=await x.exited}finally{g.inFlight?.delete(x)}if(g.signal?.aborted)return!1;if(b.timedOut())throw Error(`${g.label} timed out after ${g.timeoutMs}ms: ${g.name}`);if(P!==0){let F=g.errorFile&&Bun.file(g.errorFile);throw Error(F&&await F.exists()?`${g.label} failed: ${g.name}: ${await F.text()}`:`${g.label} failed: ${g.name} (runner exited ${P})`)}return!0}var bn=[],pe,Ge;function cn(m,g,b,x){let P=pe,F=P?`${P.path}/${m}`:m;pe={path:F,chain:[...P?.chain??[],{path:F,before:b?.before,after:b?.after}],description:b?.description??P?.description,isolate:b?.isolate??P?.isolate,gc:b?.gc??P?.gc,cpu:b?.cpu??P?.cpu,alloc:b?.alloc??P?.alloc,peakMem:b?.peakMem??P?.peakMem,skip:x.skip||P?.skip,only:x.only||P?.only};try{g()}finally{pe=P}}var kn=Object.assign((m,g,b)=>cn(m,g,b,{}),{skip:(m,g,b)=>cn(m,g,b,{skip:!0}),only:(m,g,b)=>cn(m,g,b,{only:!0})});function gn(m,g,b,x){let P=Ge!==void 0||b?.params!==void 0?{...Ge,...b?.params}:void 0;bn.push({groupName:pe?.path,groupChain:pe?.chain,groupDescription:pe?.description,groupIsolate:pe?.isolate,groupGc:pe?.gc,groupCpu:pe?.cpu,groupAlloc:pe?.alloc,groupPeakMem:pe?.peakMem,name:m,fn:g,baseline:b?.baseline,params:P,skipped:x.skip||pe?.skip,only:x.only||pe?.only,opts:b})}var Pn=Object.assign((m,g,b)=>gn(m,g,b,{}),{skip:(m,g,b)=>gn(m,g,b,{skip:!0}),only:(m,g,b)=>gn(m,g,b,{only:!0})});function E(){return bn}function ue(){bn.length=0,pe=void 0,Ge=void 0}function fn(m,g){let b=Ge;Ge=m;try{return g()}finally{Ge=b}}function L(m){return m.groupName?`${m.groupName}/${m.name}`:m.name}function Qe(m,g){return m.opts?.isolate??m.groupIsolate??g}function On(m,g){return m.opts?.gc??m.groupGc??g}function Bn(m,g){return m.opts?.cpu??m.groupCpu??g}function Ue(m,g){return m.opts?.alloc??m.groupAlloc??g}function me(m,g){return m.opts?.peakMem??m.groupPeakMem??g}function _e(m){let g=new Map,b=new Map;return m.forEach((x,P)=>{if(x.skipped)return;for(let{path:F}of x.groupChain??[]){if(!g.has(F))g.set(F,P);b.set(F,P)}}),(x)=>{let P=(m[x].groupChain??[]).map((F)=>F.path);return{enter:P.filter((F)=>g.get(F)===x),leave:P.filter((F)=>b.get(F)===x).reverse()}}}async function f(m,g,b){let x=m.groupChain??[],P=b??(g==="before"?x:[...x].reverse()).map((F)=>F.path);for(let F of P)await x.find((O)=>O.path===F)?.[g]?.()}function en(m,g){if(!g)return[...m];let b=new RegExp(g);return m.filter((x)=>b.test(L(x)))}function N(m,g,b,x=!0){let P=m.filter((G)=>G.only),F=P.length>0?P:m;if(x&&P.length>0)process.stderr.write(`bench: ${P.length} task(s) selected by .only
|
|
11
|
-
`);let O=en(F,g);if(O.length===0)throw Error(`filter ${JSON.stringify(g)} matched zero of ${F.length} registered task(s) in ${b}.`);return O}import{heapStats as Cn}from"bun:jsc";function W(m){return m!==null&&typeof m==="object"&&typeof m.then==="function"}var kt=(async()=>{}).constructor,wt=0,Un=256;function Ee(m,g){let b=`/* ostia task loop ${wt++} */
|
|
12
|
-
const t0 = Bun.nanoseconds()
|
|
13
|
-
for (let b = 0; b < n; b++) sink[b & ${Un-1}] = ${g?"await ":""}fn()
|
|
14
|
-
return Bun.nanoseconds() - t0`,x=(g?kt:Function)("fn","sink","n",b),P=Array(Un);return(F)=>x(m,P,F)}async function Ne(m){let g=Bun.nanoseconds(),b=m(),x=W(b),P=x?await b:b;return{isAsync:x,result:P,ns:Math.max(1,Bun.nanoseconds()-g)}}var yt=100,xt=1000;async function le(m,g=yt,b=xt){let x=Bun.nanoseconds();Bun.gc(!0);let P=Cn().heapSize,F=Bun.nanoseconds()+b*1e6,O=0;while(O<g&&(O===0||Bun.nanoseconds()<F)){let H=m();if(W(H))await H;O++}Bun.gc(!0);let G=Cn().heapSize,C=Bun.nanoseconds()-x;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(G-P)/O)},calls:O,diagnosticWallNs:C}}var Tt=500,St=20,_n=3,Mt=10,Rt=2,vt=0.1,Pt=1000,Wn=1e4,Et=2*Wn,Nt=1e6,Ft=5;function Ln(m){let g=Math.log10(Math.max(1,m)/1e6),b=Math.round(_n+Rt*g);return Math.min(Mt,Math.max(_n,b))}function At(m,g){let b=Math.floor(g/m);return Math.min(St,Math.max(b,Ln(m)))}var $t;function xn(m){$t=m}function Dn(m,g){return Math.max(1,Math.ceil(Pt/m),Math.ceil(g/(m*Wn)))}function It(m){let g=[...m].sort((b,x)=>b-x);return g[g.length>>1]}async function Gn(m,g={}){let b=(g.budgetMs??Tt)*1e6,x=b*(g.warmup??vt),P=await Ne(m),F=P.ns,O=Ee(m,P.isAsync),G=Bun.nanoseconds(),C=1;while(Bun.nanoseconds()-G<x){let z=await O(C);if(F=Math.max(1,z/C),z<Nt)C*=2}let H=Dn(F,b);if(H>1){let z=[];for(let J=0;J<Ft;J++)z.push(await O(H)/H);F=Math.max(1,It(z)),H=Dn(F,b)}let j=F*H,ne=g.samples??g.minSamples??At(j,b),oe=g.samples!==void 0?0:b,fe=g.samples??Math.max(Et,ne),Q=[],te=Bun.nanoseconds(),ee=0,re=0;while(re<ne||ee<oe&&re<fe){let z=await O(H);if(Q.push({i:re,wallNs:z/H}),re++,ee=Bun.nanoseconds()-te,g.gc)Bun.gc(!0)}let ge=c(Q.map((z)=>z.wallNs));if(H>1)ge.batch=H;let je=ye(ge,[],"inprocess"),V=Ln(j);if(Q.length<V)je.push({code:"low-sample-count",message:`Only ${Q.length} sample(s) at ~${n(j)} per trial; ${V} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:Q.length,target:V,trialCostNs:j}});return{trials:Q,timing:ge,warnings:je}}import{profile as Bt}from"bun:jsc";var We=1000;function De(){let m=new Map,g=[];return{frames:g,intern(b,x,P,F){let O=m.get(b);if(O===void 0)O=new Map,m.set(b,O);let G=x??"",C=O.get(G);if(C===void 0)C=g.length,O.set(G,C),g.push({key:e("fr",b,G),name:b,url:x,line:P,col:F});return C}}}function Fe(m,g,b,x,P){let F=m.get(g);if(F)F.selfUs+=b,F.totalUs+=x,F.samples+=P;else m.set(g,{frameIx:g,selfUs:b,totalUs:x,samples:P})}function Be(m){return[...m.values()].sort((g,b)=>b.selfUs-g.selfUs)}var Ot=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),jn=4294967295;function Hn(m,g){let b=g??m.interval*1e6,{frames:x,intern:P}=De();function F(V){let z=V.line===jn,J=z?void 0:V.line-1,se=z||V.column===jn?void 0:V.column-1;return P(V.name,V.sourceURL,J,se)}let O=[];function G(V){let z={id:O.length,frameIx:V,children:new Map,selfUs:0,samples:0,totalUs:0};return O.push(z),z}let C=G(P("(root)",void 0,void 0,void 0)),H={llint:0,baseline:0,dfg:0,ftl:0},j=new Map,ne=[],oe=[];for(let V of m.traces){let z=V.frames,J=C;for(let he=z.length-1;he>=0;he--){let qe=F(z[he]),Ve=J.children.get(qe);if(!Ve)Ve=G(qe),J.children.set(qe,Ve);J=Ve}J.selfUs+=b,J.samples+=1,ne.push(J.id),oe.push(b);let se=z[0],Je=se&&Ot.get(se.category);if(Je){H[Je]++;let he=j.get(Je)??new Map;he.set(J.frameIx,(he.get(J.frameIx)??0)+1),j.set(Je,he)}}function fe(V){let z=V.selfUs;for(let J of V.children.values())z+=fe(J);return V.totalUs=z,z}fe(C);let Q=new Map;function te(V){Fe(Q,V.frameIx,V.selfUs,V.totalUs,V.samples);for(let z of V.children.values())te(z)}te(C);let ee=O.map((V)=>({id:V.id,frameIx:V.frameIx,children:[...V.children.values()].map((z)=>z.id)})),re={origin:"jsc-profile",samplingIntervalUs:b,frames:x,nodes:ee,totals:Be(Q),samples:{nodeIds:ne,timeDeltasUs:oe}},ge=[...j.entries()].flatMap(([V,z])=>[...z.entries()].sort((J,se)=>se[1]-J[1]).slice(0,3).map(([J,se])=>({tier:V,frameKey:x[J].key,samples:se})));return{cpu:re,jit:{origin:"jsc-profile",tiers:H,topFramesByTier:ge}}}async function Le(m,g={}){let b=g.intervalUs??We,x,P=Bun.nanoseconds(),F=await Bt(async()=>(x=await m(),x),b),O=Bun.nanoseconds()-P,{cpu:G,jit:C}=Hn(F.stackTraces,b);return{result:x,cpu:G,jit:C,diagnosticWallNs:O}}function X(m){return m.samples?.nodeIds.length??m.totals.reduce((g,b)=>g+b.samples,0)}var hn=100,ze=2000,Ut=2,Ct=200,_t=1e4,Dt=ze/2,Wt=20;function Lt(m){let g=ze*Ut*m/1000;return Math.min(_t,Math.max(Ct,g))}async function Jn(m,g={}){let b=g.intervalUs??hn,x=Lt(b)*1e6,P=async()=>{let H=Bun.nanoseconds();do{let j=m();if(W(j))await j}while(Bun.nanoseconds()-H<x)},{cpu:F,jit:O,diagnosticWallNs:G}=await Le(P,{intervalUs:b}),C=[Gt(F),jt(O)].filter((H)=>H!==void 0);return{cpu:F,jit:O,diagnosticWallNs:G,warnings:C}}function Gt(m){let g=X(m);if(g>=Dt)return;return{code:"low-sample-count",message:`Only ${g} CPU sample(s) at ${m.samplingIntervalUs}\xB5s (target ${ze}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:g,target:ze,intervalUs:m.samplingIntervalUs}}}function jt(m){let{llint:g,baseline:b,dfg:x,ftl:P}=m.tiers,F=g+b+x+P;if(F===0)return;let O=g/F*100,G=b/F*100,C=x/F*100,H=P/F*100;if(O+G<=Wt)return;return{code:"jit-cold",message:`${(O+G).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:O,baselinePct:G,dfgPct:C,ftlPct:H}}}function D(m,g,b){let x=L(g);return Nn(m,x,{label:x,baseline:g.baseline,group:g.groupName,description:g.opts?.description,groupDescription:g.groupDescription,isolated:b,params:g.params,skipped:g.skipped})}async function de(m,g,b){let x=g.some((H)=>!H.skipped),{environment:P,noiseWarning:F}=v(x?b.noiseCheck:!1),O=_e(g),G=[],C=[];for(let H=0;H<g.length;H++){let j=g[H],ne=D(m,j,b.markIsolated);if(G.push(ne),j.skipped)continue;let{enter:oe,leave:fe}=O(H);if(await f(j,"before",oe),j.opts?.before)await j.opts.before();let Q={budgetMs:j.opts?.budgetMs??b.budgetMs,samples:j.opts?.samples??b.samples,minSamples:j.opts?.minSamples??b.minSamples,warmup:b.warmup,gc:On(j,b.gc??!1)},te=await Gn(j.fn,Q);if(C.push(U({workload:ne,configFingerprint:i({budgetMs:Q.budgetMs??null,samples:Q.samples??null,minSamples:Q.minSamples??null,gc:Q.gc??!1}),trials:te.trials,timing:te.timing,warnings:F&&C.length===0?[...te.warnings,F]:te.warnings})),Bn(j,b.cpu??!1)){let ee=b.cpuIntervalUs??hn,re=await Jn(j.fn,{intervalUs:ee});C.push(y({workload:ne,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:ee}),diagnosticWallNs:re.diagnosticWallNs,cpu:re.cpu,jit:re.jit,warnings:re.warnings,artifacts:[]}))}if(Ue(j,b.alloc??!1)){let ee=await le(j.fn);C.push(y({workload:ne,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:ee.diagnosticWallNs,memory:ee.memory,warnings:[],artifacts:[]}))}if(j.opts?.after)await j.opts.after();await f(j,"after",fe)}return t(G,C,P)}
|
|
15
|
-
export{T,l,be,mn,we,K,B,n,c,w,o,ye,ie,M,e,t,ae,ln,U,y,Ye,dn,i,q,Ze,u,A,a,ke,Pe,Y,xe,d,R,I,Te,Me,Re,_,k,s,Se,pn,Z,ve,r,S,$e,Ce,p,h,Xe,ce,Oe,v,Ae,Ie,W,Ee,Ne,De,Fe,Be,kn,Pn,E,ue,fn,L,Qe,Ue,me,_e,f,en,N,X,le,We,Le,xn,D,de};
|
package/chunk-rhk7gwaa.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{T,l,K,ie,e,t,ae,U,i,q,Ze,u,A,a,_,k,r,v}from"./chunk-jzfv4c07.js";import{P,Je,ze,pe,m,ne,on,C,Ke,sn,fe,F,G,V,an,ge,J,qe,te,z,re,he,x,g}from"./chunk-jvjh4223.js";import{nn,je,He,Ge,Ve,tn,Q,rn}from"./chunk-qwhvzj0v.js";import{b}from"./chunk-zf3y6chk.js";import{writeSync as Ee}from"fs";import{resolve as kn}from"path";function Re(o){return e("cache",o.workloadId,o.phase,o.configFingerprint,o.bunVersion,o.toolVersion,o.instrumented,o.inputsDigest??null)}var yn=32;async function Ne(o,n=process.cwd()){if(o.length===0)return;let s=await J(o,n),c=Array(s.length),d=0,p=async()=>{while(d<s.length){let y=d++,f=s[y],w=await Bun.file(kn(n,f)).arrayBuffer();c[y]={path:f,sha256:Bun.CryptoHasher.hash("sha256",w,"hex")}}};return await Promise.all(Array.from({length:Math.min(yn,s.length)},p)),e("inputs",c)}function De(o,n){return`${o}/cache/${n}.json`}async function Ie(o,n){try{return await Bun.file(De(o,n)).json()}catch{return}}async function Be(o,n,s){await Bun.write(De(o,n),`${JSON.stringify(s,null,2)}
|
|
3
|
-
`)}var _e=600000;class me extends l{}class be extends me{path;constructor(o){super(`No baseline document at ${o}. Create one with: ostia baseline save ${o.split("/").pop().replace(/\.json$/,"")}`);this.path=o}}class Le extends me{path;missing;total;constructor(o,n,s){super(`${n} of ${s} configured workload(s) have no matching row in baseline ${o} (by workload id). Re-seed with: ostia baseline save`);this.path=o;this.missing=n;this.total=s}}async function xn(o,n,s,c){let d=await J(n.suites,process.cwd());if(d.length===0)throw new l(`Workload suites ${JSON.stringify(n.suites)} matched no files.`);let p=await te({suites:d,preload:[],bunFlags:[],noiseCheck:!1},o.bench),y=await z({...p,outDir:p.outDir??o.outDir,timeoutMs:n.timeoutMs??p.timeoutMs??_e,signal:c}),f=[];for(let w of y.workloads){let S=y.measurements.find((O)=>O.workloadId===w.id&&O.phase==="timing");if(!S)continue;if(s)S.warnings.push(s);f.push({workload:w,status:"executed",run:S,harnessFailed:!1})}return f}async function $n(o,n,s,c,d){let p=ae(n.command,n.label,{prepare:n.prepare,timeSource:n.timeSource}),y=i({samples:o.samples??null,budgetMs:o.budgetMs??null,minSamples:o.minSamples??null,warmup:o.warmup}),f=n.inputs!==void 0&&typeof n.prepare!=="function",w=Re({workloadId:p.id,phase:"timing",configFingerprint:y,bunVersion:Bun.version,toolVersion:ie,instrumented:!1,inputsDigest:await Ne(n.inputs??[])}),S=s||!f?void 0:await Ie(o.outDir,w),O;if(S)O=S;else{let R=await sn({argv:n.command,samples:o.samples,budgetMs:o.budgetMs,minSamples:o.minSamples,warmup:o.warmup,prepare:n.prepare,timeSource:n.timeSource,timeoutMs:n.timeoutMs??_e,ignoreExitCodes:n.ignoreExitCodes,signal:d});if(O=U({workload:p,configFingerprint:y,trials:R.trials,timing:R.timing,warnings:c?[...R.warnings,c]:R.warnings}),f&&!d?.aborted)await Be(o.outDir,w,O)}return{workload:p,status:S?"cached":"executed",run:O,harnessFailed:fe(O,n.ignoreExitCodes)}}async function Se(o,n,s){let{environment:c,noiseWarning:d}=v(o.noiseCheck),p=[];for(let w of o.workloads){if(s?.aborted)break;if(w.suites)p.push(...await xn(o,w,d,s));else p.push(await $n(o,w,n,d,s))}let y=s?.aborted??!1,f=p.at(-1)?.run;if(y&&f&&!f.warnings.some((w)=>w.code==="aborted"))f.warnings=[...f.warnings,re()];return{results:p,environment:c,aborted:y}}async function Ue(o){let{config:n}=o,s=C(n,o.baselineName);if(!await Bun.file(s).exists())throw new be(s);let c=await a(s),{results:d,environment:p,aborted:y}=await Se(n,o.full,o.signal),f=d.map((E)=>({...E})),w=f.filter((E)=>E.status==="executed").length,S=t(f.map((E)=>E.workload),f.map((E)=>E.run),p);if(y)return{document:S,summary:{total:f.length,cached:f.length-w,executed:w,passed:0,regressed:0,missingBaseline:0,failed:0,results:f,unmatched:{baseOnly:[],candOnly:[]}},baseline:c,aborted:y};let O=Je(c,S,n.thresholds),R=[];for(let E of f){let ce=O.compare(E.workload.id);if(ce)E.comparison=ce,R.push(ce)}let N=f.length-R.length,M=R.filter((E)=>E.verdict==="pass").length,I=n.onMissingBaseline??(N===f.length?"fail":"warn");if(N>0&&I==="fail")throw new Le(s,N,f.length);let B=O.unmatched();return S.comparisons=R,S.unmatched={baseOnly:B.baseOnly.map((E)=>E.id),candOnly:B.candOnly.map((E)=>E.id)},S.comparisonSummary=ze(R,O.effectiveTimingPct),{document:S,summary:{total:f.length,cached:f.length-w,executed:w,passed:M,regressed:R.length-M,missingBaseline:N,failed:f.filter((E)=>E.harnessFailed).length,results:f,unmatched:B},baseline:c,aborted:!1}}function We(o){let n=[`${o.total} workloads`,`${o.cached} cached`,`${o.executed} executed`];if(o.missingBaseline>0)n.push(`${o.missingBaseline} skipped (no matching baseline workload)`);if(o.failed>0){let c=o.results.filter((d)=>d.harnessFailed).map((d)=>k(d.workload));n.push(`${o.failed} failed (harness error, a command exited non-zero or produced no samples: ${c.join(", ")})`)}let s=o.results.filter((c)=>c.comparison?.verdict==="fail").map((c)=>{let d=c.comparison.timing,p=k(c.workload);return d?`${r(d.medianDeltaPct)} median on ${p}`:p});return n.push(`${o.passed} passed ${o.regressed} regressed${s.length>0?` (${s.join(", ")})`:""}`,"",`Profile CI: ${o.regressed>0||o.failed>0?"\u2717":"\u2713"}`),`${n.join(`
|
|
4
|
-
`)}
|
|
5
|
-
`}async function Ye(o,n){let{results:s,environment:c}=await Se(o,!0),d=t(s.map((y)=>y.workload),s.map((y)=>y.run),c),p=C(o,n);return await u(d,p),p}async function Qe(o){let n;try{n=(await Array.fromAsync(new Bun.Glob("*.json").scan({cwd:o.baselineDir}))).map((d)=>d.replace(/\.json$/,"")).sort()}catch{return[]}return(await Promise.all(n.map(async(c)=>{let d=C(o,c);try{let p=await a(d);return{name:c,path:d,createdAt:p.createdAt,toolVersion:p.toolVersion,bunVersion:p.bunVersion,workloads:p.workloads.length,...p.git!==void 0&&{git:p.git}}}catch{return}}))).filter((c)=>c!==void 0)}class j extends Error{}var Xe=["table","json","jsonl","markdown","minimal"],we=["collapsed","mermaid","speedscope","cpuprofile"],en=[...Xe,...we];function An(o,n,s={}){if(s.allowAuto&&n==="auto")return qe();let c=s.min??1,d=n?.trim()===""?Number.NaN:Number(n);if(!Number.isInteger(d)||d<c)throw new j(`Invalid ${o} "${n}": expected an integer \u2265 ${c}${s.allowAuto?' (or "auto")':""}`);return d}function Sn(o,n){return n.split(",").map((s)=>{let c=/^\d+$/.test(s)?Number(s):Number.NaN;if(!(c<=255))throw new j(`Invalid ${o} "${n}": expected exit codes 0-255, comma-separated`);return c})}var Y=(o,n)=>({dest:o,spec:n}),h={str:(o)=>Y(o,{kind:"string"}),int:(o,n=1,s=!1)=>Y(o,{kind:"int",min:n,allowAuto:s}),num:(o,n)=>Y(o,{kind:"number",min:n}),on:(o)=>Y(o,{kind:"bool",value:!0}),off:(o)=>Y(o,{kind:"bool",value:!1}),oneOf:(o,n)=>Y(o,{kind:"enum",values:n}),list:(o)=>Y(o,{kind:"list"}),words:(o)=>Y(o,{kind:"words"}),exitCodes:(o)=>Y(o,{kind:"exitCodes"})},Pe={format:"table",quiet:!1,help:!1},ue={...Pe,noiseCheck:!0},Ce={"--help":h.on("help"),"-h":h.on("help")},ke={...Ce,"--export-json":h.str("exportJson"),"--format":h.oneOf("format",Xe),"--quiet":h.on("quiet")},ve={"--no-noise-check":h.off("noiseCheck")},oe={"--config":h.str("config")},Oe={...ke,...ve,"--timeout":h.int("timeoutMs"),"--out-dir":h.str("outDir")},Te={...Oe,...oe,"--filter":h.str("filter"),"--preload":h.list("preload"),"--bun-flags":h.words("bunFlags")};function X(o,{command:n,flags:s,args:c,positional:d,rest:p}){let y=c;for(let f=0;f<o.length;f++){let w=o[f];if(w==="--"&&p){p(o.slice(f+1),c);break}let S=w.startsWith("--")?w.indexOf("="):-1,O=S>0?w.slice(0,S):w,R=Object.hasOwn(s,O)?s[O]:void 0;if(!R||S>0&&R.spec.kind==="bool"){if(w.startsWith("-")||!d)throw new j(`Unknown flag "${w}" for "ostia ${n}".`);d(w,c);continue}let N=()=>{if(S>0)return w.slice(S+1);if(f+1>=o.length)throw new j(`Missing value for ${O}.`);return o[++f]},{dest:M,spec:I}=R;switch(I.kind){case"string":y[M]=N();break;case"int":y[M]=An(O,N(),I);break;case"number":{let B=N(),E=Number(B);if(B===""||!Number.isFinite(E)||E<I.min)throw new j(`Invalid ${O} "${B}": expected a number \u2265 ${I.min}`);y[M]=E;break}case"bool":y[M]=I.value;break;case"list":y[M].push(N());break;case"words":y[M].push(...K(N()));break;case"exitCodes":y[M].push(...S>0?Sn(O,w.slice(S+1)):Array.from({length:255},(B,E)=>E+1));break;case"enum":{let B=N();if(!I.values.includes(B))throw new j(`Invalid ${O} "${B}": expected one of: ${I.values.join(", ")}`);y[M]=B;break}}}return c}var L=(o)=>Bun.write(Bun.stdout,o),ln=(o)=>Bun.write(Bun.stderr,o);class D extends Error{code;data;constructor(o,n,s){super(n);this.code=o;this.data=s}}async function ye(o,n,s){try{return await s()}catch(c){if(c instanceof D)throw c;if(c instanceof l)throw new D("invalid-flag",`${n}: ${c.message}`);throw new D(o,`${n}: ${T(c)}`)}}var cn=new Set(["minimal","json","jsonl"]);async function Pn(){let{isatty:o}=await import("tty");if(!o(2))return!0;let n=process.argv.slice(2);return n.some((s,c)=>s==="--format"&&cn.has(n[c+1]??"")||s.startsWith("--format=")&&cn.has(s.slice(9)))}async function ee(o,n,s){if(await ln(n.endsWith(`
|
|
6
|
-
`)?n:`${n}
|
|
7
|
-
`),!await Pn())return;await ln(`${JSON.stringify({event:"error",protocolVersion:x,code:o,message:n.split(`
|
|
8
|
-
`)[0],...s&&{data:s}})}
|
|
9
|
-
`)}async function W(o,n){return await L(o),n?0:2}async function se(o,n){if(o.text)await L(o.text);if(!o.files||o.files.length===0)return;if(n)for(let s of o.files){let c=s.path?`${n}/${s.path}`:n;await Bun.write(c,s.content),await L(`wrote ${c}
|
|
10
|
-
`)}else if(o.files.length===1)await L(o.files[0].content);else for(let s of o.files)await L(`--- ${s.path??"(unnamed)"} ---
|
|
11
|
-
${s.content}
|
|
12
|
-
`)}async function Fe(o,{exportJson:n,format:s,quiet:c}){let d=s==="json"&&!c?q(o):void 0;if(n)if(d!==void 0)await Ze(d,n);else await u(o,n);return d}async function le(o,n,s={}){let c=await Fe(o,n);if(n.quiet)return;if(c!==void 0)await L(c);else await se(await g[n.format].render(o,s))}var dn=(o)=>o==="--help"||o==="-h";async function xe(o,n){let s=new AbortController,c=()=>s.abort();process.on("SIGINT",c);try{return{result:await ye("spawn-failed",o,()=>n(s.signal)),aborted:s.signal.aborted}}finally{process.off("SIGINT",c)}}async function $e(o){let n=await on(o);if(!n&&o!==void 0)throw new D("config-missing",`Config file ${o} not found.`);return n}async function Ae(o,n){let s=await $e(n);if(!s){let c=ne.join(" or ");throw new D("config-missing",o?`No ${c} found. "${o}" needs configured workloads.`:`No ${c} found.`)}if(o&&s.workloads.length===0){let c=n??await Ke()??ne[1];throw new D("config-missing",`${c} has no "workloads" configured.`)}return s}function fn(o){return o.matched===0?2:o.verdict==="fail"?1:0}var vn=["ns","us","ms","s"],On={...Oe,"--samples":h.int("samples"),"--budget":h.int("budgetMs"),"--min-samples":h.int("minSamples"),"--warmup":h.int("warmup",0),"--no-interleave":h.off("interleave"),"--prepare":h.list("prepare"),"--time-source":h.str("timeSource"),"--time-unit":h.oneOf("timeUnit",vn),"--cpu":h.on("cpu"),"--heap":h.on("heap"),"--cpu-interval":h.int("cpuIntervalUs"),"--ignore-failure":h.exitCodes("ignoreExitCodes")};function Tn(o){let n={...ue,commands:[],argvCommand:[],prepare:[],interleave:!0,cpu:!1,heap:!1,ignoreExitCodes:[]};return X(o,{command:"time",flags:On,args:n,positional:(s,c)=>c.commands.push(s),rest:(s,c)=>{c.argvCommand=s}})}async function Fn(o){let n=Tn(o),s=[...n.commands,...n.argvCommand.length>0?[n.argvCommand]:[]];if(n.help||s.length===0)return W(nn,n.help);if(n.prepare.length>1&&n.prepare.length!==s.length)throw new D("invalid-flag",`--prepare given ${n.prepare.length} times for ${s.length} command(s): give it once (applies to all) or once per command.`);if(n.timeUnit!==void 0&&n.timeSource===void 0)throw new D("invalid-flag","--time-unit only applies with --time-source.");if(n.cpuIntervalUs!==void 0&&!n.cpu)throw new D("invalid-flag","--cpu-interval only applies with --cpu.");if(n.timeSource!==void 0)try{new RegExp(n.timeSource)}catch(S){throw new D("invalid-flag",`Invalid --time-source regex: ${T(S)}`)}let c=n.timeSource!==void 0?{pattern:n.timeSource,unit:n.timeUnit}:void 0,d=s.map((S,O)=>({command:S,prepare:n.prepare.length===1?n.prepare[0]:n.prepare[O]})),{result:p,aborted:y}=await xe("Run failed",(S)=>he({commands:d,timeSource:c,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:S}));if(await le(p,n),y)return 130;let f=p.workloads.map((S)=>p.measurements.find((O)=>O.workloadId===S.id&&O.phase==="timing")),w=f.some((S)=>S?.timing&&fe(S,n.ignoreExitCodes));if(w||f.some((S)=>!S?.timing)){let S=(R)=>p.measurements.some((N)=>N.warnings.some((M)=>M.code===R)),O=w?"command-failed":S("timeout")?"timeout":S("time-source-no-match")?"time-source-no-match":"command-failed";throw new D(O,"One or more commands failed to produce a clean measurement; see the report above for details.")}return 0}var En={...Te,"--budget":h.int("budgetMs"),"--samples":h.int("samples"),"--min-samples":h.int("minSamples"),"--jobs":h.int("jobs",1,!0),"--gc":h.on("gc"),"--no-gc":h.off("gc"),"--cpu":h.on("cpu"),"--no-cpu":h.off("cpu"),"--cpu-interval":h.int("cpuIntervalUs"),"--alloc":h.on("alloc"),"--no-alloc":h.off("alloc"),"--peak-mem":h.on("peakMem"),"--no-peak-mem":h.off("peakMem"),"--isolate":h.on("isolate"),"--no-isolate":h.off("isolate")};function Mn(o){let n={...ue,suites:[],preload:[],bunFlags:[]};return X(o,{command:"bench",flags:En,args:n,positional:(s,c)=>c.suites.push(s)})}async function Rn(o){let n=Mn(o);if(n.help)return W(je,!0);let s=await $e(n.config),c=await te(n,s?.bench);if(c.suites.length===0)return W(je,!1);let{result:d,aborted:p}=await xe("Bench failed",(y)=>z({...c,signal:y}));return await le(d,n),p?130:0}var Nn={...Te,"--base":h.str("base"),"--base-setup":h.list("baseSetup"),"--rounds":h.int("rounds",3),"--threshold":h.num("thresholdPct",0),"--geomean-threshold":h.num("geomeanThresholdPct",0),"--confirm":h.int("confirm",0),"--alloc":h.on("alloc"),"--no-alloc":h.off("alloc"),"--peak-mem":h.on("peakMem"),"--no-peak-mem":h.off("peakMem"),"--mem-threshold":h.num("memThresholdPct",0),"--keep-trees":h.int("keepTrees"),"--clean":h.on("clean"),"--progress":h.on("progress"),"--no-progress":h.off("progress")};function Dn(o){switch(o.phase){case"setup":return`[ab] base setup: ${o.command}`;case"measure":return`[ab] suite ${o.suite}/${o.suites} ${o.file} \xB7 pass ${o.pass}/${o.passes} \xB7 task ${o.task}/${o.tasks} ${o.label}`;case"confirm":return`[ab] confirming flagged tasks \xB7 repeat ${o.repeat}/${o.repeats} ${o.label}`;case"memory":return`[ab] memory \xB7 process ${o.run}/${o.runs} ${b(o.side)} ${o.label}`}}function In(o){let n=!1;return{onProgress:(s)=>{let c=Dn(s);if(!o){Ee(2,`${c}
|
|
13
|
-
`);return}let d=process.stderr.columns||80;Ee(2,`\r\x1B[K${c.slice(0,d-1)}`),n=!0},done:()=>{if(n)Ee(2,"\r\x1B[K");n=!1}}}function Bn(o){let n={...ue,suites:[],baseSetup:[],preload:[],bunFlags:[],clean:!1};return X(o,{command:"ab",flags:Nn,args:n,positional:(s,c)=>c.suites.push(s)})}async function _n(o){let n=Bn(o);if(n.help)return W(He,!0);let s=await $e(n.config);if(n.clean){let H=await an({outDir:n.outDir??s?.bench?.outDir});if(!n.quiet)await Bun.write(Bun.stderr,`Removed ${H} cached base tree(s).
|
|
14
|
-
`);return 0}let{suites:c,filter:d,preload:p,bunFlags:y,timeoutMs:f,outDir:w,noiseCheck:S}=await te(n,s?.bench);if(c.length===0)return W(He,!1);let{isatty:O}=await import("tty"),R=O(2),N=n.progress??(R&&!n.quiet)?In(R):void 0,{result:M,aborted:I}=await xe("A/B run failed",async(H)=>{try{return await ge({suites:c,base:n.base,baseSetup:n.baseSetup.length>0?n.baseSetup:s?.ab?.setup,rounds:n.rounds,thresholdPct:n.thresholdPct,geomeanThresholdPct:n.geomeanThresholdPct,confirm:n.confirm,alloc:n.alloc??s?.ab?.alloc,peakMem:n.peakMem??s?.ab?.peakMem,memThresholdPct:n.memThresholdPct??s?.ab?.memThresholdPct,filter:d,preload:p,bunFlags:y,timeoutMs:f,outDir:w,keepTrees:n.keepTrees??s?.ab?.keepTrees,noiseCheck:S,signal:H,onProgress:N?.onProgress})}catch(Z){if(Z instanceof F)throw new D("invalid-flag",`--base: ${Z.message}`);if(Z instanceof V)throw new D("command-failed",Z.message);if(Z instanceof G)throw new D("suite-failed",Z.message,{side:Z.side});throw Z}finally{N?.done()}}),B=M.ab,E=I?130:fn({matched:B.matched+B.threw,verdict:B.verdict}),ce=new Map(M.workloads.map((H)=>[H.id,H])),Me=(H=[])=>H.flatMap((Z)=>ce.get(Z)??[]);if(await le(M,n,{protocol:{command:"ab",exitCode:E,unmatched:{baseOnly:Me(M.unmatched?.baseOnly),candOnly:Me(M.unmatched?.candOnly)},...n.exportJson&&{exportedTo:n.exportJson}}}),E===2){let H=B.newSuites?.length===c.length;await ee("no-matches",H?`No suite exists at ${B.base.ref}; nothing was paired. Use "ostia bench" to time new suites.`:`No task exists both at ${B.base.ref} and in the working tree; nothing was paired.`)}return E}var Ln={...ke,...oe,"--baseline":h.str("baseline")};function Un(o){let n={...Pe,paths:[]};return X(o,{command:"compare",flags:Ln,args:n,positional:(s,c)=>c.paths.push(s)})}async function Wn(o){let n=Un(o);if(n.help)return W(Ge,!0);let s=n.baseline?1:2;if(n.paths.length>s)throw new j(n.baseline?`"ostia compare --baseline" takes one candidate path, got ${n.paths.length}.`:`"ostia compare" takes two document paths, got ${n.paths.length}.`);let[c,d]=n.baseline?[n.baseline,n.paths[0]]:n.paths;if(!c||!d)return W(Ge,!1);let[p,y]=await ye("document-load-failed","Failed to load documents",()=>Promise.all([a(c),a(d)])),f=await $e(n.config),w=f?.thresholds??P,S=f?n.config??await Ke()??ne[1]:"defaults",O=pe(p,y,w),R={...y,comparisons:O.comparisons,comparisonSummary:O.summary,unmatched:{baseOnly:O.unmatched.baseOnly.map((I)=>I.id),candOnly:O.unmatched.candOnly.map((I)=>I.id)}},N=!n.quiet&&(n.format==="table"||n.format==="markdown");if(N){if(await L(`thresholds: ${S}
|
|
15
|
-
`),p.git&&y.git)await L(`base ${_(p.git)} \u2192 cand ${_(y.git)}
|
|
16
|
-
`);if(n.format==="table"&&O.summary.effectiveTimingPct>w.timingPct)await L(`threshold ${w.timingPct}% (widened to ${O.summary.effectiveTimingPct.toFixed(1)}% by noise floor)
|
|
17
|
-
`)}let M=fn(O.summary);if(await le(R,n,{protocol:{command:"compare",exitCode:M,unmatched:O.unmatched,baseGit:p.git,candGit:y.git,...n.exportJson&&{exportedTo:n.exportJson}}}),N&&(O.unmatched.baseOnly.length>0||O.unmatched.candOnly.length>0))await L(Gn(O.unmatched,n.format==="markdown"));if(O.summary.matched===0)await ee("no-matches","No workload matched between base and candidate; nothing was compared.");return M}function Gn(o,n){let s=(p)=>p.map((y)=>k(y)).join(", "),c=n?"- ":" ",d=n?["### Unmatched",""]:["","Unmatched:"];if(o.baseOnly.length>0)d.push(`${c}baseline only: ${s(o.baseOnly)}`);if(o.candOnly.length>0)d.push(`${c}candidate only: ${s(o.candOnly)}`);if(n)d.push("");return`${d.join(`
|
|
18
|
-
`)}
|
|
19
|
-
`}var pn={...Ce,"--format":h.oneOf("format",en),"--measurement":h.str("measurementId"),"--out-dir":h.str("outDir")};function jn(o){return X(o,{command:"report",flags:pn,args:{format:"table",help:!1},positional:(s,c)=>{if(c.path!==void 0)throw new j(`"ostia report" takes exactly one document path, got "${c.path}" and "${s}".`);c.path=s}})}var mn="No CPU evidence in this document; rerun with --cpu (ostia time) or --cpu (ostia bench)";async function gn(o,{format:n,measurementId:s,outDir:c}){let d=we.includes(n),p=[s!==void 0&&"--measurement",c!==void 0&&"--out-dir"].filter((w)=>w!==!1);if(!d&&p.length>0)throw new j(`${p.join(" and ")} only apply to the visualization formats (${we.join(", ")}), not --format ${n}.`);let y=await ye("document-load-failed",`Failed to load ${o}`,()=>a(o));if(d&&!s&&!y.measurements.some((w)=>w.phase==="cpu"))throw new D("no-cpu-evidence",mn);let f=await g[n].render(y,{measurementId:s});if(!f.text&&(!f.files||f.files.length===0))throw new D("no-cpu-evidence",s?`No CPU evidence found for measurement "${s}".`:mn);return await se(f,c),0}async function Hn(o){let n=jn(o);if(n.help||!n.path)return W(Ve,n.help);return gn(n.path,n)}var Vn={...ke,...ve,...oe,"--full":h.on("full"),"--baseline":h.str("baseline"),"--save-baseline":h.on("saveBaseline")};function qn(o){let n={...ue,full:!1,saveBaseline:!1};return X(o,{command:"ci",flags:Vn,args:n})}var hn=(o)=>new D("baseline-missing",o.message);function Jn(o){if(o instanceof me)throw hn(o);if(o instanceof A)throw new D("document-load-failed",o.message);throw o}async function Kn(o){let n=qn(o);if(n.help)return W(tn,!0);let s=await Ae("ostia ci",n.config),c=n.noiseCheck?s:{...s,noiseCheck:!1},d=n.full||n.saveBaseline,{result:p,aborted:y}=await xe("CI run failed",(M)=>Ue({config:c,full:d,baselineName:n.baseline,signal:M}).catch(Jn)),{document:f,summary:w}=p;if(y)return await le(f,n),130;let S=n.baseline??c.baseline,O=C(c,S),R=await Fe(f,n);if(n.saveBaseline&&w.regressed===0&&w.failed===0)await u(f,O);let N=w.failed>0?2:w.regressed>0?1:0;if(w.failed>0){let M=w.results.filter((I)=>I.harnessFailed).map((I)=>k(I.workload));await ee("command-failed",`${w.failed} workload(s) failed (harness error, a command exited non-zero or produced no samples): ${M.join(", ")}`)}if(n.quiet)return N;if(R!==void 0)await L(R);else if(n.format==="table"){if(await L(We(w)),f.comparisons&&f.comparisons.length>0)await se(await g.table.render(f,{}))}else if(n.format==="markdown")await L(`## ostia ci
|
|
20
|
-
|
|
21
|
-
Baseline: \`${S}\` (\`${O}\`) \xB7 ${w.cached} cached, ${w.executed} executed
|
|
22
|
-
|
|
23
|
-
`),await se(await g.markdown.render(f,{}));else await se(await g[n.format].render(f,{protocol:{command:"ci",exitCode:N,unmatched:w.unmatched,baseGit:p.baseline.git,candGit:f.git,baseline:{name:S,path:O},cached:w.cached,executed:w.executed,failed:w.failed,missingBaseline:w.missingBaseline,...n.exportJson&&{exportedTo:n.exportJson}}}));return N}var un=/^[A-Za-z0-9._-]+$/;function de(o){return new D("invalid-flag",`${o}
|
|
24
|
-
Run 'ostia baseline --help'.`)}function bn(o){if(o.startsWith("-"))throw de(`Invalid baseline name "${o}": names can't start with "-".`);if(!un.test(o))throw de(`Invalid baseline name "${o}": expected to match ${un}.`)}var zn={...Ce,...oe};function wn(o,n,s){return X(o,{command:n,flags:zn,args:{help:!1},positional:(c,d)=>{if(!s)throw de(`"ostia ${n}" takes no arguments, got "${c}".`);if(d.name!==void 0)throw de(`"ostia ${n}" takes at most one name argument, got "${d.name}" and "${c}".`);d.name=c}})}async function Zn(o){let{name:n,help:s,config:c}=wn(o,"baseline save",!0);if(s)return W(Q,!0);if(n!==void 0)bn(n);let d=await Ae("ostia baseline save",c);return await L(`Wrote ${await Ye(d,n)}
|
|
25
|
-
`),0}async function Yn(o){let{help:n,config:s}=wn(o,"baseline list",!1);if(n)return W(Q,!0);let c=await Ae(void 0,s),d=await Qe(c);if(d.length===0)return await L(`No baselines found in ${c.baselineDir}.
|
|
26
|
-
`),0;for(let p of d){let y=p.git?` ${_(p.git)}`:"";await L(`${p.name} ${p.workloads} workloads created ${p.createdAt} toolVersion ${p.toolVersion}${y}
|
|
27
|
-
`)}return 0}async function Qn(o){let[n,...s]=o;if(!n||dn(n))return W(Q,!!n);bn(n);let c=X(s,{command:"baseline show",flags:{...pn,...oe},args:{format:"table",help:!1},positional:(y)=>{throw de(`"ostia baseline show" takes one name, got "${n}" and "${y}".`)}});if(c.help)return W(Ve,!0);let d=await Ae(void 0,c.config),p=C(d,n);if(!await Bun.file(p).exists())throw hn(new be(p));return gn(p,c)}async function Cn(o,n,s,c,d,p=""){if(o===void 0||dn(o))return W(c,o!==void 0);let y=Object.hasOwn(s,o)?s[o]:void 0;try{if(!y)throw new D("invalid-flag",d(o));return await y(n)}catch(f){if(f instanceof D)await ee(f.code,f.message,f.data);else if(f instanceof m)await ee("config-invalid",f.message);else if(f instanceof j)await ee("invalid-flag",`${f.message}
|
|
28
|
-
Run 'ostia ${p}${o} --help'.`);else await ee("internal",`Internal error: ${f instanceof Error?f.stack??f.message:String(f)}`);return 2}}function Xn(o){let[n,...s]=o;return Cn(n,s,{save:Zn,list:Yn,show:Qn},Q,(c)=>`Unknown "ostia baseline ${c}". Run "ostia baseline --help".`,"baseline ")}function Kt(){let[o,...n]=process.argv.slice(2);return Cn(o,n,{time:Fn,bench:Rn,ab:_n,compare:Wn,report:Hn,ci:Kn,baseline:Xn},rn,(s)=>`Unknown subcommand "${s}". Run "ostia --help".`)}export{Kt as main};
|
package/chunk-w9pvsd7y.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{W}from"./chunk-jzfv4c07.js";import{heapStats as y}from"bun:jsc";function j(){let{heapSize:n,extraMemorySize:e}=y();return{rssBytes:process.memoryUsage.rss(),liveBytes:n+e}}var s={ready:1,go:2,sampling:3,stop:4},g=`self.onmessage = (event) => {
|
|
3
|
-
const slots = new Int32Array(event.data)
|
|
4
|
-
Atomics.store(slots, 0, ${s.ready})
|
|
5
|
-
Atomics.wait(slots, 0, ${s.ready})
|
|
6
|
-
if (Atomics.compareExchange(slots, 0, ${s.go}, ${s.sampling}) === ${s.go}) {
|
|
7
|
-
while (Atomics.load(slots, 0) === ${s.sampling}) {
|
|
8
|
-
const kib = (process.memoryUsage.rss() / 1024) | 0
|
|
9
|
-
if (kib > Atomics.load(slots, 1)) Atomics.store(slots, 1, kib)
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
postMessage(0)
|
|
13
|
-
}`,d=1e4;async function H(n=g){let e=new Int32Array(new SharedArrayBuffer(8)),r=new Worker(URL.createObjectURL(new Blob([n],{type:"application/javascript"}))),a=new Promise((t,c)=>{let o=(m)=>c(Error(`RSS sampler worker failed: ${m}`));r.onerror=(m)=>o(m.message||"uncaught error"),r.addEventListener("close",()=>o("worker exited unexpectedly"))});a.catch(()=>{});let i=new Promise((t)=>{r.onmessage=t});try{r.postMessage(e.buffer);let t=Date.now()+d;while(Atomics.load(e,0)!==s.ready){if(Date.now()>t)throw Error("RSS sampler worker failed: did not start in time");await Promise.race([Bun.sleep(1),a])}}catch(t){throw r.terminate(),t}return{async during(t){try{Atomics.store(e,0,s.go),Atomics.notify(e,0);let c=Bun.nanoseconds()+50000000;while(Atomics.load(e,0)!==s.sampling&&Bun.nanoseconds()<c);let o=Date.now()+d;while(Atomics.load(e,0)!==s.sampling){if(Date.now()>o)throw Error("RSS sampler worker failed: did not start sampling");await Promise.race([Bun.sleep(1),a])}return await t(),Atomics.store(e,0,s.stop),await Promise.race([i,a]),Atomics.load(e,1)*1024}finally{r.terminate()}}}}async function ee(n,e,r){let a=r??await H();Bun.gc(!0);let i=j(),t=process.resourceUsage().maxRSS*1024,c=Bun.nanoseconds(),o=0,m=await a.during(async()=>{let p=n();if(W(p))await p;o=Bun.nanoseconds()-c}),l=process.resourceUsage().maxRSS*1024,w=Math.max(m,l>t?l:0),u=e?i.rssBytes-e.rssBytes-(i.liveBytes-e.liveBytes):0;return{peakBytes:Math.max(0,w-i.rssBytes),slackBytes:Math.max(0,u),wallNs:o}}
|
|
14
|
-
export{j,H,ee};
|
package/chunk-zf3y6chk.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{w,o,Ee,Ne}from"./chunk-jzfv4c07.js";function b(n){return n==="cand"?"candidate":n}class oe extends Error{side;constructor(n,t){super(t instanceof Error?t.message:String(t),{cause:t});this.side=n}}async function M(n,t){try{return await t()}catch(r){throw r instanceof oe?r:new oe(n,r)}}var _=15,N=1e7,U=1e6,v=3;async function cn(n,t,r={}){let i=r.rounds??_,{signal:s}=r;s?.throwIfAborted();let m=Bun.nanoseconds(),c=r.candFirst?["cand","base"]:["base","cand"],p=c.toReversed(),g={base:n,cand:t},f={};for(let e of c)f[e]=await M(e,()=>Ne(g[e]));let A=Bun.deepEquals(f.base.result,f.cand.result),S=(e)=>{let a=Ee(g[e],f[e].isAsync);return(d)=>M(e,()=>a(d))},l={base:S("base"),cand:S("cand")},C=async(e)=>{for(let a=1;;a*=2){s?.throwIfAborted();let d=await e(a);if(d>=U)return Math.max(1,d/a)}},h={base:0,cand:0};for(let e of c)h[e]=await C(l[e]);let u=Math.max(1,Math.round(N/Math.max(h.base,h.cand)));for(let e=0;e<v;e++){s?.throwIfAborted();for(let a of c)await l[a](u)}let x=[],y=[],T=[];for(let e=0;e<i;e++){s?.throwIfAborted();let a={base:0,cand:0};for(let R of e%2===0?c:p)a[R]=await l[R](u);let d=Math.max(1,a.base),P=Math.max(1,a.cand);x.push(d/u),y.push(P/u),T.push(P/d)}return{rounds:i,batch:u,baseSamples:x,candSamples:y,ratios:T,sameOutput:A,diagnosticWallNs:Bun.nanoseconds()-m}}function O(n){return!(n.suiteChanged&&!n.sameOutput)}function un(n,t,r,i){let s=t-n,m=Math.abs(s)>Math.max(i,n*r/100);return{baseBytes:n,candBytes:t,verdict:!m?"unchanged":s>0?"regressed":"improved",floorBytes:i}}function se(n,t){let r=w(n),i=o(r,0.5),s=o(r,0.25),m=o(r,0.75),c=t/100,p=i>1+c&&s>1?"regressed":i<1-c&&m<1?"improved":void 0;return{medianRatio:i,ratioP25:s,ratioP75:m,...p&&{flagged:p}}}
|
|
3
|
-
export{b,oe,cn,O,un,se};
|