ostia 0.2.3 → 0.2.4
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/chunk-1wydyvyj.js +12 -0
- package/chunk-cf9hya3b.js +22 -0
- package/cli.js +32 -32
- package/index.d.ts +3 -6
- package/index.js +1 -1
- package/package.json +1 -1
- package/runner.ts +5 -5
- package/chunk-2s4xk1mg.js +0 -12
- package/chunk-dpxy38mq.js +0 -22
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
class we extends Error{}function N(n){if(typeof n.pattern==="string")return;let{flags:s}=n.pattern;if(s.includes("g")||s.includes("y")||s.includes("d"))throw RangeError("timeSource pattern must not use the g or y flag")}function qe(...n){let s=n.filter((i)=>i!==void 0);if(s.length===0)return;if(s.length===1)return s[0];return AbortSignal.any(s)}var Ye={ns:1,us:1000,ms:1e6,s:1e9};function D(n,s){let i=n!==void 0?AbortSignal.timeout(n):void 0,u=qe(i,s);return{spawn:u?{signal:u,killSignal:"SIGKILL"}:{},timedOut:()=>i?.aborted??!1}}async function q(n){let s=n.timeSource!==void 0,i=Bun.nanoseconds(),u=D(n.timeoutMs,n.signal),c=Bun.spawn(n.argv,{cwd:n.cwd,env:n.env,stdout:s?"pipe":"ignore",stderr:s?"pipe":"ignore",stdin:"ignore",...u.spawn}),b=s?Promise.all([new Response(c.stdout).text(),new Response(c.stderr).text()]):void 0,I=await c.exited,C=Bun.nanoseconds(),S=c.resourceUsage?.(),j=u.timedOut(),W={wallNs:C-i,exitCode:j?null:I,userNs:S?Number(S.cpuTime.user)*1000:void 0,systemNs:S?Number(S.cpuTime.system)*1000:void 0,maxRssBytes:S?.maxRSS,...j?{timedOut:!0}:{}};if(b){let[_,H]=await b;if(n.timeSource&&!j)try{W.reportedNs=Ze(n.timeSource,_,H,n.argv)}catch(ne){if(!(ne instanceof we))throw ne;W.timeSourceNoMatch=!0,W.timeSourceMissOutput=Xe(_,H)}}return W}function Ze(n,s,i,u=[]){let c=typeof n.pattern==="string"?new RegExp(n.pattern):n.pattern,b=n.group??1,I=c.exec(s)??c.exec(i),C=u.length>0?` for "${u.join(" ")}"`:"";if(!I)throw new we(`timeSource pattern ${c} did not match the output${C}. Output was:
|
|
3
|
+
${Ie(s,i)}`);let S=I[b];if(S===void 0)throw Error(`timeSource pattern ${c} matched${C} but has no capture group ${b} (matched text: "${I[0]}").`);let j=Number(S);if(!Number.isFinite(j))throw Error(`timeSource pattern ${c} group ${b} captured "${S}"${C}, which is not a number.`);return j*Ye[n.unit??"ms"]}function Ie(n,s){let u=(b)=>b.length>800?`${b.slice(0,800)}\u2026(${b.length-800} more)`:b,c=[];if(n.trim())c.push(`--- stdout ---
|
|
4
|
+
${u(n.trimEnd())}`);if(s.trim())c.push(`--- stderr ---
|
|
5
|
+
${u(s.trimEnd())}`);return c.length>0?c.join(`
|
|
6
|
+
`):"(empty)"}var he=2048;function Xe(n,s){let i=Ie(n,s);if(Buffer.byteLength(i,"utf8")<=he)return i;let u=i.slice(0,he);while(Buffer.byteLength(u,"utf8")>he)u=u.slice(0,-1);return`${u}\u2026`}var Qe=1048576,en=(n)=>`
|
|
7
|
+
\u2026(${n} bytes elided)\u2026
|
|
8
|
+
`;async function nn(n,s=Qe){let i=Math.floor(s/2),u=n.getReader(),c=[],b=0,I=[],C=0,S=0;try{for(;;){let{done:ne,value:re}=await u.read();if(ne)break;if(!re||re.byteLength===0)continue;S+=re.byteLength;let V=re;if(b<i){let J=i-b;if(V.byteLength<=J){c.push(V),b+=V.byteLength;continue}c.push(V.subarray(0,J)),b+=J,V=V.subarray(J)}I.push(V),C+=V.byteLength;while(C>i&&I.length>0){let J=I[0],Q=C-i;if(J.byteLength<=Q)I.shift(),C-=J.byteLength;else I[0]=J.subarray(Q),C-=Q}}}finally{u.releaseLock()}let j=new TextDecoder,W=j.decode(ve(c));if(S<=b+C)return W;let _=j.decode(ve(I)),H=S-b-C;return`${W}${en(H)}${_}`}function ve(n){let s=n.reduce((c,b)=>c+b.byteLength,0),i=new Uint8Array(s),u=0;for(let c of n)i.set(c,u),u+=c.byteLength;return i}async function F(n,s,i){if(typeof n==="function"){await n(s);return}let u=ke(n),c=D(i.timeoutMs,i.signal),b=Bun.spawn(u,{cwd:i.cwd,env:i.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...c.spawn}),I=nn(b.stderr).catch(()=>""),C=await b.exited;if(c.timedOut()){let S=(await I).trim();throw Error(`prepare command "${u.join(" ")}" timed out after ${i.timeoutMs}ms before ${s.phase} trial ${s.index}.${S?`
|
|
9
|
+
${S}`:""}`)}if(i.signal?.aborted)return;if(C!==0){let S=(await I).trim();throw Error(`prepare command "${u.join(" ")}" exited with code ${C} before ${s.phase} trial ${s.index}.${S?`
|
|
10
|
+
${S}`:""}`)}}function ke(n){if(n===void 0||typeof n==="function")return;return Array.isArray(n)?n:m(n)}function Ne(n){if(n===void 0)return;return{pattern:typeof n.pattern==="string"?n.pattern:n.pattern.source,...n.group!==void 0&&{group:n.group},...n.unit!==void 0&&{unit:n.unit}}}function m(n){return n.trim().split(/\s+/).filter(Boolean)}import{renameSync as rn}from"fs";var Oe={name:"ostia",version:"0.2.4",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"./src/cli/main.ts"},scripts:{build:"bun scripts/build.ts",test:"bun test",typecheck:"tsc6",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.12","@types/bun":"^1.4.0",knip:"^6.34.0",typescript:"npm:@typescript/typescript6@^6.0.2"}};var x=Oe.version;function y(n,s){return JSON.stringify(ye(n),null,s)}function ye(n){if(Array.isArray(n)){let s=!1;for(let i=0;i<n.length;i++){let u=n[i];if(u!==null&&typeof u==="object"){s=!0;break}}return s?n.map(ye):n}if(n!==null&&typeof n==="object"){let s=n,i={};for(let u of Object.keys(s).sort())i[u]=ye(s[u]);return i}return n}function e(n,...s){let i=Bun.CryptoHasher.hash("sha256",y(s),"hex");return`${n}_${i.slice(0,16)}`}var ge,Pe=!1;function Te(n){let s=Bun.spawnSync(["git",...n],{timeout:200,stdout:"pipe",stderr:"ignore"});return s.success?s.stdout.toString().trim():void 0}function Ee(){if(Pe)return ge;Pe=!0;try{let n=Te(["rev-parse","--short","HEAD"]);if(n===void 0)ge=void 0;else{let s=Te(["rev-parse","--abbrev-ref","HEAD"]),i=Te(["status","--porcelain"]);ge={sha:n,branch:s??"HEAD",dirty:(i?.length??0)>0}}}catch{ge=void 0}return ge}function t(n,s,i){let u=Ee();return{schemaVersion:2,toolVersion:x,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:n,measurements:s,...i!==void 0&&{environment:i},...u!==void 0&&{git:u}}}function P(n,s,i={}){if(i.timeSource)N(i.timeSource);let u=ke(i.prepare),c=Ne(i.timeSource),b=typeof i.prepare==="function"?i.prepare.toString():u;return{id:e("wl","subprocess",n,...b!==void 0||c!==void 0?[b??null,c??null]:[]),kind:"subprocess",command:n,label:s,...u!==void 0&&{prepare:u},...c!==void 0&&{timeSource:c}}}function K(n,s){return{id:e("wl","inprocess",n.name,n.toString()),kind:"inprocess",label:s}}function Be(n,s,i={}){return{id:i.params!==void 0?e("wl","inprocess-entry",n,s,i.params):e("wl","inprocess-entry",n,s),kind:"inprocess",entry:{file:n,task:s,...i.group!==void 0&&{group:i.group}},...i.label!==void 0&&{label:i.label},...i.baseline!==void 0&&{baseline:i.baseline},...i.description!==void 0&&{description:i.description},...i.groupDescription!==void 0&&{groupDescription:i.groupDescription},...i.isolated!==void 0&&{isolated:i.isolated},...i.params!==void 0&&{params:i.params},...i.skipped!==void 0&&{skipped:i.skipped}}}function d(n){return{id:e("run",n.workload.id,"timing",n.configFingerprint,Bun.version,x),workloadId:n.workload.id,phase:"timing",instrumented:!1,configFingerprint:n.configFingerprint,trials:n.trials,timing:n.timing,warnings:n.warnings,artifacts:[],memory:on(n.trials),...n.interleaved!==void 0&&{interleaved:n.interleaved}}}function on(n){let s=n.map((i)=>i.maxRssBytes).filter((i)=>i!==void 0);if(s.length===0)return;return{origin:"resourceUsage",perTrial:n.map((i)=>({rssBytes:i.maxRssBytes})),maxRssBytes:Math.max(...s)}}function p(n){return{id:e("run",n.workload.id,n.phase,n.configFingerprint,Bun.version,x),workloadId:n.workload.id,phase:n.phase,instrumented:!0,configFingerprint:n.configFingerprint,trials:[{i:0,wallNs:n.diagnosticWallNs,exitCode:n.exitCode}],diagnosticWallNs:n.diagnosticWallNs,cpu:n.cpu,heap:n.heap,memory:n.memory,jit:n.jit,warnings:n.warnings,artifacts:n.artifacts}}async function Y(n,s,i){let c=await Bun.file(i).arrayBuffer(),b=new Bun.CryptoHasher("sha256");return b.update(c),{id:e("art",n,s,i),kind:s,path:i,sha256:b.digest("hex"),bytes:c.byteLength}}function o(n){return e("cfg",n)}function f(n){return`${y(n,2)}
|
|
11
|
+
`}async function E(n,s){let i=`${s}.tmp-${process.pid}`;await Bun.write(i,n),rn(i,s)}async function a(n,s){await E(f(n),s)}function sn(n){if(n.schemaVersion===2)return n;let{runs:s,comparisons:i,...u}=n;return{...u,schemaVersion:2,measurements:s.map(({baselineRunId:c,...b})=>b),...i!==void 0&&{comparisons:i.map(({baselineRunId:c,candidateRunId:b,...I})=>({...I,baselineMeasurementId:c,candidateMeasurementId:b}))}}}class A extends Error{code;path;schemaVersion;constructor(n,s,i={}){super(s);this.name="OstiaDocumentError",this.code=n,this.path=i.path,this.schemaVersion=i.schemaVersion}}async function r(n){let s=await Bun.file(n).text(),i;try{i=JSON.parse(s)}catch(c){let b=c instanceof Error?c.message:String(c);throw new A("invalid-json",`${n}: invalid JSON (${b})`,{path:n})}let u=i!==null&&typeof i==="object"?i.schemaVersion:void 0;if(typeof u!=="number")throw new A("not-a-document",`${n}: not a ProfileDocument (missing schemaVersion)`,{path:n});if(u!==1&&u!==2)throw new A("unsupported-schema",`${n}: unsupported ProfileDocument schemaVersion ${u} (this ostia reads 1\u20132)`,{path:n,schemaVersion:u});return sn(i)}import xe from"os";function k(n){if(n.length===0)throw Error("computeTimingStats: samples must be non-empty");let s=n.length,i=an(n),u=0;for(let w=0;w<s;w++)u+=n[w];let c=u/s,b=l(i,0.5),I=0;for(let w=0;w<s;w++){let L=n[w]-c;I+=L*L}let C=Math.sqrt(I/s),S=i[0],j=i[s-1],W=l(i,0.25),_=l(i,0.75),H=_-W,ne=W-1.5*H,re=_+1.5*H,V=W-3*H,J=_+3*H,Q=0,te=0;for(let w=0;w<s;w++){let L=n[w];if(L<V||L>J)te++;else if(L<ne||L>re)Q++}let ce=l(i,0.99),ee=new Float64Array(s);for(let w=0;w<s;w++)ee[w]=Math.abs(n[w]-b);ee.sort();let ae=l(ee,0.5);return{unit:"ns",samples:n,mean:c,median:b,stddev:C,min:S,max:j,outliers:{mild:Q,severe:te},p25:W,p75:_,p99:ce,mad:ae}}function an(n){let s=new Float64Array(n.length);return s.set(n),s.sort(),s}function l(n,s){let i=n.length;if(i===1)return n[0];let u=s*(i-1),c=Math.floor(u),b=Math.ceil(u);if(c===b)return n[c];let I=u-c;return n[c]*(1-I)+n[b]*I}var un=5000000,cn=200;function O(n,s,i="subprocess",u=[]){let c=[],b=n.samples[0];if(b!==void 0&&n.p25!==void 0&&n.p75!==void 0){let S=n.p75-n.p25;if(b>n.median+3*S&&S>0)c.push({code:"slow-first-run",message:`First run took ${(b/1e6).toFixed(2)}ms, much slower than the median ${(n.median/1e6).toFixed(2)}ms. Consider more warmup.`,data:{firstNs:b,medianNs:n.median}})}if(n.outliers.mild+n.outliers.severe>0)c.push({code:"outliers-detected",message:`${n.outliers.mild+n.outliers.severe} outlier(s) detected (${n.outliers.severe} severe, ${n.outliers.mild} mild).`,data:n.outliers});if(i==="subprocess"&&n.median<un)c.push({code:"fast-command",message:`Median run time (${(n.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:n.median}});if(i==="inprocess"&&n.median<cn)c.push({code:"below-timer-resolution",message:`Median run time (${n.median.toFixed(0)}ns) is close to timer resolution; consider a larger batch size or a coarser operation.`,data:{medianNs:n.median}});let I=new Set(u),C=s.filter((S)=>S!==void 0&&S!==0&&!I.has(S));if(C.length>0)c.push({code:"nonzero-exit",message:`${C.length} of ${s.length} trial(s) exited non-zero.`,data:{exitCodes:C}});return c}var ln=200,Ae=64,mn=(()=>{let n=new Uint8Array(4096);for(let s=0;s<n.length;s++)n[s]=s*2654435761&255;return n})();function dn(n,s){let i=s;for(let u=0;u<n.length;u++)i^=n[u],i=Math.imul(i,16777619);return i>>>0}function pn(n){let s=k(n),i=s.mad??0;return{floorPct:s.median===0?0:i/s.median*100,referenceMedianNs:s.median,samples:n.length}}function Fe(n=ln){let s=n*1e6,i=[],u=0,c=Bun.nanoseconds(),b=0;while(b<s){let I=Bun.nanoseconds();for(let S=0;S<Ae;S++)u^=dn(mn,S);let C=Bun.nanoseconds();i.push((C-I)/Ae),b=Bun.nanoseconds()-c}return pn(i)}var fn=0.75;function g(){let[n=0,s=0]=xe.loadavg();return{cpuModel:xe.cpus()[0]?.model??"unknown",cores:xe.availableParallelism(),loadAvg1:n,loadAvg5:s,noise:Fe()}}function h(n){if(n.loadAvg1<=n.cores*fn)return;return{code:"noisy-machine",message:`Load average ${n.loadAvg1.toFixed(2)} exceeds 75% of ${n.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:n.loadAvg1,cores:n.cores}}}import{profile as bn}from"bun:jsc";var gn=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Ce=4294967295;function Ue(n,s){let i=s??n.interval*1e6,u=new Map,c=[];function b(w,L,z,le){let me=u.get(w);if(me===void 0)me=new Map,u.set(w,me);let ue=L??"",de=me.get(ue);if(de===void 0)de=c.length,me.set(ue,de),c.push({key:e("fr",w,ue),name:w,url:L,line:z,col:le});return de}function I(w){let L=w.line===Ce,z=L?void 0:w.line-1,le=L||w.column===Ce?void 0:w.column-1;return b(w.name,w.sourceURL,z,le)}let C=b("(root)",void 0,void 0,void 0),S=1,j={id:0,frameIx:C,children:new Map,selfUs:0,samples:0,totalUs:0},W=new Map([[0,j]]),_={llint:0,baseline:0,dfg:0,ftl:0},H=new Map,ne=[],re=[];for(let w of n.traces){let L=w.frames,z=j;for(let ue=L.length-1;ue>=0;ue--){let de=I(L[ue]),pe=z.children.get(de);if(!pe)pe={id:S++,frameIx:de,children:new Map,selfUs:0,samples:0,totalUs:0},z.children.set(de,pe),W.set(pe.id,pe);z=pe}z.selfUs+=i,z.samples+=1,ne.push(z.id),re.push(i);let le=L[0],me=le&&gn.get(le.category);if(me){_[me]++;let ue=H.get(me)??new Map;ue.set(z.frameIx,(ue.get(z.frameIx)??0)+1),H.set(me,ue)}}function V(w){let L=w.selfUs;for(let z of w.children.values())L+=V(z);return w.totalUs=L,L}V(j);let J=new Map;function Q(w){let L=J.get(w.frameIx);if(L)L.selfUs+=w.selfUs,L.totalUs+=w.totalUs,L.samples+=w.samples;else J.set(w.frameIx,{frameIx:w.frameIx,selfUs:w.selfUs,totalUs:w.totalUs,samples:w.samples});for(let z of w.children.values())Q(z)}Q(j);let te=[...W.values()].map((w)=>({id:w.id,frameIx:w.frameIx,children:[...w.children.values()].map((L)=>L.id)})),ce={origin:"jsc-profile",samplingIntervalUs:i,frames:c,nodes:te,totals:[...J.values()].sort((w,L)=>L.selfUs-w.selfUs),samples:{nodeIds:ne,timeDeltasUs:re}},ee=[...H.entries()].flatMap(([w,L])=>[...L.entries()].sort((z,le)=>le[1]-z[1]).slice(0,3).map(([z,le])=>({tier:w,frameKey:c[z].key,samples:le})));return{cpu:ce,jit:{origin:"jsc-profile",tiers:_,topFramesByTier:ee}}}var hn=1000;async function B(n,s={}){let i=s.intervalUs??hn,u,c=Bun.nanoseconds(),b=await bn(async()=>(u=await n(),u),i),I=Bun.nanoseconds()-c,{cpu:C,jit:S}=Ue(b.stackTraces,i);return{result:u,cpu:C,jit:S,diagnosticWallNs:I}}var wn=500,kn=20,$e=3,yn=10,Tn=2,xn=0.1,Sn=1000,Mn=1e4;function Le(n){let s=Math.log10(Math.max(1,n)/1e6),i=Math.round($e+Tn*s);return Math.min(yn,Math.max($e,i))}function Rn(n,s){let i=Math.floor(s/n);return Math.min(kn,Math.max(i,Le(n)))}var De=0;function U(n){if(typeof n==="number")De+=n;else if(n!==void 0&&n!==null)De+=1}function be(n){return n!==null&&typeof n==="object"&&typeof n.then==="function"}function _e(n,s){return Math.max(1,Math.ceil(Sn/n),Math.ceil(s/(n*Mn)))}async function We(n,s={}){let i=(s.budgetMs??wn)*1e6,u=i*(s.warmup??xn),c=Bun.nanoseconds(),b=0,I=0;while(I<u){let ee=n();U(be(ee)?await ee:ee),b++,I=Bun.nanoseconds()-c}let C;if(b>0)C=Math.max(1,I/b);else{let ee=Bun.nanoseconds(),ae=n();U(be(ae)?await ae:ae),C=Math.max(1,Bun.nanoseconds()-ee)}let S=_e(C,i);if(S>1){let ee=Bun.nanoseconds();for(let ae=0;ae<S;ae++){let w=n();U(be(w)?await w:w)}C=Math.max(1,(Bun.nanoseconds()-ee)/S),S=_e(C,i)}let j=C*S,W=s.samples??s.minSamples??Rn(j,i),_=s.samples!==void 0?0:i,H=[],ne=Bun.nanoseconds(),re=0,V=0;while(V<W||re<_){let ee=Bun.nanoseconds();for(let w=0;w<S;w++){let L=n();U(be(L)?await L:L)}let ae=Bun.nanoseconds();if(H.push({i:V,wallNs:(ae-ee)/S}),V++,re=Bun.nanoseconds()-ne,s.gc)Bun.gc(!0);if(s.samples!==void 0&&V>=s.samples)break}let J=H.map((ee)=>ee.wallNs),Q=k(J);if(S>1)Q.batch=S;let te=O(Q,[],"inprocess"),ce=Le(j);if(H.length<ce)te.push({code:"low-sample-count",message:`Only ${H.length} sample(s) at ~${vn(j)} per trial; ${ce} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:H.length,target:ce,trialCostNs:j}});return{trials:H,timing:Q,warnings:te}}function vn(n){if(n>=1e9)return`${(n/1e9).toFixed(2)}s`;if(n>=1e6)return`${(n/1e6).toFixed(1)}ms`;if(n>=1000)return`${(n/1000).toFixed(1)}\xB5s`;return`${n.toFixed(0)}ns`}var Re=[],oe,fe;function Se(n,s,i,u){let c=oe;oe={name:n,description:i?.description,isolate:i?.isolate,gc:i?.gc,cpu:i?.cpu,alloc:i?.alloc,before:i?.before,after:i?.after,skip:u.skip,only:u.only};try{s()}finally{oe=c}}var se=Object.assign((n,s,i)=>Se(n,s,i,{}),{skip:(n,s,i)=>Se(n,s,i,{skip:!0}),only:(n,s,i)=>Se(n,s,i,{only:!0})});function Me(n,s,i,u){let c=fe!==void 0||i?.params!==void 0?{...fe,...i?.params}:void 0;Re.push({groupName:oe?.name,groupDescription:oe?.description,groupIsolate:oe?.isolate,groupGc:oe?.gc,groupCpu:oe?.cpu,groupAlloc:oe?.alloc,groupBefore:oe?.before,groupAfter:oe?.after,name:n,fn:s,baseline:i?.baseline,params:c,skipped:u.skip||oe?.skip,only:u.only||oe?.only,opts:i})}var ie=Object.assign((n,s,i)=>Me(n,s,i,{}),{skip:(n,s,i)=>Me(n,s,i,{skip:!0}),only:(n,s,i)=>Me(n,s,i,{only:!0})});function M(){return Re}function X(){Re.length=0,oe=void 0,fe=void 0}function Z(n,s){let i=fe;fe=n;try{return s()}finally{fe=i}}function v(n){return n.groupName?`${n.groupName}/${n.name}`:n.name}function G(n,s){return n.opts?.isolate??n.groupIsolate??s}function je(n,s){return n.opts?.gc??n.groupGc??s}function Ge(n,s){return n.opts?.cpu??n.groupCpu??s}function He(n,s){return n.opts?.alloc??n.groupAlloc??s}function T(n,s){if(!s)return[...n];let i=new RegExp(s);return n.filter((u)=>i.test(v(u)))}import{heapStats as In}from"bun:jsc";var Nn=100;function Je(){try{return In().heapSize}catch{return process.memoryUsage().heapUsed}}async function Ve(n,s=Nn){let i=Bun.nanoseconds();Bun.gc(!0);let u=Je();for(let I=0;I<s;I++){let C=n();if(C instanceof Promise)await C}Bun.gc(!0);let c=Je(),b=Bun.nanoseconds()-i;return{memory:{origin:"heapStats",bytesPerOp:Math.max(0,(c-u)/s)},diagnosticWallNs:b}}var On=200,Pn=20;async function ze(n,s=On){let i=s*1e6,u=async()=>{let C=Bun.nanoseconds();while(Bun.nanoseconds()-C<i){let S=n();if(S instanceof Promise)await S}},{cpu:c,jit:b,diagnosticWallNs:I}=await B(u);return{cpu:c,jit:b,diagnosticWallNs:I}}function Ke(n){let{llint:s,baseline:i,dfg:u,ftl:c}=n.tiers,b=s+i+u+c;if(b===0)return;let I=s/b*100,C=i/b*100,S=u/b*100,j=c/b*100;if(I+C<=Pn)return;return{code:"jit-cold",message:`${(I+C).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:I,baselinePct:C,dfgPct:S,ftlPct:j}}}async function R(n,s,i){let c=s.some((W)=>!W.skipped)&&i.noiseCheck!==!1?g():void 0,b=c?h(c):void 0,I=new Map,C=new Map;s.forEach((W,_)=>{if(W.groupName===void 0||W.skipped)return;if(!I.has(W.groupName))I.set(W.groupName,_);C.set(W.groupName,_)});let S=[],j=[];for(let W=0;W<s.length;W++){let _=s[W],H=v(_),ne=Be(n,H,{label:H,baseline:_.baseline,group:_.groupName,description:_.opts?.description,groupDescription:_.groupDescription,isolated:i.markIsolated,params:_.params,skipped:_.skipped});if(S.push(ne),_.skipped)continue;let re=_.groupName!==void 0&&I.get(_.groupName)===W,V=_.groupName!==void 0&&C.get(_.groupName)===W;if(re&&_.groupBefore)await _.groupBefore();if(_.opts?.before)await _.opts.before();let J={budgetMs:_.opts?.budgetMs??i.budgetMs,samples:_.opts?.samples??i.samples,minSamples:_.opts?.minSamples??i.minSamples,warmup:i.warmup,gc:je(_,i.gc??!1)},Q=await We(_.fn,J);if(j.push(d({workload:ne,configFingerprint:o({budgetMs:J.budgetMs??null,samples:J.samples??null,minSamples:J.minSamples??null,gc:J.gc??!1}),trials:Q.trials,timing:Q.timing,warnings:b&&j.length===0?[...Q.warnings,b]:Q.warnings})),Ge(_,i.cpu??!1)){let te=await ze(_.fn),ce=Ke(te.jit);j.push(p({workload:ne,phase:"cpu",configFingerprint:o({cpu:!0}),diagnosticWallNs:te.diagnosticWallNs,cpu:te.cpu,jit:te.jit,warnings:ce?[ce]:[],artifacts:[]}))}if(He(_,i.alloc??!1)){let te=await Ve(_.fn);j.push(p({workload:ne,phase:"memstats",configFingerprint:o({alloc:!0}),diagnosticWallNs:te.diagnosticWallNs,memory:te.memory,warnings:[],artifacts:[]}))}if(_.opts?.after)await _.opts.after();if(V&&_.groupAfter)await _.groupAfter()}return t(S,j,c)}
|
|
12
|
+
export{y,e,k,l,O,N,D,q,F,m,x,t,P,K,d,p,Y,o,f,E,a,A,r,g,h,B,U,se,ie,M,X,Z,v,G,T,R};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{y,e,k,l,O,N,D,q,F,m,t,P,K,d,p,Y,o,f,r,g,h,B,M,Z,T,R}from"./chunk-1wydyvyj.js";function _e(a,x,v){let E=a[0];if(E==="bun"||E?.endsWith("/bun"))return{argv:[E,...x,...a.slice(1)],env:v};return{argv:a,env:{...process.env,...v,BUN_OPTIONS:x.join(" ")}}}function Gn(a){return a.startsWith("file://")?a.slice(7):a}function je(a,x,v){let E=a.nodes,U=E.length,ie=new Map,G=[],A=new Map,ae=new Int32Array(U);for(let se=0;se<U;se++){let ge=E[se],ce=ge.callFrame,we=Gn(ce.url),Me=ie.get(ce.functionName);if(Me===void 0)Me=new Map,ie.set(ce.functionName,Me);let Pe=Me.get(we);if(Pe===void 0)Pe=G.length,Me.set(we,Pe),G.push({key:e("fr",ce.functionName,we),name:ce.functionName,url:we||void 0,line:ce.lineNumber>=0?ce.lineNumber:void 0,col:ce.columnNumber>=0?ce.columnNumber:void 0});ae[se]=Pe,A.set(ge.id,se)}let X=Array(U);for(let se=0;se<U;se++){let ge=E[se];X[se]={id:ge.id,frameIx:ae[A.get(ge.id)],children:ge.children??[]}}let oe=new Float64Array(U),ue=new Float64Array(U),{samples:me,timeDeltas:le}=a;for(let se=0;se<me.length;se++){let ge=A.get(me[se]);if(ge===void 0)continue;oe[ge]+=le[se]??0,ue[ge]+=1}let de=new Int32Array(U).fill(-1);for(let se=0;se<U;se++){let ge=E[se].children;if(!ge)continue;for(let ce of ge){let we=A.get(ce);if(we!==void 0)de[we]=se}}let fe=[],pe=[];for(let se=U-1;se>=0;se--)if(de[se]===-1)pe.push(se);while(pe.length>0){let se=pe.pop();fe.push(se);let ge=E[se].children;if(!ge)continue;for(let ce of ge){let we=A.get(ce);if(we!==void 0&&de[we]===se)pe.push(we)}}let he=new Float64Array(U);for(let se=fe.length-1;se>=0;se--){let ge=fe[se];he[ge]+=oe[ge];let ce=de[ge];if(ce>=0)he[ce]+=he[ge]}let ye=Array(G.length),be=[];for(let se=0;se<U;se++){let ge=X[se].frameIx,ce=ye[ge];if(ce)ce.selfUs+=oe[se],ce.totalUs+=he[se],ce.samples+=ue[se];else{let we={frameIx:ge,selfUs:oe[se],totalUs:he[se],samples:ue[se]};ye[ge]=we,be.push(we)}}return{origin:x,samplingIntervalUs:v,frames:G,nodes:X,totals:be.sort((se,ge)=>ge.selfUs-se.selfUs),samples:{nodeIds:a.samples,timeDeltasUs:a.timeDeltas}}}async function on(a){let x=`${a.artifactDir}/${a.fileName}`,{argv:v,env:E}=_e(a.argv,["--cpu-prof","--cpu-prof-dir",a.artifactDir,"--cpu-prof-name",a.fileName,"--cpu-prof-interval",String(a.intervalUs)],a.env),U=Bun.nanoseconds(),G=await Bun.spawn(v,{cwd:a.cwd,env:E,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,A=Bun.nanoseconds()-U,ae=Bun.file(x);if(!await ae.exists())return{diagnosticWallNs:A,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${x} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:x,argv:a.argv}}]};let X=await ae.json(),oe=je(X,"cpu-prof",a.intervalUs),ue=X.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:A,exitCode:G,artifactPath:x,cpu:oe,warnings:ue}}function sn(a,x="heap-prof"){let{node_fields:v,node_types:E}=a.snapshot.meta,U=v.indexOf("type"),ie=v.indexOf("self_size"),G=v.length,A=E[0];if(U===-1||ie===-1||!Array.isArray(A))return{origin:x,typeCounts:[],objectCount:a.snapshot.node_count};let ae=A.length,X=Array(ae),oe=new Map,ue=[],me=0,le=a.nodes,de=le.length;for(let be=0;be<de;be+=G){let se=le[be+U],ge=le[be+ie]??0;me+=ge;let ce;if(se>=0&&se<ae){if(ce=X[se],ce===void 0)ce={type:A[se],count:0,bytes:0},X[se]=ce,ue.push(ce)}else{let we=`unknown(${se})`;if(ce=oe.get(we),ce===void 0)ce={type:we,count:0,bytes:0},oe.set(we,ce),ue.push(ce)}ce.count++,ce.bytes+=ge}let fe=ue.sort((be,se)=>se.count-be.count),pe=fe.slice(0,20),he=fe.slice(20),ye=pe.map(({type:be,count:se,bytes:ge})=>({type:be,count:se,retainedBytes:ge}));if(he.length>0){let be=0,se=0;for(let ge of he)be+=ge.count,se+=ge.bytes;ye.push({type:"other",count:be,retainedBytes:se})}return{origin:x,heapSizeBytes:me,objectCount:a.snapshot.node_count,typeCounts:ye}}async function an(a){let x=`${a.artifactDir}/${a.fileName}`,{argv:v,env:E}=_e(a.argv,["--heap-prof","--heap-prof-dir",a.artifactDir,"--heap-prof-name",a.fileName],a.env),U=Bun.nanoseconds(),G=await Bun.spawn(v,{cwd:a.cwd,env:E,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,A=Bun.nanoseconds()-U,ae=Bun.file(x);if(!await ae.exists())return{diagnosticWallNs:A,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${x} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:x,argv:a.argv}}]};let X=await ae.json(),oe=sn(X,"heap-prof");return{diagnosticWallNs:A,exitCode:G,artifactPath:x,heap:oe,warnings:[]}}var Kn=1000;async function mn(a,x={}){let v=x.intervalUs??Kn,{Session:E}=await import("inspector/promises"),U=new E;U.connect();let ie=Bun.nanoseconds();try{await U.post("Profiler.enable"),await U.post("Profiler.setSamplingInterval",{interval:v}),await U.post("Profiler.start");let G=await a(),{profile:A}=await U.post("Profiler.stop"),ae=Bun.nanoseconds()-ie,X=je(A,"inspector",v);return{result:G,cpu:X,diagnosticWallNs:ae}}finally{U.disconnect()}}function Jn(a){let x=a>>>0;return()=>{x=x+1831565813|0;let v=Math.imul(x^x>>>15,1|x);return v=v+Math.imul(v^v>>>7,61|v)^v,((v^v>>>14)>>>0)/4294967296}}var Ve=2000,Yn=2000;function qn(a){let x=a.length,v=x>>1;return x%2===0?(a[v-1]+a[v])/2:a[v]}function cn(a,x,v){if(a.length<=v)return a;let E=[...a];for(let U=0;U<v;U++){let ie=U+Math.floor(x()*(E.length-U)),G=E[U];E[U]=E[ie],E[ie]=G}return E.slice(0,v)}class Qe{sorted;rankOf;counts;n;constructor(a){let x=a.length,v=new Uint32Array(x);for(let E=0;E<x;E++)v[E]=E;v.sort((E,U)=>a[E]-a[U]),this.sorted=new Float64Array(x),this.rankOf=new Uint32Array(x);for(let E=0;E<x;E++)this.sorted[E]=a[v[E]],this.rankOf[v[E]]=E;this.n=x,this.counts=new Uint32Array(x)}resampleMedian(a){let{n:x,counts:v,sorted:E,rankOf:U}=this;v.fill(0);for(let X=0;X<x;X++)v[U[Math.floor(a()*x)]]++;let ie=x+1>>1,G=x%2===0?ie+1:ie,A=0,ae=-1;for(let X=0;X<x;X++){if(A+=v[X],ae<0&&A>=ie)ae=X;if(A>=G)return ae===X?E[X]:(E[ae]+E[X])/2}return E[x-1]}}function un(a,x,v={}){let E=v.seed??(Date.now()^Math.imul(a.length,2654435761))>>>0,U=Jn(E),ie=v.iterations??Yn,G=a.length>Ve||x.length>Ve,A=new Qe(cn(a,U,Ve)),ae=new Qe(cn(x,U,Ve)),X=qn(A.sorted),oe=new Float64Array(ie);for(let ue=0;ue<ie;ue++){let me=A.resampleMedian(U),le=ae.resampleMedian(U);oe[ue]=X===0?le-me===0?0:1/0:(le-me)/X*100}return oe.sort(),{ci95:[l(oe,0.025),l(oe,0.975)],seed:E,data:{subsampled:G,iterations:ie}}}function Qn(a){let x=a<0?-1:1,v=Math.abs(a),E=0.254829592,U=-0.284496736,ie=1.421413741,G=-1.453152027,A=1.061405429,ae=0.3275911,X=1/(1+0.3275911*v),oe=1-((((1.061405429*X+-1.453152027)*X+1.421413741)*X+-0.284496736)*X+0.254829592)*X*Math.exp(-v*v);return x*oe}function Xn(a){return 0.5*(1+Qn(a/Math.SQRT2))}function ln(a,x){let v=a.length,E=x.length,U=v+E,ie=new Float64Array(a),G=new Float64Array(x);ie.sort(),G.sort();let A=0,ae=0,X=0,oe=0,ue=0;while(X<v||oe<E){let he=oe>=E||X<v&&ie[X]<=G[oe]?ie[X]:G[oe],ye=0;while(X<v&&ie[X]===he)ye++,X++;let be=0;while(oe<E&&G[oe]===he)be++,oe++;let se=ye+be,ge=ue+(se+1)/2;if(A+=ye*ge,se>1)ae+=se**3-se;ue+=se}let me=A-v*(v+1)/2,le=v*E/2,de=Math.sqrt(v*E*(U+1-ae/(U*(U-1)))/12),fe=de===0?0:(me-le)/de,pe=Math.min(1,Math.max(0,2*(1-Xn(Math.abs(fe)))));return{u:me,z:fe,pValue:pe}}var c={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Xe=5;function He(a,x){if(a===0)return x===0?0:1/0;return(x-a)/a*100}function dn(a){let x=new Map;for(let v of a.measurements){let E=`${v.workloadId}\x00${v.phase}`;if(!x.has(E))x.set(E,v)}return x}function Zn(a,x,v){return{base:a,cand:x,baseByPhase:dn(a),candByPhase:dn(x),candWorkloads:new Map(x.workloads.map((E)=>[E.id,E])),environmentMismatch:et(a,x),effectiveTimingPct:Math.max(v.timingPct,a.environment?.noise.floorPct??0,x.environment?.noise.floorPct??0)}}function et(a,x){let v=[];if(a.platform.os!==x.platform.os)v.push({field:"platform.os",base:a.platform.os,cand:x.platform.os});if(a.platform.arch!==x.platform.arch)v.push({field:"platform.arch",base:a.platform.arch,cand:x.platform.arch});if(a.bunVersion!==x.bunVersion)v.push({field:"bunVersion",base:a.bunVersion,cand:x.bunVersion});if(a.environment&&x.environment){if(a.environment.cpuModel!==x.environment.cpuModel)v.push({field:"cpuModel",base:a.environment.cpuModel,cand:x.environment.cpuModel});if(a.environment.cores!==x.environment.cores)v.push({field:"cores",base:a.environment.cores,cand:x.environment.cores})}if(v.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${v.map((E)=>E.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:v}}}function nt(a){let x=[];for(let E of a){if(!E.timing)continue;let U=1+E.timing.medianDeltaPct/100;if(Number.isFinite(U)&&U>0)x.push(Math.log(U))}if(x.length===0)return null;let v=x.reduce((E,U)=>E+U,0)/x.length;return(Math.exp(v)-1)*100}function W(a,x,v=c){let E=Zn(a,x,v);return{effectiveTimingPct:E.effectiveTimingPct,compare:(U)=>tt(E,U,v),unmatched(){let U=new Set(a.workloads.map((ie)=>ie.id));return{baseOnly:a.workloads.filter((ie)=>!E.candWorkloads.has(ie.id)),candOnly:x.workloads.filter((ie)=>!U.has(ie.id))}}}}function j(a,x){let v=0,E=0,U=0;for(let ie of a){if(!ie.timing)continue;if(ie.timing.verdict==="regressed")v++;else if(ie.timing.verdict==="improved")E++;else U++}return{matched:a.length,regressed:v,improved:E,unchanged:U,geomeanPct:nt(a),effectiveTimingPct:x,verdict:a.some((ie)=>ie.verdict==="fail")?"fail":"pass"}}function C(a,x,v=c){let E=W(a,x,v),U=[];for(let ie of a.workloads){let G=E.compare(ie.id);if(G)U.push(G)}return{comparisons:U,unmatched:E.unmatched(),summary:j(U,E.effectiveTimingPct)}}function tt(a,x,v){let{baseByPhase:E,candByPhase:U,effectiveTimingPct:ie}=a,G=E.get(`${x}\x00timing`),A=U.get(`${x}\x00timing`),ae=E.get(`${x}\x00cpu`),X=U.get(`${x}\x00cpu`),oe=E.get(`${x}\x00heap`),ue=U.get(`${x}\x00heap`),me=a.candWorkloads.get(x),le=G?.id??ae?.id??oe?.id,de=A?.id??X?.id??ue?.id??me?.id;if(!le||!de)return;let fe=!1,pe=[];if(a.environmentMismatch)pe.push(a.environmentMismatch);let he;if(G?.timing&&me?.skipped&&!A?.timing)he={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},pe.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:x}});else if(G?.timing&&A?.timing){let se=G.timing.samples,ge=A.timing.samples,ce=He(G.timing.median,A.timing.median),we=He(G.timing.mean,A.timing.mean),Me=(Pe,xe)=>{if(Pe>ie)return"regressed";if(xe<-ie)return"improved";return"unchanged"};if(se.length<Xe||ge.length<Xe){let Pe=Me(ce,ce);if(Pe==="regressed")fe=!0;he={medianDeltaPct:ce,meanDeltaPct:we,verdict:Pe},pe.push({code:"thin-comparison",message:`Only ${se.length} baseline / ${ge.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Xe}+ per side).`,data:{baseSamples:se.length,candSamples:ge.length}})}else{let Pe=un(se,ge,{iterations:v.bootstrapIterations}),xe=ln(se,ge),ke=xe.pValue<v.alpha?Me(Pe.ci95[0],Pe.ci95[1]):"unchanged";if(ke==="regressed")fe=!0;he={medianDeltaPct:ce,meanDeltaPct:we,ci95:Pe.ci95,pValue:xe.pValue,seed:Pe.seed,verdict:ke}}}let ye;if(ae?.cpu&&X?.cpu){let se=new Map(ae.cpu.totals.map((Pe)=>[ae.cpu.frames[Pe.frameIx].key,Pe])),ge=new Map(X.cpu.totals.map((Pe)=>[X.cpu.frames[Pe.frameIx].key,Pe])),ce=new Map(ae.cpu.frames.map((Pe)=>[Pe.key,Pe.name])),we=new Map(X.cpu.frames.map((Pe)=>[Pe.key,Pe.name]));ye=[...new Set([...se.keys(),...ge.keys()])].map((Pe)=>{let xe=se.get(Pe)?.selfUs??0,ke=ge.get(Pe)?.selfUs??0;return{frameKey:Pe,name:we.get(Pe)??ce.get(Pe)??Pe,baseSelfUs:xe,candSelfUs:ke,deltaPct:He(xe,ke)}}).sort((Pe,xe)=>Math.abs(xe.deltaPct)-Math.abs(Pe.deltaPct));for(let Pe of ye)if((Pe.baseSelfUs>=v.minFrameSelfUs||Pe.candSelfUs>=v.minFrameSelfUs)&&Pe.deltaPct>v.frameSelfPct)fe=!0}let be;if(oe?.heap&&ue?.heap){let se=new Map(oe.heap.typeCounts.map((we)=>[we.type,we])),ge=new Map(ue.heap.typeCounts.map((we)=>[we.type,we]));be=[...new Set([...se.keys(),...ge.keys()])].map((we)=>{let Me=se.get(we),Pe=ge.get(we);return{type:we,baseCount:Me?.count??0,candCount:Pe?.count??0,baseBytes:Me?.retainedBytes,candBytes:Pe?.retainedBytes,deltaPct:He(Me?.count??0,Pe?.count??0)}}).sort((we,Me)=>Math.abs(Me.deltaPct)-Math.abs(we.deltaPct));for(let we of be)if(we.deltaPct>v.heapTypePct)fe=!0}return{id:e("cmp",le,de),baselineMeasurementId:le,candidateMeasurementId:de,timing:he,...pe.length>0&&{warnings:pe},frames:ye,heapTypes:be,thresholds:{...v,effectiveTimingPct:ie},verdict:fe?"fail":"pass"}}var Be="node_modules/.cache/ostia",rt=".ostia/baselines",it={runs:null,warmup:3,outDir:Be,baselineDir:rt,baseline:"main",cpuIntervalUs:1000,thresholds:c,workloads:[]};function gn(a){return{...it,...a,thresholds:{...c,...a.thresholds??{}}}}async function pn(a){let x=Bun.file(a);if(!await x.exists())return;return gn(await x.json())}async function fn(a){let x=a.startsWith("/")?a:`${process.cwd()}/${a}`;if(!await Bun.file(x).exists())return;let v=await import(x);return gn(v.default??{})}async function S(a){if(a!==void 0)return a.endsWith(".ts")?fn(a):pn(a);return await fn("ostia.config.ts")??pn("ostia.config.json")}function s(a,x){return`${a.baselineDir}/${x??a.baseline}.json`}async function L(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var ot=10,st=3000000000,at=3;function Ze(a){if(a.timeSource)N(a.timeSource);let x=a.warmup??at,v=a.samples,E=a.minSamples??ot,U=v??E,ie=v!==void 0?0:a.budgetMs!==void 0?a.budgetMs*1e6:st,G=a.timeSource!==void 0,A=a.ignoreExitCodes??[],ae=new Set(A),X=[],oe=0,ue=0,me=!1,le;function de(){if(me)return!0;if(v!==void 0)return ue>=v;return ue>=U&&oe>=ie}async function fe(pe,he){if(a.prepare)await F(a.prepare,{phase:pe,index:he},{cwd:a.cwd,env:a.env,timeoutMs:a.timeoutMs,signal:a.signal});return q(a)}return{async warmup(){for(let pe=0;pe<x;pe++){if(a.signal?.aborted)return;await fe("warmup",pe)}},async step(){if(de()||a.signal?.aborted)return!1;let pe=await fe("timing",ue);if(a.signal?.aborted)return!1;if(pe.timeSourceNoMatch)le??=pe.timeSourceMissOutput;if(X.push({i:ue,wallNs:pe.wallNs,exitCode:pe.exitCode??void 0,userNs:pe.userNs,systemNs:pe.systemNs,maxRssBytes:pe.maxRssBytes,...pe.reportedNs!==void 0&&{reportedNs:pe.reportedNs},...pe.timedOut?{timedOut:!0}:{},...pe.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),oe+=pe.wallNs,ue++,a.failOnNonzero&&pe.exitCode!==null&&pe.exitCode!==0&&!ae.has(pe.exitCode))me=!0;return!0},done:de,result(){let pe=X.filter((ce)=>!ce.timedOut&&!ce.timeSourceNoMatch),he=pe.map((ce)=>G?ce.reportedNs:ce.wallNs),ye=[],be=X.filter((ce)=>ce.timedOut).length;if(be>0)ye.push({code:"timeout",message:`${be} of ${X.length} trial(s) timed out after ${a.timeoutMs}ms.`,data:{timeoutMs:a.timeoutMs,trials:be}});let se=X.filter((ce)=>ce.timeSourceNoMatch).length;if(se>0&&a.timeSource){let{pattern:ce}=a.timeSource;ye.push({code:"time-source-no-match",message:`${se} of ${X.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof ce==="string"?ce:ce.source,trials:se,...le!==void 0&&{output:le}}})}if(he.length===0)return{trials:X,warnings:ye};let ge=k(he);return ye.push(...O(ge,pe.map((ce)=>ce.exitCode),G?"reported":"subprocess",A)),{trials:X,timing:ge,warnings:ye}}}}async function en(a){await a.warmup();while(await a.step());}async function z(a){let x=Ze(a);return await en(x),x.result()}async function I(a,x){let v=new Set;for(let E of a)for await(let U of new Bun.Glob(E).scan({cwd:x,absolute:!1}))v.add(U);return[...v].sort()}var hn=new URL("./runner.ts",import.meta.url).pathname;function _(){return Math.max(1,navigator.hardwareConcurrency||1)}async function H(a,x){return I(a,x)}function mt(a){if(a===void 0)return;return a==="auto"?_():a}async function J(a,x,v=process.cwd()){return{suites:a.suites.length>0?a.suites:x?.suites?await H(x.suites,v):[],budgetMs:a.budgetMs??x?.budgetMs,samples:a.samples??x?.samples,minSamples:a.minSamples??x?.minSamples,jobs:a.jobs??mt(x?.jobs),gc:a.gc??x?.gc??!1,cpu:a.cpu??x?.cpu??!1,alloc:a.alloc??x?.alloc??!1,filter:a.filter??x?.filter,isolate:a.isolate??x?.isolate??!1,preload:a.preload.length>0?a.preload:x?.preload??[],bunFlags:a.bunFlags,outDir:a.outDir??x?.outDir,noiseCheck:a.noiseCheck,timeoutMs:a.timeoutMs??x?.timeoutMs,cwd:v}}async function b(a){if(a.samples!==void 0&&(!Number.isFinite(a.samples)||a.samples<1))throw RangeError(`bench: samples must be >= 1, got ${a.samples}`);if(a.minSamples!==void 0&&(!Number.isFinite(a.minSamples)||a.minSamples<1))throw RangeError(`bench: minSamples must be >= 1, got ${a.minSamples}`);if(a.budgetMs!==void 0&&!Number.isFinite(a.budgetMs))throw RangeError(`bench: budgetMs must be finite, got ${a.budgetMs}`);let v=`${a.outDir??Be}/bench-tmp`,E=a.cwd??process.cwd(),U=Math.max(1,Math.floor(a.jobs??1)),ie={budgetMs:a.budgetMs,samples:a.samples,minSamples:a.minSamples,gc:a.gc,cpu:a.cpu,alloc:a.alloc,noiseCheck:a.noiseCheck},G=(ue)=>ue.startsWith("/")?ue:`${E}/${ue}`,A=a.suites.map(G),ae=(a.preload??[]).map(G),X=a.bunFlags??[],oe=async(ue,me)=>{let le=new Set,de=0,fe,pe=async()=>{while(fe===void 0&&!a.signal?.aborted&&de<ue.length){let he=de++;try{let ye=D(a.timeoutMs,a.signal),be=Bun.spawn(ue[he],{cwd:E,stdout:"inherit",stderr:"inherit",stdin:"ignore",...ye.spawn});le.add(be);let se=await be.exited;if(le.delete(be),a.signal?.aborted)return;if(ye.timedOut())throw Error(`Bench suite timed out after ${a.timeoutMs}ms: ${me(he)}`);if(se!==0)throw Error(`Bench suite failed: ${me(he)} (runner exited ${se})`)}catch(ye){fe??=ye instanceof Error?ye:Error(String(ye));for(let be of le)be.kill()}}};if(await Promise.all(Array.from({length:Math.min(U,ue.length)},pe)),fe)throw fe};try{let ue=A.map((ce)=>`${v}/${e("bench-plan",ce)}.json`),me=A.map((ce)=>`${v}/${e("bench-primary",ce)}.json`),le=A.map((ce,we)=>["bun",...X,hn,ce,me[we],JSON.stringify({...ie,filter:a.filter,isolate:a.isolate,preload:ae,planPath:ue[we]})]);await oe(le,(ce)=>a.suites[ce]);let de=await Promise.all(ue.map(async(ce)=>{if(!await Bun.file(ce).exists())return[];let{tasks:we}=await Bun.file(ce).json();return we})),fe=await Promise.all(me.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),pe=[];for(let ce=0;ce<de.length;ce++)for(let we of de[ce])if(we.isolate)pe.push({suiteIndex:ce,taskIds:[we.id]});let he=pe.map((ce,we)=>`${v}/${e("bench-item",A[ce.suiteIndex],we)}.json`),ye=pe.map((ce,we)=>["bun",...X,hn,A[ce.suiteIndex],he[we],JSON.stringify({...ie,taskIds:ce.taskIds,preload:ae,markIsolated:!0})]);await oe(ye,(ce)=>a.suites[pe[ce].suiteIndex]);let be=await Promise.all(he.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),se=[],ge=[];for(let ce=0;ce<de.length;ce++){let we=fe[ce];if(!we)continue;let Me=new Map;for(let ke of we.measurements){let $e=Me.get(ke.workloadId)??[];$e.push(ke),Me.set(ke.workloadId,$e)}let Pe=0,xe=new Map;pe.forEach((ke,$e)=>{let Ce=be[$e];if(ke.suiteIndex===ce&&Ce)xe.set(ke.taskIds[0],Ce)});for(let ke of de[ce])if(ke.isolate){let $e=xe.get(ke.id);if(!$e)continue;let Ce=$e.workloads[0];se.push(Ce);for(let Le of $e.measurements)if(Le.workloadId===Ce.id)ge.push(Le)}else{let $e=we.workloads[Pe];se.push($e),Pe++;for(let Ce of Me.get($e.id)??[])ge.push(Ce)}}if(a.signal?.aborted&&ge.length>0){let ce=ge[ge.length-1];ce.warnings=[...ce.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return t(se,ge,fe.find((ce)=>ce!==void 0)?.environment)}finally{await Bun.spawn(["rm","-rf",v]).exited}}function Q(a,x,v=8){if(v<=1)throw RangeError(`range: multiplier must be > 1, got ${v}`);if(a<=0)throw RangeError(`range: start must be > 0, got ${a}`);let E=[];for(let U=a;U<=x;U*=v)E.push(U);if(!E.includes(x))E.push(x);return E}function Se(a,x){if(x){let v=a.measurements.find((E)=>E.id===x);return v?.cpu?[v]:[]}return a.measurements.filter((v)=>v.phase==="cpu"&&v.cpu)}function Oe(a){let x=a.nodes,v=x.length,E=ct(a),U=new Int32Array(v).fill(-1);for(let ae=0;ae<v;ae++)for(let X of x[ae].children){let oe=E(X);if(oe!==-1)U[oe]=ae}let ie=[];for(let ae=0;ae<v;ae++)if(U[ae]===-1)ie.push(ae);let G=[],A=[];for(let ae=ie.length-1;ae>=0;ae--)A.push(ie[ae]);while(A.length>0){let ae=A.pop();G.push(ae);for(let X of x[ae].children){let oe=E(X);if(oe!==-1&&U[oe]===ae)A.push(oe)}}return{count:v,indexOf:E,parentIx:U,roots:ie,order:G}}function ct(a){let x=a.nodes,v=x.length,E=1/0,U=-1/0,ie=!0;for(let A=0;A<v;A++){let ae=x[A].id;if(!Number.isInteger(ae)){ie=!1;break}if(ae<E)E=ae;if(ae>U)U=ae}if(ie&&v>0&&U-E<v*4+64){let A=U-E+1,ae=new Int32Array(A).fill(-1);for(let X=0;X<v;X++)ae[x[X].id-E]=X;return(X)=>{let oe=X-E;return oe>=0&&oe<A?ae[oe]:-1}}let G=new Map;for(let A=0;A<v;A++)G.set(x[A].id,A);return(A)=>G.get(A)??-1}function bn(a,x){let{count:v,indexOf:E,parentIx:U,order:ie}=x,G=new Float64Array(v),A=new Float64Array(v),ae=a.samples?.nodeIds??[],X=a.samples?.timeDeltasUs??[];for(let ue=0;ue<ae.length;ue++){let me=E(ae[ue]);if(me===-1)continue;G[me]+=X[ue]??0,A[me]+=1}let oe=new Float64Array(v);for(let ue=ie.length-1;ue>=0;ue--){let me=ie[ue];oe[me]+=G[me];let le=U[me];if(le>=0)oe[le]+=oe[me]}return{selfUs:G,totalUs:oe,samples:A}}var wn={name:"collapsed",async render(a,x={}){return{files:Se(a,x.measurementId).map((U)=>{let ie=U.cpu,{nodes:G,frames:A}=ie,ae=Oe(ie),X=Array(ae.count);for(let de of ae.order){let fe=A[G[de].frameIx].name||"(anonymous)",pe=ae.parentIx[de];X[de]=pe===-1?fe:`${X[pe]};${fe}`}let oe=new Float64Array(ae.count),ue=[],me=ie.samples?.nodeIds??[];for(let de=0;de<me.length;de++){let fe=ae.indexOf(me[de]);if(fe===-1)continue;if(oe[fe]++===0)ue.push(fe)}let le=Array(ue.length);for(let de=0;de<ue.length;de++){let fe=ue[de];le[de]=`${X[fe]} ${oe[fe]}`}return{path:`${U.id}.collapsed.txt`,content:le.join(`
|
|
3
|
+
`)+(le.length>0?`
|
|
4
|
+
`:"")}})}}};var yn={name:"cpuprofile",async render(a,x={}){let v=Se(a,x.measurementId),E=[],U=[];for(let ie of v){if(ie.cpu?.origin!=="cpu-prof"&&ie.cpu?.origin!=="inspector"){U.push(`${ie.id} (origin ${ie.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let G=ie.artifacts.find((ae)=>ae.kind==="cpuprofile");if(!G){U.push(`${ie.id} (no cpuprofile artifact recorded on this run)`);continue}let A=Bun.file(G.path);if(!await A.exists()){U.push(`${ie.id} (artifact missing on disk: ${G.path})`);continue}E.push({path:`${ie.id}.cpuprofile`,content:await A.text()})}if(E.length===0&&U.length>0)return{text:`No .cpuprofile artifacts available:
|
|
5
|
+
${U.map((ie)=>` - ${ie}`).join(`
|
|
6
|
+
`)}
|
|
7
|
+
`};return{files:E}}};var xn={name:"json",async render(a){return{text:f(a)}}};var Pn={name:"jsonl",async render(a){let{measurements:x,...v}=a;return{text:`${[y({kind:"document",...v}),...x.map((U)=>y({kind:"measurement",...U}))].join(`
|
|
8
|
+
`)}
|
|
9
|
+
`}}};var Ne=0.5,ut={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function Ae(a){let x=Math.abs(a);if(x>=1e9)return"s";if(x>=1e6)return"ms";if(x>=1000)return"\xB5s";return"ns"}function lt(a){let x=Math.floor(Math.log10(Math.max(Math.abs(a),1)))+1;return Math.max(1,3-x)}function ve(a,x=Ae(a)){let v=a/ut[x];return`${v.toFixed(lt(v))} ${x}`}function ze(a){return`${a.cpuModel} \xB7 ${a.cores} cores \xB7 load ${a.loadAvg1.toFixed(1)} \xB7 noise floor ${a.noise.floorPct.toFixed(1)}%`}function w(a){return`${a.sha} (${a.branch}${a.dirty?", dirty":""})`}function n(a){return a?.label??a?.command?.join(" ")??a?.entry?.task??a?.id??"unknown"}function Ge(a,x){if(a===1)return x?"1.00\xD7 (baseline)":"1.00\xD7";if(a>1)return`${a.toFixed(2)}\xD7 slower`;return`${(1/a).toFixed(2)}\xD7 faster`}function kn(a){return a.replace(/\|/g,"\\|").replace(/</g,"<").replace(/>/g,">").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function Ke(a){if(!a?.entry)return;if(a.entry.group!==void 0)return a.entry.group;let x=a.entry.task,v=x.lastIndexOf("/");return v===-1?void 0:x.slice(0,v)}function Fe(a){let x=Math.min(...a.map((U)=>U.run.timing.median)),v=new Map;for(let U of a){let ie=Ke(U.workload);if(ie===void 0)continue;let G=v.get(ie);if(G)G.push(U);else v.set(ie,[U])}let E=new Map;for(let U of a){let ie=Ke(U.workload);if(ie===void 0){E.set(U,x);continue}let G=v.get(ie)??[U],A=G.find((ae)=>ae.workload?.baseline);E.set(U,A?A.run.timing.median:Math.min(...G.map((ae)=>ae.run.timing.median)))}return E}function We(a){return a.measurements.filter((x)=>x.phase==="timing"&&x.timing!==void 0)}function Ee(a,x){let v=new Set(x.map((E)=>E.workloadId));return a.workloads.filter((E)=>E.skipped&&!v.has(E.id))}function Je(a){for(let x of a.comparisons??[]){let v=x.warnings?.find((E)=>E.code==="environment-mismatch");if(v)return v}return}function Mn(a){return(a/1e6).toFixed(3)}function Rn(a){if(!a?.params)return"";return` (${Object.entries(a.params).map(([v,E])=>`${v}=${E}`).join(", ")})`}function Te(a){return kn(String(a))}function dt(a){let x;for(let v of a){let E=v?.params?Object.keys(v.params):void 0;if(E?.length!==2)return;if(x===void 0)x=E;else if(E.length!==x.length||E.some((U,ie)=>U!==x[ie]))return}return x}var $n=10,vn=10,Cn={name:"markdown",async render(a){let x=new Map(a.workloads.map((A)=>[A.id,A])),v=[];v.push("# Profile Report","");let E=a.git?` \xB7 ${w(a.git)}`:"";if(v.push(`Bun ${a.bunVersion} \xB7 ostia ${a.toolVersion} \xB7 ${a.platform.os}/${a.platform.arch} \xB7 ${a.createdAt}${E}`,""),a.environment)v.push(ze(a.environment),"");let U=Je(a);if(U)v.push(`> \u26A0 ${U.message}`,"");let ie=We(a),G=Ee(a,ie);if(ie.length>0||G.length>0){v.push("## Timing","");let A=new Map,ae=[];for(let ue of ie){let me=x.get(ue.workloadId)?.entry?.group;if(me===void 0){ae.push(ue);continue}let le=A.get(me);if(le)le.push(ue);else A.set(me,[ue])}let X=new Map;for(let[ue,me]of A){let le=dt(me.map((de)=>x.get(de.workloadId)));if(le)X.set(ue,{keys:le,runs:me});else ae.push(...me)}if(ae.length>0||G.length>0){let ue=ie.map((he)=>({run:he,workload:x.get(he.workloadId)})),me=ue.length>1,le=me?Fe(ue):void 0,de=new Map(ue.map((he)=>[he.run.id,le?.get(he)??he.run.timing.median])),fe=me?" Relative |":"",pe=me?"---|":"";v.push(`| Task | Median | Spread (p75\u2026p99) | Mean \xB1 SD | Range | MAD |${fe}`,`|---|---|---|---|---|---|${pe}`);for(let he of ae){let ye=x.get(he.workloadId),be=Te(n(ye)+Rn(ye)),se=he.timing,ge=Ae(se.median),ce=se.p75??se.median,we=se.p99??se.max,Me=se.mad!==void 0?ve(se.mad,ge):"-",Pe=me?` ${Ge(se.median/(de.get(he.id)??se.median),!!ye?.baseline)} |`:"";v.push(`| ${be} | ${ve(se.median,ge)} | ${ve(ce,ge)}\u2026${ve(we,ge)} | ${ve(se.mean,ge)} \xB1 ${ve(se.stddev,ge)} | ${ve(se.min,ge)}\u2026${ve(se.max,ge)} | ${Me} |${Pe}`)}for(let he of G){let ye=Te(n(he)+Rn(he)),be=me?" - |":"";v.push(`| ${ye} | - skipped | - | - | - | - |${be}`)}v.push("")}for(let[ue,{keys:me,runs:le}]of X){let[de,fe]=me,pe=[],he=[],ye=new Map;for(let be of le){let se=x.get(be.workloadId).params,ge=se[de],ce=se[fe];if(!pe.includes(ge))pe.push(ge);if(!he.includes(ce))he.push(ce);ye.set(`${ge}\x00${ce}`,be)}v.push(`### ${Te(ue)} (${Te(de)} \xD7 ${Te(fe)})`,""),v.push(`| ${Te(de)} \\ ${Te(fe)} | ${he.map(Te).join(" | ")} |`,`|---|${he.map(()=>"---").join("|")}|`);for(let be of pe){let se=he.map((ge)=>{let ce=ye.get(`${be}\x00${ge}`);return ce?ve(ce.timing.median):"-"});v.push(`| ${Te(be)} | ${se.join(" | ")} |`)}v.push("")}let oe=ie.filter((ue)=>ue.warnings.length>0);if(oe.length>0){v.push("### Warnings","");for(let ue of oe){let me=n(x.get(ue.workloadId));for(let le of ue.warnings)v.push(`- **${me}**: ${le.message} (\`${le.code}\`)`)}v.push("")}}for(let A of a.measurements){if(A.phase!=="cpu"&&A.phase!=="heap")continue;let ae=n(x.get(A.workloadId));if(A.phase==="cpu"){if(v.push(`## CPU capture - ${ae}`,""),v.push(`instrumented, diagnostic wall ${Mn(A.diagnosticWallNs??0)}ms`,""),A.cpu){v.push(`origin: \`${A.cpu.origin}\`, interval: ${A.cpu.samplingIntervalUs}\xB5s`,""),v.push("| Self % | Self (ms) | Total (ms) | Frame |","|---|---|---|---|");let X=A.cpu.totals.reduce((oe,ue)=>oe+ue.selfUs,0)||1;for(let oe of A.cpu.totals.slice(0,$n)){let ue=A.cpu.frames[oe.frameIx],me=(oe.selfUs/X*100).toFixed(1);v.push(`| ${me}% | ${(oe.selfUs/1000).toFixed(2)} | ${(oe.totalUs/1000).toFixed(2)} | ${Te(ue?.name||"(anonymous)")} |`)}if(v.push(""),A.jit){let oe=A.jit.tiers;v.push(`JIT tiers: LLInt ${oe.llint} \xB7 Baseline ${oe.baseline} \xB7 DFG ${oe.dfg} \xB7 FTL ${oe.ftl}`,"")}}}else if(v.push(`## Heap snapshot - ${ae}`,""),v.push(`instrumented, diagnostic wall ${Mn(A.diagnosticWallNs??0)}ms`,""),A.heap){v.push(`${A.heap.objectCount??"?"} objects, ${((A.heap.heapSizeBytes??0)/1e6).toFixed(2)}MB`,""),v.push("| Count | Type |","|---|---|");for(let X of A.heap.typeCounts.slice(0,vn))v.push(`| ${X.count} | ${Te(X.type)} |`);v.push("")}for(let X of A.artifacts)v.push(`- artifact: \`${X.path}\``);for(let X of A.warnings)v.push(`- ! ${X.message} (\`${X.code}\`)`);if(A.artifacts.length>0||A.warnings.length>0)v.push("")}if(a.comparisons&&a.comparisons.length>0){v.push("## Comparisons","");for(let A of a.comparisons){let ae=a.measurements.find((oe)=>oe.id===A.candidateMeasurementId),X=n(ae?x.get(ae.workloadId):x.get(A.candidateMeasurementId));if(v.push(`### ${A.verdict==="pass"?"\u2713":"\u2717"} ${X}`,""),A.timing){let oe=A.timing.medianDeltaPct>0?"+":"",ue=A.timing.verdict==="unchanged"&&A.timing.pValue!==void 0&&A.timing.pValue>=A.thresholds.alpha?"~":"",me=[];if(ae?.timing)me.push(`n=${ae.timing.samples.length}`);if(A.timing.ci95)me.push(`95% CI [${A.timing.ci95[0]>0?"+":""}${A.timing.ci95[0].toFixed(1)}%, ${A.timing.ci95[1]>0?"+":""}${A.timing.ci95[1].toFixed(1)}%]`);if(A.timing.pValue!==void 0)me.push(`p=${A.timing.pValue.toFixed(4)}`);me.push(`threshold ${A.thresholds.effectiveTimingPct.toFixed(1)}%`),v.push(`- timing: ${ue}${oe}${A.timing.medianDeltaPct.toFixed(1)}% median, ${me.join(", ")} (**${A.timing.verdict}**)`)}for(let oe of A.frames?.slice(0,$n)??[]){if(Math.abs(oe.deltaPct)<Ne)continue;let ue=oe.deltaPct>0?"+":"";v.push(`- frame \`${Te(oe.name)}\`: ${ue}${oe.deltaPct.toFixed(1)}% self-time (${(oe.baseSelfUs/1000).toFixed(2)}ms \u2192 ${(oe.candSelfUs/1000).toFixed(2)}ms)`)}for(let oe of A.heapTypes?.slice(0,vn)??[]){if(Math.abs(oe.deltaPct)<Ne)continue;let ue=oe.deltaPct>0?"+":"";v.push(`- heap \`${Te(oe.type)}\`: ${ue}${oe.deltaPct.toFixed(1)}% count (${oe.baseCount} \u2192 ${oe.candCount})`)}for(let oe of A.warnings??[]){if(oe.code==="environment-mismatch")continue;v.push(`- ! ${oe.message} (\`${oe.code}\`)`)}v.push("")}}return{text:v.join(`
|
|
10
|
+
`)}}};var pt=15;function nn(a){return`n${a}`}function ft(a,x,v){return`${(a||"(anonymous)").replace(/"/g,"'")} (self ${(x/1000).toFixed(2)}ms, total ${(v/1000).toFixed(2)}ms)`}function gt(a,x,v,E){let U=[];if(E<=0)return U;for(let ie=0;ie<x;ie++){if(ie===v)continue;let G=a[ie];if(U.length===E&&G<=a[U[E-1]])continue;let A=U.length;while(A>0&&a[U[A-1]]<G)A--;if(U.splice(A,0,ie),U.length>E)U.pop()}return U}var Tn={name:"mermaid",async render(a,x={}){let v=x.topN??pt;return{files:Se(a,x.measurementId).map((ie)=>{let G=ie.cpu,{nodes:A,frames:ae}=G,X=Oe(G),{selfUs:oe,totalUs:ue}=bn(G,X),{parentIx:me}=X,le=X.roots[0]??-1,de=gt(oe,X.count,le,v),fe=new Set(le!==-1?[le]:[]),pe=[];for(let ye of de){pe.length=0;for(let be=ye;be!==-1;be=me[be])pe.push(be);for(let be=pe.length-1;be>=0;be--)fe.add(pe[be])}let he=["graph TD"];for(let ye of fe){let be=A[ye].id;he.push(` ${nn(be)}["${ft(ae[A[ye].frameIx].name,oe[ye],ue[ye])}"]`)}for(let ye of fe){let be=me[ye];if(be!==-1&&fe.has(be))he.push(` ${nn(A[be].id)} --> ${nn(A[ye].id)}`)}return{path:`${ie.id}.mermaid.md`,content:`${he.join(`
|
|
11
|
+
`)}
|
|
12
|
+
`}})}}};var u=1;function Re(a){return Number.isFinite(a)?Number(a.toPrecision(6)):a}function tn(a,x){return a?.entry?.task??a?.label??a?.command?.join(" ")??x}function In(a,x){if(x?.entry?.group!==void 0)a.group=x.entry.group;if(x?.description!==void 0)a.description=x.description;if(x?.groupDescription!==void 0)a.groupDescription=x.groupDescription;if(x?.params!==void 0)a.params=x.params}function Sn(a){if(!a?.timing)return;let x={medianPct:Re(a.timing.medianDeltaPct),meanPct:Re(a.timing.meanDeltaPct),verdict:a.timing.verdict,pass:a.verdict==="pass",effectiveTimingPct:Re(a.thresholds.effectiveTimingPct),matched:!0};if(a.timing.ci95)x.ci95=[Re(a.timing.ci95[0]),Re(a.timing.ci95[1])];if(a.timing.pValue!==void 0)x.pValue=Re(a.timing.pValue);return x}function ht(a,x,v,E){let U={event:"run",protocolVersion:u,schemaVersion:a.schemaVersion,workloadId:x.id,task:tn(x,x.id),skipped:!0,batch:1,warnings:(v?.warnings??[]).map((G)=>G.data?{code:G.code,data:G.data}:{code:G.code})};if(In(U,x),E!==void 0)U.noiseFloorPct=Re(E);let ie=Sn(v);if(ie)U.delta=ie;return U}function bt(a){let x=new Map(a.workloads.map((X)=>[X.id,X])),v=a.environment?.noise.floorPct,E=We(a).map((X)=>({run:X,workload:x.get(X.workloadId)})),U=E.length>1?Fe(E):void 0,ie=new Map((a.comparisons??[]).map((X)=>[X.candidateMeasurementId,X])),G=new Map;for(let X of a.measurements){if(X.phase!=="cpu"||X.warnings.length===0)continue;let oe=G.get(X.workloadId)??[];G.set(X.workloadId,[...oe,...X.warnings])}let A=Ee(a,E.map((X)=>X.run)).map((X)=>ht(a,X,ie.get(X.id),v));return[...E.map((X)=>{let{run:oe,workload:ue}=X,me=oe.timing,le=ie.get(oe.id),de={event:"run",protocolVersion:u,schemaVersion:a.schemaVersion,workloadId:oe.workloadId,task:tn(ue,oe.workloadId),unit:"ns",samples:me.samples.length,batch:me.batch??1,mean:Re(me.mean),median:Re(me.median),stddev:Re(me.stddev),stddevPct:Re(me.mean===0?0:me.stddev/me.mean*100),min:Re(me.min),max:Re(me.max),warnings:[...oe.warnings,...G.get(oe.workloadId)??[],...le?.warnings??[]].map((pe)=>pe.data?{code:pe.code,data:pe.data}:{code:pe.code})};if(me.p75!==void 0)de.p75=Re(me.p75);if(me.p99!==void 0)de.p99=Re(me.p99);if(me.mad!==void 0)de.mad=Re(me.mad);if(In(de,ue),U)de.relative=Re(me.median/(U.get(X)??me.median));if(ue?.baseline)de.baseline=!0;if(v!==void 0)de.noiseFloorPct=Re(v);let fe=Sn(le);if(fe)de.delta=fe;return de}),...A]}function wt(a){if(!a.unmatched)return[];let x=(v,E)=>({event:"unmatched",protocolVersion:u,workloadId:v.id,task:tn(v,v.id),side:E});return[...a.unmatched.baseOnly.map((v)=>x(v,"base")),...a.unmatched.candOnly.map((v)=>x(v,"cand"))]}function yt(a,x){let v=a.comparisonSummary,E=(x.unmatched?.baseOnly.length??0)+(x.unmatched?.candOnly.length??0),U={event:"summary",protocolVersion:u,command:x.command,matched:v?.matched??0,regressed:v?.regressed??0,improved:v?.improved??0,unchanged:v?.unchanged??0,unmatched:E,geomeanPct:v?.geomeanPct!==void 0?v.geomeanPct:null,effectiveTimingPct:Re(v?.effectiveTimingPct??0),verdict:x.exitCode===0?"pass":"fail",exitCode:x.exitCode};if(x.command==="ci"){if(U.cached=x.cached??0,U.executed=x.executed??0,U.failed=x.failed??0,U.missingBaseline=x.missingBaseline??0,x.baseline)U.baseline=x.baseline}if(a.environment)U.noiseFloorPct=Re(a.environment.noise.floorPct);if(x.baseGit||x.candGit)U.git={...x.baseGit&&{base:x.baseGit},...x.candGit&&{cand:x.candGit}};if(x.exportedTo)U.exportedTo=x.exportedTo;return U}var Dn={name:"minimal",async render(a,x={}){let v=[...bt(a)];if(x.protocol)v.push(...wt(x.protocol)),v.push(yt(a,x.protocol));let E=v.map((U)=>JSON.stringify(U));return{text:E.length>0?`${E.join(`
|
|
13
|
+
`)}
|
|
14
|
+
`:""}}};var xt="https://www.speedscope.app/file-format-schema.json";function On(a){return a?.label??a?.command?.join(" ")??a?.entry?.task??"profile"}var Nn={name:"speedscope",async render(a,x={}){let v=Se(a,x.measurementId),E=new Map(a.workloads.map((ie)=>[ie.id,ie]));return{files:v.map((ie)=>{let G=ie.cpu,{nodes:A}=G,ae=Oe(G),X=G.samples?.nodeIds??[],oe=G.samples?.timeDeltasUs??[],ue=Array(ae.count);for(let fe of ae.order){let pe=ae.parentIx[fe],he=A[fe].frameIx;ue[fe]=pe===-1?[he]:[...ue[pe],he]}let me=Array(X.length);for(let fe=0;fe<X.length;fe++){let pe=ae.indexOf(X[fe]);me[fe]=pe===-1?[]:ue[pe]}let le=0;for(let fe=0;fe<oe.length;fe++)le+=oe[fe];let de={$schema:xt,exporter:"ostia",name:On(E.get(ie.workloadId)),activeProfileIndex:0,shared:{frames:G.frames.map((fe)=>({name:fe.name||"(anonymous)",file:fe.url,line:fe.line!==void 0?fe.line+1:void 0}))},profiles:[{type:"sampled",name:On(E.get(ie.workloadId)),unit:"microseconds",startValue:0,endValue:le,samples:me,weights:oe}]};return{path:`${ie.id}.speedscope.json`,content:`${JSON.stringify(de,null,2)}
|
|
15
|
+
`}})}}};function Pt(a){return(a/1e6).toFixed(3)}function kt(a){if(a<1024)return`${a.toFixed(0)}B`;if(a<1048576)return`${(a/1024).toFixed(2)}KB`;return`${(a/1048576).toFixed(2)}MB`}var Wn={name:"table",async render(a){let x=We(a),v=new Map(a.workloads.map((xe)=>[xe.id,xe])),E=a.environment?[ze(a.environment),""]:[],U=Ee(a,x);if(x.length===0&&U.length===0){let xe=Fn(a,v);return{text:xe.length>0?`${[...E,...xe].join(`
|
|
16
|
+
`)}
|
|
17
|
+
`:`(no timing runs)
|
|
18
|
+
`}}let ie=new Map(x.map((xe)=>[xe.workloadId,xe])),G=[],A=[];for(let xe of a.workloads){let ke=ie.get(xe.id),$e=n(xe);if(ke){let Ce={kind:"measured",run:ke,workload:xe,label:$e};G.push(Ce),A.push(Ce)}else if(xe.skipped)G.push({kind:"skipped",workload:xe,label:$e})}let ae=new Map(a.measurements.filter((xe)=>xe.phase==="memstats"&&xe.memory?.bytesPerOp!==void 0).map((xe)=>[xe.workloadId,xe.memory.bytesPerOp])),X=ae.size>0,oe=A.length>1,ue=Fe(A),me=new Map,le=new Map,de;for(let xe of G){let ke=Ke(xe.workload);if(ke!==de){if(ke!==void 0)le.set(xe,ke);de=ke}me.set(xe,ke!==void 0?" ":"")}let fe=Math.max(4,...G.map((xe)=>me.get(xe).length+xe.label.length)),pe=10,he=18,ye=18,be=10,se=[...E],ge=X?` ${"Alloc/op".padEnd(be)}`:"",ce=`${"Task".padEnd(fe)} ${"Median".padEnd(pe)} ${"Spread".padEnd(he)} ${"Range".padEnd(ye)}${ge}${oe?" Relative":""}`;se.push(ce),se.push("-".repeat(ce.length));let we=[];for(let xe of G){let ke=le.get(xe);if(ke!==void 0)se.push(`${ke}:`);let $e=me.get(xe);if(xe.kind==="skipped"){se.push(`${($e+xe.label).padEnd(fe)} - skipped`);continue}let{run:Ce,label:Le,workload:Ye}=xe,Ie=Ce.timing,Ue=Ae(Ie.median),Ln=Ie.p75??Ie.median,_n=Ie.p99??Ie.max,jn=ve(Ie.median,Ue),Vn=`${ve(Ln,Ue)}\u2026${ve(_n,Ue)}`,Hn=`${ve(Ie.min,Ue)}\u2026${ve(Ie.max,Ue)}`,qe=`${($e+Le).padEnd(fe)} ${jn.padEnd(pe)} ${Vn.padEnd(he)} ${Hn.padEnd(ye)}`;if(X){let De=Ye?ae.get(Ye.id):void 0,zn=De!==void 0?kt(De):"";qe+=` ${zn.padEnd(be)}`}if(oe){let De=Ie.median/(ue.get(xe)??Ie.median);qe+=` ${Ge(De,!!Ye?.baseline)}`}if(se.push(qe),Ce.warnings.length>0)se.push(`${" ".repeat($e.length)} ! ${Ce.warnings.map((De)=>De.code).join(", ")}`),we.push(xe)}if(we.length>0){se.push(""),se.push("Warnings:");for(let xe of we)for(let ke of xe.run.warnings)se.push(` ${xe.label}: ${ke.message}`)}let Me=Mt(a,v);if(Me.length>0)se.push(""),se.push(...Me);let Pe=Fn(a,v);if(Pe.length>0)se.push(""),se.push(...Pe);return{text:`${se.map((xe)=>xe.trimEnd()).join(`
|
|
19
|
+
`)}
|
|
20
|
+
`}}};function Fn(a,x){if(!a.comparisons||a.comparisons.length===0)return[];let v=[],E=new Map(a.measurements.map((G)=>[G.id,G])),U=Je(a);if(U)v.push(`\u26A0 ${U.message}`,"");let ie=[];for(let G of a.comparisons){let A=E.get(G.candidateMeasurementId),ae=x.get(A?.workloadId??G.candidateMeasurementId),X=ae?n(ae):G.candidateMeasurementId,oe=G.verdict==="pass"?"\u2713":"\u2717";if(v.push(`${oe} ${X}`),G.timing){let me=(le)=>`${le>=0?"+":""}${le.toFixed(1)}%`;if(G.timing.ci95&&G.timing.pValue!==void 0){let le=G.timing.pValue<0.001?"p<0.001":`p=${G.timing.pValue.toFixed(3)}`;v.push(` timing: ${me(G.timing.medianDeltaPct)} median, 95% CI [${me(G.timing.ci95[0])}, ${me(G.timing.ci95[1])}], ${le} (${G.timing.verdict})`)}else v.push(` timing: ${me(G.timing.medianDeltaPct)} median (${G.timing.verdict})`)}if(G.frames)for(let me of G.frames.slice(0,En)){if(Math.abs(me.deltaPct)<Ne)continue;let le=me.deltaPct>0?"+":"";v.push(` frame ${me.name}: ${le}${me.deltaPct.toFixed(1)}% self-time (${(me.baseSelfUs/1000).toFixed(2)}ms -> ${(me.candSelfUs/1000).toFixed(2)}ms)`)}if(G.heapTypes)for(let me of G.heapTypes.slice(0,Un)){if(Math.abs(me.deltaPct)<Ne)continue;let le=me.deltaPct>0?"+":"";v.push(` heap ${me.type}: ${le}${me.deltaPct.toFixed(1)}% count (${me.baseCount} -> ${me.candCount})`)}let ue=(G.warnings??[]).filter((me)=>me.code!=="environment-mismatch");if(ue.length>0){v.push(` ! ${ue.map((me)=>me.code).join(", ")}`);for(let me of ue)ie.push({label:X,message:me.message})}}if(ie.length>0){v.push("","Comparison warnings:");for(let G of ie)v.push(` ${G.label}: ${G.message}`)}return v}var En=5,Un=5;function Mt(a,x){let v=[];for(let E of a.measurements){if(E.phase!=="cpu"&&E.phase!=="heap")continue;let U=x.get(E.workloadId),ie=U?n(U):E.workloadId;if(E.phase==="cpu")if(E.cpu){v.push(`CPU capture - ${ie} (instrumented, ${E.cpu.samplingIntervalUs}\xB5s interval, diagnostic wall ${Pt(E.diagnosticWallNs??0)}ms)`);let G=E.cpu.totals.reduce((A,ae)=>A+ae.selfUs,0)||1;for(let A of E.cpu.totals.slice(0,En)){let ae=E.cpu.frames[A.frameIx],X=(A.selfUs/G*100).toFixed(1);v.push(` ${X.padStart(5)}% ${(A.selfUs/1000).toFixed(2).padStart(8)}ms self ${ae?.name??"?"}`)}}else v.push(`CPU capture - ${ie} (instrumented, no evidence captured)`);else if(E.heap){let G=((E.heap.heapSizeBytes??0)/1e6).toFixed(2);v.push(`Heap snapshot - ${ie} (instrumented, ${E.heap.objectCount??"?"} objects, ${G}MB)`);for(let A of E.heap.typeCounts.slice(0,Un))v.push(` ${String(A.count).padStart(6)} ${A.type}`)}else v.push(`Heap snapshot - ${ie} (instrumented, no evidence captured)`);for(let G of E.artifacts)v.push(` artifact: ${G.path}`);for(let G of E.warnings)v.push(` ! ${G.message}`)}return v}var i={table:Wn,json:xn,markdown:Cn,jsonl:Pn,minimal:Dn,collapsed:wn,mermaid:Tn,speedscope:Nn,cpuprofile:yn};async function ee(a={}){let x=M();if(x.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let v=x.filter((A)=>A.only),E=v.length>0?v:x;if(v.length>0)process.stderr.write(`bench: ${v.length} task(s) selected by .only
|
|
21
|
+
`);let U=T(E,a.filter);if(U.length===0)throw Error(`run(): filter ${JSON.stringify(a.filter)} matched zero of ${E.length} registered task(s).`);let ie=Bun.main,G=await R(ie,U,a);if(!a.quiet){let A=a.format??"table",{text:ae}=await i[A].render(G,{});if(ae)process.stdout.write(ae)}return G}function ne(a,x){let v=Object.keys(a),E=(U,ie)=>{if(U===v.length){Z(ie,()=>x(ie));return}let G=v[U];for(let A of a[G])E(U+1,{...ie,[G]:A})};E(0,{})}function te(a){return a}var rn=1000;async function V(a){if(a.samples!==void 0&&(!Number.isFinite(a.samples)||a.samples<1))throw RangeError(`time: samples must be >= 1, got ${a.samples}`);if(a.minSamples!==void 0&&(!Number.isFinite(a.minSamples)||a.minSamples<1))throw RangeError(`time: minSamples must be >= 1, got ${a.minSamples}`);if(a.warmup!==void 0&&(!Number.isFinite(a.warmup)||a.warmup<0))throw RangeError(`time: warmup must be >= 0, got ${a.warmup}`);if(a.budgetMs!==void 0&&!Number.isFinite(a.budgetMs))throw RangeError(`time: budgetMs must be finite, got ${a.budgetMs}`);let x=o({samples:a.samples??null,budgetMs:a.budgetMs??null,minSamples:a.minSamples??null,warmup:a.warmup??null,cpu:a.cpu??!1,heap:a.heap??!1,cpuIntervalUs:a.cpuIntervalUs??rn}),E=`${a.outDir??Be}/artifacts`,U=a.noiseCheck===!1?void 0:g(),ie=U?h(U):void 0,G=[],A=[],ae=a.commands.map((le)=>{let de=typeof le==="string"||Array.isArray(le)?{command:le}:le,fe=Array.isArray(de.command)?de.command:m(de.command),pe=de.prepare??a.prepare,he=de.timeSource??a.timeSource,ye=de.timeoutMs??a.timeoutMs,be=de.ignoreExitCodes??a.ignoreExitCodes,se=de.failOnNonzero??a.failOnNonzero,ge=P(fe,de.label??(Array.isArray(de.command)?void 0:de.command),{prepare:pe,timeSource:he});return{argv:fe,workload:ge,prepare:pe,timeSource:he,timeoutMs:ye,ignoreExitCodes:be,failOnNonzero:se}}),X=(a.interleave??!0)&&ae.length>1,oe=(le)=>({argv:le.argv,cwd:a.cwd,env:a.env,samples:a.samples,budgetMs:a.budgetMs,minSamples:a.minSamples,warmup:a.warmup,prepare:le.prepare,timeSource:le.timeSource,timeoutMs:le.timeoutMs,ignoreExitCodes:le.ignoreExitCodes,failOnNonzero:le.failOnNonzero,signal:a.signal}),ue=ae.map((le)=>Ze(oe(le))),me=async(le)=>{let{argv:de,workload:fe,prepare:pe}=ae[le];G.push(fe);let he=ue[le].result(),ye=d({workload:fe,configFingerprint:x,trials:he.trials,timing:he.timing,warnings:ie&&A.length===0?[...he.warnings,ie]:he.warnings,interleaved:X?!0:void 0});if(A.push(ye),!a.signal?.aborted)A.push(...await Rt({workload:fe,argv:de,timingMeasurementId:ye.id,cfgFp:x,opts:a,artifactDir:E,prepare:pe}))};if(X){for(let de of ue)await de.warmup();let le=!0;while(le){le=!1;for(let de of ue)if(await de.step())le=!0}for(let de=0;de<ae.length;de++)await me(de)}else for(let le=0;le<ae.length;le++)await en(ue[le]),await me(le);if(a.signal?.aborted&&A.length>0){let le=A[A.length-1];le.warnings=[...le.warnings,An()]}return t(G,A,U)}function An(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function Rt({workload:a,argv:x,timingMeasurementId:v,cfgFp:E,opts:U,artifactDir:ie,prepare:G}){let A=[],ae=async(X)=>{if(G)await F(G,{phase:X,index:0},{cwd:U.cwd,env:U.env})};if(U.cpu){await ae("cpu");let X=`${v}-cpu.cpuprofile`,oe=await on({argv:x,cwd:U.cwd,env:U.env,artifactDir:ie,fileName:X,intervalUs:U.cpuIntervalUs??rn});A.push(await Bn({workload:a,phase:"cpu",configFingerprint:E,diagnosticWallNs:oe.diagnosticWallNs,exitCode:oe.exitCode,cpu:oe.cpu,artifactPath:oe.artifactPath,artifactKind:"cpuprofile",warnings:oe.warnings}))}if(U.heap){await ae("heap");let X=`${v}-heap.heapsnapshot`,oe=await an({argv:x,cwd:U.cwd,env:U.env,artifactDir:ie,fileName:X});A.push(await Bn({workload:a,phase:"heap",configFingerprint:E,diagnosticWallNs:oe.diagnosticWallNs,exitCode:oe.exitCode,heap:oe.heap,artifactPath:oe.artifactPath,artifactKind:"heapsnapshot",warnings:oe.warnings}))}return A}async function Bn(a){let x=`${a.workload.id}-${a.phase}-${a.configFingerprint}`,v=a.artifactPath?[await Y(x,a.artifactKind,a.artifactPath)]:[];return p({workload:a.workload,phase:a.phase,configFingerprint:a.configFingerprint,diagnosticWallNs:a.diagnosticWallNs,exitCode:a.exitCode,cpu:a.cpu,heap:a.heap,warnings:a.warnings,artifacts:v})}async function re(a,x={}){let v=K(a),E=o({intervalUs:x.intervalUs??rn,origin:x.origin??"inspector"}),U=(A)=>A.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];if(x.signal?.aborted){let A=Bun.nanoseconds(),ae=await a(),X=p({workload:v,phase:"cpu",configFingerprint:E,diagnosticWallNs:Bun.nanoseconds()-A,warnings:[An()],artifacts:[]});return{result:ae,measurement:X,document:t([v],[X])}}let ie=x.origin==="jsc"?await B(a,x):{...await mn(a,x),jit:void 0},G=p({workload:v,phase:"cpu",configFingerprint:E,diagnosticWallNs:ie.diagnosticWallNs,cpu:ie.cpu,jit:ie.jit,warnings:U(ie.cpu),artifacts:[]});return{result:ie.result,measurement:G,document:t([v],[G])}}
|
|
22
|
+
export{c,W,j,C,S,s,L,I,_,H,J,b,z,w,n,Q,u,i,ee,ne,te,V,re};
|
package/cli.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{e,
|
|
4
|
-
`)}var
|
|
3
|
+
import{e,m,x,t,P,d,o,f,E,a,r,g,h}from"./chunk-1wydyvyj.js";import{c,W,j,C,S,s,L,I,_,H,J,b,z,w,n,u,i,V}from"./chunk-cf9hya3b.js";function he(p){return e("cache",p.workloadId,p.phase,p.configFingerprint,p.bunVersion,p.toolVersion,p.instrumented,p.inputsDigest??null)}async function ge(p,l=process.cwd()){if(p.length===0)return;let k=await I(p,l),y=await Promise.all(k.map(async(v)=>{let M=await Bun.file(`${l}/${v}`).arrayBuffer();return{path:v,sha256:Bun.CryptoHasher.hash("sha256",M,"hex")}}));return e("inputs",y)}function be(p,l){return`${p}/cache/${l}.json`}async function we(p,l){let k=Bun.file(be(p,l));if(!await k.exists())return;return await k.json()}async function ke(p,l,k){await Bun.write(be(p,l),`${JSON.stringify(k,null,2)}
|
|
4
|
+
`)}var ve=600000;class ie extends Error{path;constructor(p){super(`No baseline document at ${p}. Create one with: ostia time --export-json ${p} <command...>`);this.path=p}}class re extends Error{path;missing;total;constructor(p,l,k){super(`${l} of ${k} configured workload(s) have no matching row in baseline ${p} (by workload id). Re-seed with: ostia baseline save`);this.path=p;this.missing=l;this.total=k}}function De(p,l,k){if(p)return p;return l===k?"fail":"warn"}function Ie(p,l=[]){let k=new Set(l),y=p.filter((v)=>!v.timedOut&&!v.timeSourceNoMatch).map((v)=>v.exitCode).filter((v)=>v!==void 0);return y.length>0&&y.every((v)=>v!==0&&!k.has(v))}async function me(p,l){let k=p.noiseCheck===!1?void 0:g(),y=k?h(k):void 0,v=[];for(let M of p.workloads){if(M.suites){let D=await H(M.suites,process.cwd()),ee=await b({suites:D,outDir:p.outDir,noiseCheck:!1,budgetMs:p.bench?.budgetMs,samples:p.bench?.samples,minSamples:p.bench?.minSamples,gc:p.bench?.gc,cpu:p.bench?.cpu,alloc:p.bench?.alloc,filter:p.bench?.filter,isolate:p.bench?.isolate,preload:p.bench?.preload,jobs:typeof p.bench?.jobs==="number"?p.bench.jobs:void 0,timeoutMs:p.bench?.timeoutMs??ve});for(let Y of ee.workloads){let X=ee.measurements.find((N)=>N.workloadId===Y.id&&N.phase==="timing");if(!X)continue;if(y)X.warnings.push(y);v.push({workload:Y,status:"executed",run:X,harnessFailed:!1})}continue}let R=P(M.command,M.label,{prepare:M.prepare,timeSource:M.timeSource}),A=await ge(M.inputs??[]),T=o({runs:p.runs,warmup:p.warmup}),K=typeof M.prepare!=="function",B=he({workloadId:R.id,phase:"timing",configFingerprint:T,bunVersion:Bun.version,toolVersion:x,instrumented:!1,inputsDigest:A}),U=l||!K?void 0:await we(p.outDir,B),G,O;if(U)G=U,O="cached";else{let D=await z({argv:M.command,samples:p.runs??void 0,warmup:p.warmup,prepare:M.prepare,timeSource:M.timeSource,timeoutMs:M.timeoutMs??ve,ignoreExitCodes:M.ignoreExitCodes,failOnNonzero:M.failOnNonzero});if(G=d({workload:R,configFingerprint:T,trials:D.trials,timing:D.timing,warnings:y?[...D.warnings,y]:D.warnings}),K)await ke(p.outDir,B,G);O="executed"}v.push({workload:R,status:O,run:G,harnessFailed:Ie(G.trials,M.ignoreExitCodes)})}return{results:v,environment:k}}async function ye(p){let{config:l}=p,k=s(l,p.baselineName);if(!await Bun.file(k).exists())throw new ie(k);let v=await r(k),{results:M,environment:R}=await me(l,p.full),A=M.map((N)=>({...N})),T=A.filter((N)=>N.status==="executed").length,K=A.length-T,B=A.filter((N)=>N.harnessFailed).length,U=t(A.map((N)=>N.workload),A.map((N)=>N.run),R),G=0,O=0,D=0,ee=W(v,U,l.thresholds);for(let N of A){let de=ee.compare(N.workload.id);if(!de){D++;continue}if(N.comparison=de,de.verdict==="pass")G++;else O++}if(D>0){if(De(l.onMissingBaseline,D,A.length)==="fail")throw new re(k,D,A.length)}let Y=A.map((N)=>N.comparison).filter((N)=>N!==void 0);U.comparisons=Y;let X=ee.unmatched();return U.unmatched={baseOnly:X.baseOnly.map((N)=>N.id),candOnly:X.candOnly.map((N)=>N.id)},U.comparisonSummary=j(Y,ee.effectiveTimingPct),{document:U,summary:{total:A.length,cached:K,executed:T,passed:G,regressed:O,missingBaseline:D,failed:B,results:A,unmatched:X},baseline:v}}function Ce(p){let l=[];if(l.push(`${p.total} workloads`),l.push(`${p.cached} cached`),l.push(`${p.executed} executed`),p.missingBaseline>0)l.push(`${p.missingBaseline} skipped (no matching baseline workload)`);if(p.failed>0){let y=p.results.filter((v)=>v.harnessFailed).map((v)=>n(v.workload));l.push(`${p.failed} failed (harness error, every trial exited non-zero: ${y.join(", ")})`)}let k=p.results.filter((y)=>y.comparison?.verdict==="fail").map((y)=>{let v=y.comparison.timing,M=n(y.workload);return v?`${v.medianDeltaPct>0?"+":""}${v.medianDeltaPct.toFixed(1)}% median on ${M}`:M});return l.push(`${p.passed} passed ${p.regressed} regressed${k.length>0?` (${k.join(", ")})`:""}`),l.push(""),l.push(`Profile CI: ${p.regressed>0||p.failed>0?"\u2717":"\u2713"}`),`${l.join(`
|
|
5
5
|
`)}
|
|
6
|
-
`}async function xe(
|
|
7
|
-
`)?
|
|
8
|
-
`),
|
|
9
|
-
`)[0],...
|
|
10
|
-
`)}function
|
|
11
|
-
Run 'ostia ${
|
|
12
|
-
`;function
|
|
13
|
-
`)}else if(
|
|
14
|
-
${
|
|
15
|
-
`)}var
|
|
6
|
+
`}async function xe(p,l){let{results:k,environment:y}=await me(p,!1),v=t(k.map((R)=>R.workload),k.map((R)=>R.run),y),M=s(p,l);return await a(v,M),M}async function Pe(p){let l=[];try{let y=new Bun.Glob("*.json");for await(let v of y.scan({cwd:p.baselineDir,absolute:!1}))l.push(v.replace(/\.json$/,""))}catch{return[]}return l.sort(),(await Promise.all(l.map(async(y)=>{let v=s(p,y);try{let M=await r(v);return{name:y,path:v,createdAt:M.createdAt,toolVersion:M.toolVersion,bunVersion:M.bunVersion,workloads:M.workloads.length,...M.git!==void 0&&{git:M.git}}}catch{return}}))).filter((y)=>y!==void 0)}function te(p){return p instanceof Error?p.message:String(p)}var q=(p)=>Bun.write(Bun.stdout,p),$e=(p)=>Bun.write(Bun.stderr,p);class Q extends Error{}async function F(p,l,k){await $e(l.endsWith(`
|
|
7
|
+
`)?l:`${l}
|
|
8
|
+
`),await $e(`${JSON.stringify({event:"error",protocolVersion:u,code:p,message:l.split(`
|
|
9
|
+
`)[0],...k&&{data:k}})}
|
|
10
|
+
`)}async function Z(p,l){return await q(p),l?0:2}async function Fe(p,l){if(!(p instanceof Q))throw p;return await F("invalid-flag",`${p.message}
|
|
11
|
+
Run 'ostia ${l} --help'.`),2}function Be(p,l,k={}){if(k.allowAuto&&l==="auto")return _();let y=k.min??1,v=Number(l);if(!Number.isInteger(v)||v<y)throw new Q(`Invalid ${p} "${l}": expected an integer \u2265 ${y}${k.allowAuto?' (or "auto")':""}`);return v}function Le(p,l,k={}){let y=k.min??0,v=Number(l);if(!Number.isFinite(v)||v<y)throw new Q(`Invalid ${p} "${l}": expected a number \u2265 ${y}`);return v}var se=["table","json","jsonl","markdown","minimal"],pe=["collapsed","mermaid","speedscope","cpuprofile"],Ue=[...se,...pe];function oe(p,l){if(l.includes(p))return;throw new Q(`Unknown --format "${p}". Expected one of: ${l.join(", ")}`)}var ue=`No CPU evidence in this document; rerun with --cpu (ostia time) or --cpu (ostia bench)
|
|
12
|
+
`;function Ee(p){return p.measurements.some((l)=>l.phase==="cpu")}async function fe(p,l,k={}){if(l.format==="json"&&l.exportJson){let y=f(p);if(await E(y,l.exportJson),!l.quiet)await q(y);return 0}if(l.exportJson)await a(p,l.exportJson);if(l.quiet)return 0;if(pe.includes(l.format)&&!Ee(p))return await F("no-cpu-evidence",ue),2;return await ne(await i[l.format].render(p,k)),0}async function le(p){let l=await S();if(!l){await F("config-missing",p?`No ostia.config.json found. "${p}" needs configured workloads.`:"No ostia.config.json found.");return}if(p&&l.workloads.length===0){let k=await L()??"ostia.config.json";await F("config-missing",`${k} has no "workloads" configured.`);return}return l}async function ne(p,l){if(p.text)await q(p.text);if(!p.files||p.files.length===0)return;if(l)for(let k of p.files){let y=k.path?`${l}/${k.path}`:l;await Bun.write(y,k.content),await q(`wrote ${y}
|
|
13
|
+
`)}else if(p.files.length===1)await q(p.files[0].content);else for(let k of p.files)await q(`--- ${k.path??"(unnamed)"} ---
|
|
14
|
+
${k.content}
|
|
15
|
+
`)}var _e=`ostia time [flags] <command...>
|
|
16
16
|
ostia time [flags] -- <argv...>
|
|
17
17
|
|
|
18
18
|
Time one or more commands N times with warmup and report timing statistics. Each
|
|
@@ -95,7 +95,7 @@ Examples:
|
|
|
95
95
|
ostia time --ignore-failure=3 "bun flaky.ts"
|
|
96
96
|
ostia time --fail-on-nonzero "bun might-hang-if-broken.ts"
|
|
97
97
|
ostia time -- bun -e "console.log('a b')" # argument with a space, unsplit
|
|
98
|
-
`,
|
|
98
|
+
`,We=Array.from({length:255},(p,l)=>l+1),je=`ostia bench [flags] <suite.ts...>
|
|
99
99
|
|
|
100
100
|
Run in-process benchmark suites (registered via group()/task()). Each suite file runs
|
|
101
101
|
in its own spawned child process (isolated from CLI startup state).
|
|
@@ -211,7 +211,7 @@ Examples:
|
|
|
211
211
|
ostia bench --preload ./bench/jsdom-setup.ts benches/*.dom.bench.ts
|
|
212
212
|
ostia bench --bun-flags="--conditions=browser" bench/*.dom.bench.ts
|
|
213
213
|
ostia bench # picks up suites/preload/jobs from ostia.config.json
|
|
214
|
-
`,
|
|
214
|
+
`,Se=`ostia compare <base.json> <candidate.json>
|
|
215
215
|
ostia compare <candidate.json> --baseline <path.json>
|
|
216
216
|
|
|
217
217
|
Compare two ProfileDocuments (matched by workload id) and rank timing/frame/heap deltas.
|
|
@@ -239,7 +239,7 @@ matched workloads) or a harness error (documents failed to load, or a bad flag).
|
|
|
239
239
|
Examples:
|
|
240
240
|
ostia compare before.json after.json
|
|
241
241
|
ostia compare after.json --baseline .ostia/baselines/main.json
|
|
242
|
-
`,
|
|
242
|
+
`,qe=`ostia report <document.json> [flags]
|
|
243
243
|
|
|
244
244
|
Render a saved ProfileDocument. Files, not a GUI for the visualization formats -
|
|
245
245
|
hand the output to speedscope.app, flamegraph.pl, or a Mermaid renderer.
|
|
@@ -267,7 +267,7 @@ Examples:
|
|
|
267
267
|
ostia report doc.json --format markdown
|
|
268
268
|
ostia report doc.json --format speedscope --out-dir node_modules/.cache/ostia/viz
|
|
269
269
|
ostia report doc.json --format collapsed | flamegraph.pl > flame.svg
|
|
270
|
-
`,
|
|
270
|
+
`,He=`ostia ci [--full] [--baseline NAME] [--save-baseline]
|
|
271
271
|
|
|
272
272
|
Load ostia.config.json, run configured workloads (reusing cached results when their
|
|
273
273
|
fingerprint is unchanged), compare against the named baseline, and gate on regressions.
|
|
@@ -291,7 +291,7 @@ Flags:
|
|
|
291
291
|
|
|
292
292
|
Exit codes: 0 pass, 1 regression, 2 harness error (missing config/baseline, every trial of
|
|
293
293
|
a workload exited non-zero, an "onMissingBaseline: fail" mismatch, or a spawn failure).
|
|
294
|
-
`,
|
|
294
|
+
`,ce=`ostia baseline <save|list|show> [args]
|
|
295
295
|
|
|
296
296
|
Manage the baseline ProfileDocuments "ostia ci" gates against and "ostia compare --baseline"
|
|
297
297
|
reads.
|
|
@@ -310,24 +310,24 @@ Examples:
|
|
|
310
310
|
ostia baseline list
|
|
311
311
|
ostia baseline show main
|
|
312
312
|
ostia baseline show main --format markdown
|
|
313
|
-
`;function
|
|
314
|
-
`),
|
|
315
|
-
`);if(
|
|
316
|
-
`)}let
|
|
313
|
+
`;function ae(p,l,k,y,v,M){let R=y;for(let A=0;A<p.length;A++){let T=p[A],K=M?.(T,A,y);if(K!==void 0){A=K;continue}let B=k[T];if(!B){if(T.startsWith("-"))throw new Q(`Unknown flag "${T}" for "ostia ${l}".`);v(T,y);continue}switch(B.spec.kind){case"string":R[B.dest]=p[++A];break;case"int":R[B.dest]=Be(T,p[++A],B.spec);break;case"float":R[B.dest]=Le(T,p[++A],B.spec);break;case"bool":R[B.dest]=B.spec.value;break;case"list":R[B.dest].push(p[++A]??"");break;case"enum":{let U=p[++A];if(!B.spec.values.includes(U))throw new Q(`Invalid ${T} "${U}": expected one of: ${B.spec.values.join(", ")}`);R[B.dest]=U;break}}}return y}var Je={"--samples":{dest:"samples",spec:{kind:"int",min:1}},"--budget":{dest:"budgetMs",spec:{kind:"int",min:1}},"--min-samples":{dest:"minSamples",spec:{kind:"int",min:1}},"--warmup":{dest:"warmup",spec:{kind:"int",min:0}},"--no-interleave":{dest:"interleave",spec:{kind:"bool",value:!1}},"--prepare":{dest:"prepare",spec:{kind:"list"}},"--time-source":{dest:"timeSource",spec:{kind:"string"}},"--time-unit":{dest:"timeUnit",spec:{kind:"string"}},"--cpu":{dest:"cpu",spec:{kind:"bool",value:!0}},"--heap":{dest:"heap",spec:{kind:"bool",value:!0}},"--cpu-interval":{dest:"cpuIntervalUs",spec:{kind:"int",min:1}},"--timeout":{dest:"timeoutMs",spec:{kind:"int",min:1}},"--fail-on-nonzero":{dest:"failOnNonzero",spec:{kind:"bool",value:!0}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--no-noise-check":{dest:"noiseCheck",spec:{kind:"bool",value:!1}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"string"}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function ze(p){return ae(p,"time",Je,{commands:[],prepare:[],interleave:!0,cpu:!1,heap:!1,ignoreExitCodes:[],failOnNonzero:!1,noiseCheck:!0,format:"table",quiet:!1,help:!1},(k,y)=>y.commands.push(k),(k,y,v)=>{if(k==="--")return v.argvCommand=p.slice(y+1),p.length;if(k==="--ignore-failure"||k.startsWith("--ignore-failure=")){let M=k.startsWith("--ignore-failure=")?k.slice(17):void 0;return v.ignoreExitCodes.push(...M===void 0?We:M.split(",").map(Number)),y}return})}async function Te(p){let l=new AbortController,k=()=>l.abort();process.on("SIGINT",k);try{return{result:await p(l.signal),aborted:l.signal.aborted}}finally{process.off("SIGINT",k)}}var Me=["ns","us","ms","s"];async function Ge(p){let l=ze(p),k=(l.argvCommand?.length??0)>0;if(l.help||l.commands.length===0&&!k)return Z(_e,l.help);oe(l.format,se);let y=l.commands.length+(k?1:0);if(l.prepare.length>1&&l.prepare.length!==y)return await F("invalid-flag",`--prepare given ${l.prepare.length} times for ${y} command(s): give it once (applies to all) or once per command.`),2;if(l.timeUnit!==void 0&&!Me.includes(l.timeUnit))return await F("invalid-flag",`Unknown --time-unit "${l.timeUnit}". Expected one of: ${Me.join(", ")}`),2;if(l.timeSource!==void 0)try{new RegExp(l.timeSource)}catch(O){return await F("invalid-flag",`Invalid --time-source regex: ${te(O)}`),2}let v=l.timeSource!==void 0?{pattern:l.timeSource,unit:l.timeUnit}:void 0,M=(O)=>l.prepare.length===1?l.prepare[0]:l.prepare[O],R=l.commands.map((O,D)=>({command:O,prepare:M(D)}));if(k)R.push({command:l.argvCommand,prepare:M(l.commands.length)});let A,T;try{({result:A,aborted:T}=await Te((O)=>V({commands:R,timeSource:v,samples:l.samples,budgetMs:l.budgetMs,minSamples:l.minSamples,warmup:l.warmup,interleave:l.interleave,cpu:l.cpu,heap:l.heap,cpuIntervalUs:l.cpuIntervalUs,timeoutMs:l.timeoutMs,ignoreExitCodes:l.ignoreExitCodes,failOnNonzero:l.failOnNonzero,outDir:l.outDir,noiseCheck:l.noiseCheck,signal:O})))}catch(O){return await F("spawn-failed",`Run failed: ${te(O)}`),2}let K=await fe(A,l);if(K!==0)return K;if(T)return 130;let B=new Set(l.ignoreExitCodes),U=A.workloads.some((O)=>!A.measurements.some((D)=>D.workloadId===O.id&&D.timing)),G=A.measurements.some((O)=>O.trials.some((D)=>D.exitCode!==void 0&&D.exitCode!==0&&!B.has(D.exitCode)));if(G||U){let O=A.measurements.some((Y)=>Y.warnings.some((X)=>X.code==="timeout")),D=A.measurements.some((Y)=>Y.warnings.some((X)=>X.code==="time-source-no-match"));return await F(G?"command-failed":O?"timeout":D?"time-source-no-match":"command-failed","One or more commands failed to produce a clean measurement; see the report above for details."),2}return 0}var Ve={"--budget":{dest:"budgetMs",spec:{kind:"int",min:1}},"--samples":{dest:"samples",spec:{kind:"int",min:1}},"--min-samples":{dest:"minSamples",spec:{kind:"int",min:1}},"--jobs":{dest:"jobs",spec:{kind:"int",min:1,allowAuto:!0}},"--gc":{dest:"gc",spec:{kind:"bool",value:!0}},"--no-gc":{dest:"gc",spec:{kind:"bool",value:!1}},"--cpu":{dest:"cpu",spec:{kind:"bool",value:!0}},"--no-cpu":{dest:"cpu",spec:{kind:"bool",value:!1}},"--alloc":{dest:"alloc",spec:{kind:"bool",value:!0}},"--no-alloc":{dest:"alloc",spec:{kind:"bool",value:!1}},"--filter":{dest:"filter",spec:{kind:"string"}},"--isolate":{dest:"isolate",spec:{kind:"bool",value:!0}},"--no-isolate":{dest:"isolate",spec:{kind:"bool",value:!1}},"--preload":{dest:"preload",spec:{kind:"list"}},"--timeout":{dest:"timeoutMs",spec:{kind:"int",min:1}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--no-noise-check":{dest:"noiseCheck",spec:{kind:"bool",value:!1}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"string"}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function Ke(p){return ae(p,"bench",Ve,{suites:[],preload:[],bunFlags:[],noiseCheck:!0,format:"table",quiet:!1,help:!1},(k,y)=>y.suites.push(k),(k,y,v)=>{if(k==="--bun-flags")return v.bunFlags.push(...m(p[y+1]??"")),y+1;if(k.startsWith("--bun-flags="))return v.bunFlags.push(...m(k.slice(12))),y;return})}async function Xe(p){let l=Ke(p);if(l.help)return Z(je,!0);oe(l.format,se);let k=await S(),y=await J(l,k?.bench);if(y.suites.length===0)return Z(je,!1);if(y.jobs!==void 0&&!(y.jobs>=1))return await F("invalid-flag",'--jobs expects a positive integer or "auto".'),2;let v,M;try{({result:v,aborted:M}=await Te((A)=>b({...y,signal:A})))}catch(A){return await F("spawn-failed",`Bench failed: ${te(A)}`),2}let R=await fe(v,l);if(R!==0)return R;return M?130:0}var Ze={"--baseline":{dest:"baseline",spec:{kind:"string"}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"string"}},"--timing-pct":{dest:"timingPct",spec:{kind:"float"}},"--alpha":{dest:"alpha",spec:{kind:"float"}},"--no-config":{dest:"noConfig",spec:{kind:"bool",value:!0}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function Ye(p){return ae(p,"compare",Ze,{paths:[],format:"table",quiet:!1,help:!1,noConfig:!1},(k,y)=>y.paths.push(k))}async function Qe(p){let l=c,k="defaults";if(!p.noConfig){let y=await S();if(y)l=y.thresholds,k=await L()??"ostia.config.json"}if(p.timingPct!==void 0||p.alpha!==void 0)l={...l,...p.timingPct!==void 0&&{timingPct:p.timingPct},...p.alpha!==void 0&&{alpha:p.alpha}};return{thresholds:l,source:k}}async function et(p){let l=Ye(p);if(l.help)return Z(Se,!0);oe(l.format,se);let k,y;if(l.baseline)k=l.baseline,y=l.paths[0];else k=l.paths[0],y=l.paths[1];if(!k||!y)return Z(Se,!1);let v,M;try{[v,M]=await Promise.all([r(k),r(y)])}catch(O){return await F("document-load-failed",`Failed to load documents: ${te(O)}`),2}let{thresholds:R,source:A}=await Qe(l),T=C(v,M,R),K={...M,comparisons:T.comparisons,comparisonSummary:T.summary,unmatched:{baseOnly:T.unmatched.baseOnly.map((O)=>O.id),candOnly:T.unmatched.candOnly.map((O)=>O.id)}},B=l.format==="table"||l.format==="markdown";if(!l.quiet&&B){if(await q(`thresholds: ${A}
|
|
314
|
+
`),v.git&&M.git)await q(`base ${w(v.git)} \u2192 cand ${w(M.git)}
|
|
315
|
+
`);if(l.format==="table"&&T.summary.effectiveTimingPct>R.timingPct)await q(`threshold ${R.timingPct}% (widened to ${T.summary.effectiveTimingPct.toFixed(1)}% by noise floor)
|
|
316
|
+
`)}let U=T.summary.matched===0?2:T.summary.verdict==="fail"?1:0,G=await fe(K,l,{protocol:{command:"compare",exitCode:U,unmatched:T.unmatched,baseGit:v.git,candGit:M.git,...l.exportJson&&{exportedTo:l.exportJson}}});if(G!==0)return G;if(!l.quiet&&(l.format==="table"||l.format==="markdown")&&(T.unmatched.baseOnly.length>0||T.unmatched.candOnly.length>0))await q(tt(T.unmatched,l.format));if(T.summary.matched===0)await F("no-matches","No workload matched between base and candidate; nothing was compared.");return U}function tt(p,l){let k=(v)=>v.map((M)=>n(M)).join(", ");if(l==="markdown"){let v=["### Unmatched",""];if(p.baseOnly.length>0)v.push(`- baseline only: ${k(p.baseOnly)}`);if(p.candOnly.length>0)v.push(`- candidate only: ${k(p.candOnly)}`);return v.push(""),`${v.join(`
|
|
317
317
|
`)}
|
|
318
|
-
`}let
|
|
318
|
+
`}let y=["","Unmatched:"];if(p.baseOnly.length>0)y.push(` baseline only: ${k(p.baseOnly)}`);if(p.candOnly.length>0)y.push(` candidate only: ${k(p.candOnly)}`);return`${y.join(`
|
|
319
319
|
`)}
|
|
320
|
-
`}
|
|
320
|
+
`}var nt={"--format":{dest:"format",spec:{kind:"string"}},"--measurement":{dest:"measurementId",spec:{kind:"string"}},"--out-dir":{dest:"outDir",spec:{kind:"string"}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function st(p){return ae(p,"report",nt,{format:"table",help:!1},(k,y)=>{if(y.path!==void 0)throw new Q(`"ostia report" takes exactly one document path, got "${y.path}" and "${k}".`);y.path=k})}async function Re(p){let l=st(p);if(l.help||!l.path)return Z(qe,l.help);oe(l.format,Ue);let k;try{k=await r(l.path)}catch(M){return await F("document-load-failed",`Failed to load ${l.path}: ${te(M)}`),2}if(pe.includes(l.format)&&!l.measurementId&&!Ee(k))return await F("no-cpu-evidence",ue),2;let v=await i[l.format].render(k,{measurementId:l.measurementId});if(!v.text&&(!v.files||v.files.length===0))return await F("no-cpu-evidence",l.measurementId?`No CPU evidence found for measurement "${l.measurementId}".`:ue),2;return await ne(v,l.outDir),0}var ot={"--full":{dest:"full",spec:{kind:"bool",value:!0}},"--baseline":{dest:"baseline",spec:{kind:"string"}},"--save-baseline":{dest:"saveBaseline",spec:{kind:"bool",value:!0}},"--export-json":{dest:"exportJson",spec:{kind:"string"}},"--format":{dest:"format",spec:{kind:"string"}},"--on-missing-baseline":{dest:"onMissingBaseline",spec:{kind:"enum",values:["warn","fail"]}},"--no-noise-check":{dest:"noNoiseCheck",spec:{kind:"bool",value:!0}},"--quiet":{dest:"quiet",spec:{kind:"bool",value:!0}},"--help":{dest:"help",spec:{kind:"bool",value:!0}},"-h":{dest:"help",spec:{kind:"bool",value:!0}}};function at(p){return ae(p,"ci",ot,{full:!1,saveBaseline:!1,format:"table",quiet:!1,help:!1,noNoiseCheck:!1},(k)=>{throw new Q(`Unknown flag "${k}" for "ostia ci".`)})}async function it(p){let l=at(p);if(l.help)return Z(He,!0);oe(l.format,se);let k=await le("ostia ci");if(!k)return 2;let y={...k,...l.onMissingBaseline!==void 0&&{onMissingBaseline:l.onMissingBaseline},...l.noNoiseCheck&&{noiseCheck:!1}},v;try{v=await ye({config:y,full:l.full,baselineName:l.baseline})}catch(A){if(A instanceof ie||A instanceof re)return await F("baseline-missing",A.message),2;return await F("spawn-failed",`CI run failed: ${te(A)}`),2}let M=l.format==="json"&&!l.quiet?f(v.document):void 0;if(l.exportJson)if(M)await E(M,l.exportJson);else await a(v.document,l.exportJson);if(l.saveBaseline&&v.summary.regressed===0&&v.summary.failed===0)await a(v.document,s(y,l.baseline));let R=v.summary.failed>0?2:v.summary.regressed>0?1:0;if(v.summary.failed>0){let A=v.summary.results.filter((T)=>T.harnessFailed).map((T)=>n(T.workload));await F("command-failed",`${v.summary.failed} workload(s) failed (harness error, every trial exited non-zero): ${A.join(", ")}`)}if(!l.quiet){let A=l.baseline??y.baseline;if(l.format==="table"){if(await q(Ce(v.summary)),v.document.comparisons&&v.document.comparisons.length>0)await ne(await i.table.render(v.document,{}))}else if(M!==void 0)await q(M);else if(l.format==="markdown")await q(`## ostia ci
|
|
321
321
|
|
|
322
|
-
Baseline: \`${A}\` (\`${s(
|
|
322
|
+
Baseline: \`${A}\` (\`${s(y,l.baseline)}\`) \xB7 ${v.summary.cached} cached, ${v.summary.executed} executed
|
|
323
323
|
|
|
324
|
-
`),await
|
|
325
|
-
Run 'ostia baseline --help'.`),2;let
|
|
326
|
-
Run 'ostia baseline --help'.`),2}let
|
|
327
|
-
`),0}async function
|
|
328
|
-
`),0;for(let
|
|
329
|
-
`)}return 0}async function
|
|
330
|
-
Run 'ostia baseline --help'.`),2;let
|
|
324
|
+
`),await ne(await i.markdown.render(v.document,{}));else await ne(await i[l.format].render(v.document,{protocol:{command:"ci",exitCode:R,unmatched:v.summary.unmatched,baseGit:v.baseline.git,candGit:v.document.git,baseline:{name:A,path:s(y,l.baseline)},cached:v.summary.cached,executed:v.summary.executed,failed:v.summary.failed,missingBaseline:v.summary.missingBaseline,...l.exportJson&&{exportedTo:l.exportJson}}}))}return R}var Ae=/^[A-Za-z0-9._-]+$/;function Oe(p){if(p.startsWith("-"))return`Invalid baseline name "${p}": names can't start with "-".`;if(!Ae.test(p))return`Invalid baseline name "${p}": expected to match ${Ae}.`;return}async function rt(p){if(p.includes("--help")||p.includes("-h"))return Z(ce,!0);if(p.length>1)return await F("invalid-flag",`"ostia baseline save" takes at most one name argument, got ${p.length}.
|
|
325
|
+
Run 'ostia baseline --help'.`),2;let l=p[0];if(l!==void 0){let v=Oe(l);if(v)return await F("invalid-flag",`${v}
|
|
326
|
+
Run 'ostia baseline --help'.`),2}let k=await le("ostia baseline save");if(!k)return 2;let y=await xe(k,l);return await q(`Wrote ${y}
|
|
327
|
+
`),0}async function lt(p){if(p.includes("--help")||p.includes("-h"))return Z(ce,!0);let l=await le();if(!l)return 2;let k=await Pe(l);if(k.length===0)return await q(`No baselines found in ${l.baselineDir}.
|
|
328
|
+
`),0;for(let y of k){let v=y.git?` ${w(y.git)}`:"";await q(`${y.name} ${y.workloads} workloads created ${y.createdAt} toolVersion ${y.toolVersion}${v}
|
|
329
|
+
`)}return 0}async function ct(p){let[l,...k]=p;if(!l||l==="--help"||l==="-h")return Z(ce,!!l);let y=Oe(l);if(y)return await F("invalid-flag",`${y}
|
|
330
|
+
Run 'ostia baseline --help'.`),2;let v=await le();if(!v)return 2;return Re([s(v,l),...k])}async function Ne(p,l,k,y,v,M=""){if(p===void 0||p==="--help"||p==="-h")return Z(y,p!==void 0);let R=k[p];if(!R)return await F("invalid-flag",v(p)),2;try{return await R(l)}catch(A){return Fe(A,`${M}${p}`)}}async function dt(p){let[l,...k]=p;return Ne(l,k,{save:rt,list:lt,show:ct},ce,(y)=>`Unknown "ostia baseline ${y}". Run "ostia baseline --help".`,"baseline ")}var mt=`ostia - Bun-native profile IR engine
|
|
331
331
|
|
|
332
332
|
Commands:
|
|
333
333
|
time Time commands N times and report timing/CPU/heap
|
|
@@ -338,4 +338,4 @@ Commands:
|
|
|
338
338
|
baseline Manage baseline ProfileDocuments (save/list/show)
|
|
339
339
|
|
|
340
340
|
Run "ostia <command> --help" for details.
|
|
341
|
-
|
|
341
|
+
`;async function ut(){let[p,...l]=process.argv.slice(2);return Ne(p,l,{time:Ge,bench:Xe,compare:et,report:Re,ci:it,baseline:dt},mt,(k)=>`Unknown subcommand "${k}". Run "ostia --help".`)}if(import.meta.main)ut().then((p)=>process.exit(p));export{Q as CliUsageError,Be as parseIntFlag};
|
package/index.d.ts
CHANGED
|
@@ -391,8 +391,10 @@ interface TimingStats {
|
|
|
391
391
|
mild: number;
|
|
392
392
|
severe: number;
|
|
393
393
|
};
|
|
394
|
-
/**
|
|
394
|
+
/** 25th percentile, ns. Optional: absent on documents saved before this
|
|
395
395
|
* field existed (`loadDocument` never backfills it). */
|
|
396
|
+
p25?: number;
|
|
397
|
+
/** 75th percentile, ns. Same caveat as `p25`. */
|
|
396
398
|
p75?: number;
|
|
397
399
|
/** 99th percentile, ns. Same caveat as `p75`. */
|
|
398
400
|
p99?: number;
|
|
@@ -459,8 +461,6 @@ interface MemoryEvidence {
|
|
|
459
461
|
heapSizeBytes?: number;
|
|
460
462
|
}[];
|
|
461
463
|
maxRssBytes?: number;
|
|
462
|
-
peakCommitBytes?: number;
|
|
463
|
-
pageFaults?: number;
|
|
464
464
|
/** Bytes allocated per call, from `ostia bench --alloc`: heap size delta
|
|
465
465
|
* (`bun:jsc`'s `heapStats().heapSize`, falling back to
|
|
466
466
|
* `process.memoryUsage().heapUsed`) around one `Bun.gc(true)`-bracketed
|
|
@@ -508,9 +508,6 @@ export interface Comparison {
|
|
|
508
508
|
timing?: {
|
|
509
509
|
medianDeltaPct: number;
|
|
510
510
|
meanDeltaPct: number;
|
|
511
|
-
/** Same value as `medianDeltaPct`, named for what it is used for: the
|
|
512
|
-
* effect size the verdict rule tests against `thresholds.timingPct`. */
|
|
513
|
-
effectPct: number;
|
|
514
511
|
/** 95% bootstrap confidence interval on the difference of medians,
|
|
515
512
|
* percent of the baseline median. Absent when either side had fewer
|
|
516
513
|
* than 5 samples (see the `thin-comparison` warning). */
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{c,C,b,Q,u,i,ee,ne,te,V,re}from"./chunk-cf9hya3b.js";import{t,a,A,r,U,se,ie}from"./chunk-1wydyvyj.js";export{c as DEFAULT_THRESHOLDS,u as MINIMAL_PROTOCOL_VERSION,A as OstiaDocumentError,b as bench,C as compareDocuments,t as createDocument,te as defineConfig,se as group,U as keep,r as loadDocument,re as profile,Q as range,i as renderers,ee as run,a as saveDocument,ne as sweep,ie as task,V 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{
|
|
4
|
-
`),2;let e=
|
|
5
|
-
`),2;let r=
|
|
6
|
-
`);let n=
|
|
7
|
-
`),2;if(e.planPath){let t=n.map((o)=>({id:
|
|
3
|
+
import{a,M,X,v,G,T,R}from"./chunk-1wydyvyj.js";async function d(){let[s,l,c]=process.argv.slice(2);if(!s||!l)return process.stderr.write(`bench runner: usage: runner.ts <suiteFile> <outputPath> [optsJson]
|
|
4
|
+
`),2;let e=c?JSON.parse(c):{};for(let t of e.preload??[])await import(t);X(),await import(s);let i=M();if(i.length===0)return process.stderr.write(`bench runner: ${s} registered no tasks (no task() calls found).
|
|
5
|
+
`),2;let r=i.filter((t)=>t.only),p=r.length>0?r:i;if(r.length>0)process.stderr.write(`bench: ${r.length} task(s) selected by .only
|
|
6
|
+
`);let n=T(p,e.filter);if(e.taskIds){let t=new Set(e.taskIds);n=n.filter((o)=>t.has(v(o)))}if(n.length===0)return process.stderr.write(`bench runner: --filter ${JSON.stringify(e.filter)} matched zero of ${p.length} registered task(s) in ${s}.
|
|
7
|
+
`),2;if(e.planPath){let t=n.map((o)=>({id:v(o),isolate:G(o,e.isolate??!1)}));await Bun.write(e.planPath,JSON.stringify({tasks:t}))}let f=e.taskIds?n:n.filter((t)=>!G(t,e.isolate??!1)),u=await R(s,f,e);return await a(u,l),0}d().then((s)=>process.exit(s));
|
package/chunk-2s4xk1mg.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
class we extends Error{}function I(n){if(typeof n.pattern==="string")return;let{flags:s}=n.pattern;if(s.includes("g")||s.includes("y")||s.includes("d"))throw RangeError("timeSource pattern must not use the g or y flag")}function O(...n){let s=n.filter((o)=>o!==void 0);if(s.length===0)return;if(s.length===1)return s[0];return AbortSignal.any(s)}var Ke={ns:1,us:1000,ms:1e6,s:1e9};async function z(n){let s=n.timeSource!==void 0,o=Bun.nanoseconds(),u=!1,l=n.timeoutMs!==void 0?AbortSignal.timeout(n.timeoutMs):void 0;l?.addEventListener("abort",()=>{u=!0},{once:!0});let f=O(l,n.signal),T=Bun.spawn(n.argv,{cwd:n.cwd,env:n.env,stdout:s?"pipe":"ignore",stderr:s?"pipe":"ignore",stdin:"ignore",...f&&{signal:f,killSignal:"SIGKILL"}}),B=s?Promise.all([new Response(T.stdout).text(),new Response(T.stderr).text()]):void 0,C=await T.exited,_=Bun.nanoseconds(),U=T.resourceUsage?.(),M={wallNs:_-o,exitCode:u?null:C,userNs:U?Number(U.cpuTime.user)*1000:void 0,systemNs:U?Number(U.cpuTime.system)*1000:void 0,maxRssBytes:U?.maxRSS,...u?{timedOut:!0}:{}};if(B){let[W,ne]=await B;if(n.timeSource&&!u)try{M.reportedNs=Ye(n.timeSource,W,ne,n.argv)}catch(Q){if(!(Q instanceof we))throw Q;M.timeSourceNoMatch=!0,M.timeSourceMissOutput=Ze(W,ne)}}return M}function Ye(n,s,o,u=[]){let l=typeof n.pattern==="string"?new RegExp(n.pattern):n.pattern,f=n.group??1,T=l.exec(s)??l.exec(o),B=u.length>0?` for "${u.join(" ")}"`:"";if(!T)throw new we(`timeSource pattern ${l} did not match the output${B}. Output was:
|
|
3
|
-
${ve(s,o)}`);let C=T[f];if(C===void 0)throw Error(`timeSource pattern ${l} matched${B} but has no capture group ${f} (matched text: "${T[0]}").`);let _=Number(C);if(!Number.isFinite(_))throw Error(`timeSource pattern ${l} group ${f} captured "${C}"${B}, which is not a number.`);return _*Ke[n.unit??"ms"]}function ve(n,s){let u=(f)=>f.length>800?`${f.slice(0,800)}\u2026(${f.length-800} more)`:f,l=[];if(n.trim())l.push(`--- stdout ---
|
|
4
|
-
${u(n.trimEnd())}`);if(s.trim())l.push(`--- stderr ---
|
|
5
|
-
${u(s.trimEnd())}`);return l.length>0?l.join(`
|
|
6
|
-
`):"(empty)"}var he=2048;function Ze(n,s){let o=ve(n,s);if(Buffer.byteLength(o,"utf8")<=he)return o;let u=o.slice(0,he);while(Buffer.byteLength(u,"utf8")>he)u=u.slice(0,-1);return`${u}\u2026`}var Xe=1048576,Qe=(n)=>`
|
|
7
|
-
\u2026(${n} bytes elided)\u2026
|
|
8
|
-
`;async function en(n,s=Xe){let o=Math.floor(s/2),u=n.getReader(),l=[],f=0,T=[],B=0,C=0;try{for(;;){let{done:ne,value:Q}=await u.read();if(ne)break;if(!Q||Q.byteLength===0)continue;C+=Q.byteLength;let j=Q;if(f<o){let G=o-f;if(j.byteLength<=G){l.push(j),f+=j.byteLength;continue}l.push(j.subarray(0,G)),f+=G,j=j.subarray(G)}T.push(j),B+=j.byteLength;while(B>o&&T.length>0){let G=T[0],Z=B-o;if(G.byteLength<=Z)T.shift(),B-=G.byteLength;else T[0]=G.subarray(Z),B-=Z}}}finally{u.releaseLock()}let _=new TextDecoder,U=_.decode(Re(l));if(C<=f+B)return U;let M=_.decode(Re(T)),W=C-f-B;return`${U}${Qe(W)}${M}`}function Re(n){let s=n.reduce((l,f)=>l+f.byteLength,0),o=new Uint8Array(s),u=0;for(let l of n)o.set(l,u),u+=l.byteLength;return o}async function N(n,s,o){if(typeof n==="function"){await n(s);return}let u=ke(n),l=!1,f=o.timeoutMs!==void 0?AbortSignal.timeout(o.timeoutMs):void 0;f?.addEventListener("abort",()=>{l=!0},{once:!0});let T=O(f,o.signal),B=Bun.spawn(u,{cwd:o.cwd,env:o.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...T&&{signal:T,killSignal:"SIGKILL"}}),C=en(B.stderr).catch(()=>""),_=await B.exited;if(l){let U=(await C).trim();throw Error(`prepare command "${u.join(" ")}" timed out after ${o.timeoutMs}ms before ${s.phase} trial ${s.index}.${U?`
|
|
9
|
-
${U}`:""}`)}if(o.signal?.aborted)return;if(_!==0){let U=(await C).trim();throw Error(`prepare command "${u.join(" ")}" exited with code ${_} before ${s.phase} trial ${s.index}.${U?`
|
|
10
|
-
${U}`:""}`)}}function ke(n){if(n===void 0||typeof n==="function")return;return Array.isArray(n)?n:b(n)}function Ie(n){if(n===void 0)return;return{pattern:typeof n.pattern==="string"?n.pattern:n.pattern.source,...n.group!==void 0&&{group:n.group},...n.unit!==void 0&&{unit:n.unit}}}function b(n){return n.trim().split(/\s+/).filter(Boolean)}import{renameSync as tn}from"fs";var Ne={name:"ostia",version:"0.2.3",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"./src/cli/main.ts"},scripts:{build:"bun scripts/build.ts",test:"bun test",typecheck:"tsc6",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.12","@types/bun":"^1.4.0",knip:"^6.34.0",typescript:"npm:@typescript/typescript6@^6.0.2"}};var w=Ne.version;function R(n){return JSON.stringify(fe(n))}function fe(n){if(Array.isArray(n))return n.map(fe);if(n!==null&&typeof n==="object"){let s={};for(let o of Object.keys(n).sort())s[o]=fe(n[o]);return s}return n}function e(n,...s){let o=Bun.CryptoHasher.hash("sha256",R(s),"hex");return`${n}_${o.slice(0,16)}`}var ge,Ee=!1;function ye(n){let s=Bun.spawnSync(["git",...n],{timeout:200,stdout:"pipe",stderr:"ignore"});return s.success?s.stdout.toString().trim():void 0}function Pe(){if(Ee)return ge;Ee=!0;try{let n=ye(["rev-parse","--short","HEAD"]);if(n===void 0)ge=void 0;else{let s=ye(["rev-parse","--abbrev-ref","HEAD"]),o=ye(["status","--porcelain"]);ge={sha:n,branch:s??"HEAD",dirty:(o?.length??0)>0}}}catch{ge=void 0}return ge}function t(n,s,o){let u=Pe();return{schemaVersion:2,toolVersion:w,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:n,measurements:s,...o!==void 0&&{environment:o},...u!==void 0&&{git:u}}}function k(n,s,o={}){if(o.timeSource)I(o.timeSource);let u=ke(o.prepare),l=Ie(o.timeSource),f=typeof o.prepare==="function"?o.prepare.toString():u;return{id:e("wl","subprocess",n,...f!==void 0||l!==void 0?[f??null,l??null]:[]),kind:"subprocess",command:n,label:s,...u!==void 0&&{prepare:u},...l!==void 0&&{timeSource:l}}}function q(n,s){return{id:e("wl","inprocess",n.name,n.toString()),kind:"inprocess",label:s}}function Be(n,s,o={}){return{id:o.params!==void 0?e("wl","inprocess-entry",n,s,o.params):e("wl","inprocess-entry",n,s),kind:"inprocess",entry:{file:n,task:s,...o.group!==void 0&&{group:o.group}},...o.label!==void 0&&{label:o.label},...o.baseline!==void 0&&{baseline:o.baseline},...o.description!==void 0&&{description:o.description},...o.groupDescription!==void 0&&{groupDescription:o.groupDescription},...o.isolated!==void 0&&{isolated:o.isolated},...o.params!==void 0&&{params:o.params},...o.skipped!==void 0&&{skipped:o.skipped}}}function m(n){return{id:e("run",n.workload.id,"timing",n.configFingerprint,Bun.version,w),workloadId:n.workload.id,phase:"timing",instrumented:!1,configFingerprint:n.configFingerprint,trials:n.trials,timing:n.timing,warnings:n.warnings,artifacts:[],memory:rn(n.trials),...n.interleaved!==void 0&&{interleaved:n.interleaved}}}function rn(n){let s=n.map((o)=>o.maxRssBytes).filter((o)=>o!==void 0);if(s.length===0)return;return{origin:"resourceUsage",perTrial:n.map((o)=>({rssBytes:o.maxRssBytes})),maxRssBytes:Math.max(...s)}}function d(n){return{id:e("run",n.workload.id,n.phase,n.configFingerprint,Bun.version,w),workloadId:n.workload.id,phase:n.phase,instrumented:!0,configFingerprint:n.configFingerprint,trials:[{i:0,wallNs:n.diagnosticWallNs,exitCode:n.exitCode}],diagnosticWallNs:n.diagnosticWallNs,cpu:n.cpu,heap:n.heap,memory:n.memory,jit:n.jit,warnings:n.warnings,artifacts:n.artifacts}}async function K(n,s,o){let l=await Bun.file(o).arrayBuffer(),f=new Bun.CryptoHasher("sha256");return f.update(l),{id:e("art",n,s,o),kind:s,path:o,sha256:f.digest("hex"),bytes:l.byteLength}}function a(n){return e("cfg",n)}function V(n){return`${JSON.stringify(fe(n),null,2)}
|
|
11
|
-
`}async function c(n,s){let o=V(n),u=`${s}.tmp-${process.pid}`;await Bun.write(u,o),tn(u,s)}function on(n){if(n.schemaVersion===2)return n;let{runs:s,comparisons:o,...u}=n;return{...u,schemaVersion:2,measurements:s.map(({baselineRunId:l,...f})=>f),...o!==void 0&&{comparisons:o.map(({baselineRunId:l,candidateRunId:f,...T})=>({...T,baselineMeasurementId:l,candidateMeasurementId:f}))}}}class D extends Error{code;path;schemaVersion;constructor(n,s,o={}){super(s);this.name="OstiaDocumentError",this.code=n,this.path=o.path,this.schemaVersion=o.schemaVersion}}async function r(n){let s=await Bun.file(n).text(),o;try{o=JSON.parse(s)}catch(l){let f=l instanceof Error?l.message:String(l);throw new D("invalid-json",`${n}: invalid JSON (${f})`,{path:n})}let u=o!==null&&typeof o==="object"?o.schemaVersion:void 0;if(typeof u!=="number")throw new D("not-a-document",`${n}: not a ProfileDocument (missing schemaVersion)`,{path:n});if(u!==1&&u!==2)throw new D("unsupported-schema",`${n}: unsupported ProfileDocument schemaVersion ${u} (this ostia reads 1\u20132)`,{path:n,schemaVersion:u});return on(o)}import Te from"os";function h(n){if(n.length===0)throw Error("computeTimingStats: samples must be non-empty");let s=n.length,o=Oe(n),u=0;for(let g=0;g<s;g++)u+=n[g];let l=u/s,f=i(o,0.5),T=0;for(let g=0;g<s;g++){let L=n[g]-l;T+=L*L}let B=Math.sqrt(T/s),C=o[0],_=o[s-1],U=i(o,0.25),M=i(o,0.75),W=M-U,ne=U-1.5*W,Q=M+1.5*W,j=U-3*W,G=M+3*W,Z=0,te=0;for(let g=0;g<s;g++){let L=n[g];if(L<j||L>G)te++;else if(L<ne||L>Q)Z++}let ue=i(o,0.99),ee=new Float64Array(s);for(let g=0;g<s;g++)ee[g]=Math.abs(n[g]-f);ee.sort();let ie=i(ee,0.5);return{unit:"ns",samples:n,mean:l,median:f,stddev:B,min:C,max:_,outliers:{mild:Z,severe:te},p75:M,p99:ue,mad:ie}}function Oe(n){let s=new Float64Array(n.length);return s.set(n),s.sort(),s}function i(n,s){let o=n.length;if(o===1)return n[0];let u=s*(o-1),l=Math.floor(u),f=Math.ceil(u);if(l===f)return n[l];let T=u-l;return n[l]*(1-T)+n[f]*T}var sn=5000000,an=200;function S(n,s,o="subprocess",u=[]){let l=[],f=n.samples[0];if(f!==void 0){let C=Oe(n.samples),_=i(C,0.25),M=i(C,0.75)-_;if(f>n.median+3*M&&M>0)l.push({code:"slow-first-run",message:`First run took ${(f/1e6).toFixed(2)}ms, much slower than the median ${(n.median/1e6).toFixed(2)}ms. Consider more warmup.`,data:{firstNs:f,medianNs:n.median}})}if(n.outliers.mild+n.outliers.severe>0)l.push({code:"outliers-detected",message:`${n.outliers.mild+n.outliers.severe} outlier(s) detected (${n.outliers.severe} severe, ${n.outliers.mild} mild).`,data:n.outliers});if(o==="subprocess"&&n.median<sn)l.push({code:"fast-command",message:`Median run time (${(n.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:n.median}});if(o==="inprocess"&&n.median<an)l.push({code:"below-timer-resolution",message:`Median run time (${n.median.toFixed(0)}ns) is close to timer resolution; consider a larger batch size or a coarser operation.`,data:{medianNs:n.median}});let T=new Set(u),B=s.filter((C)=>C!==void 0&&C!==0&&!T.has(C));if(B.length>0)l.push({code:"nonzero-exit",message:`${B.length} of ${s.length} trial(s) exited non-zero.`,data:{exitCodes:B}});return l}var un=200,Ae=64,cn=(()=>{let n=new Uint8Array(4096);for(let s=0;s<n.length;s++)n[s]=s*2654435761&255;return n})();function ln(n,s){let o=s;for(let u=0;u<n.length;u++)o^=n[u],o=Math.imul(o,16777619);return o>>>0}function mn(n){let s=h(n),o=s.mad??0;return{floorPct:s.median===0?0:o/s.median*100,referenceMedianNs:s.median,samples:n.length}}function Fe(n=un){let s=n*1e6,o=[],u=0,l=Bun.nanoseconds(),f=0;while(f<s){let T=Bun.nanoseconds();for(let C=0;C<Ae;C++)u^=ln(cn,C);let B=Bun.nanoseconds();o.push((B-T)/Ae),f=Bun.nanoseconds()-l}return mn(o)}var dn=0.75;function p(){let[n=0,s=0]=Te.loadavg();return{cpuModel:Te.cpus()[0]?.model??"unknown",cores:Te.availableParallelism(),loadAvg1:n,loadAvg5:s,noise:Fe()}}function F(n){if(n.loadAvg1<=n.cores*dn)return;return{code:"noisy-machine",message:`Load average ${n.loadAvg1.toFixed(2)} exceeds 75% of ${n.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:n.loadAvg1,cores:n.cores}}}import{profile as fn}from"bun:jsc";var pn=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Ce=4294967295;function Ue(n,s){let o=s??n.interval*1e6,u=new Map,l=[];function f(g,L,J,ce){let le=u.get(g);if(le===void 0)le=new Map,u.set(g,le);let ae=L??"",me=le.get(ae);if(me===void 0)me=l.length,le.set(ae,me),l.push({key:e("fr",g,ae),name:g,url:L,line:J,col:ce});return me}function T(g){let L=g.line===Ce,J=L?void 0:g.line-1,ce=L||g.column===Ce?void 0:g.column-1;return f(g.name,g.sourceURL,J,ce)}let B=f("(root)",void 0,void 0,void 0),C=1,_={id:0,frameIx:B,children:new Map,selfUs:0,samples:0,totalUs:0},U=new Map([[0,_]]),M={llint:0,baseline:0,dfg:0,ftl:0},W=new Map,ne=[],Q=[];for(let g of n.traces){let L=g.frames,J=_;for(let ae=L.length-1;ae>=0;ae--){let me=T(L[ae]),de=J.children.get(me);if(!de)de={id:C++,frameIx:me,children:new Map,selfUs:0,samples:0,totalUs:0},J.children.set(me,de),U.set(de.id,de);J=de}J.selfUs+=o,J.samples+=1,ne.push(J.id),Q.push(o);let ce=L[0],le=ce&&pn.get(ce.category);if(le){M[le]++;let ae=W.get(le)??new Map;ae.set(J.frameIx,(ae.get(J.frameIx)??0)+1),W.set(le,ae)}}function j(g){let L=g.selfUs;for(let J of g.children.values())L+=j(J);return g.totalUs=L,L}j(_);let G=new Map;function Z(g){let L=G.get(g.frameIx);if(L)L.selfUs+=g.selfUs,L.totalUs+=g.totalUs,L.samples+=g.samples;else G.set(g.frameIx,{frameIx:g.frameIx,selfUs:g.selfUs,totalUs:g.totalUs,samples:g.samples});for(let J of g.children.values())Z(J)}Z(_);let te=[...U.values()].map((g)=>({id:g.id,frameIx:g.frameIx,children:[...g.children.values()].map((L)=>L.id)})),ue={origin:"jsc-profile",samplingIntervalUs:o,frames:l,nodes:te,totals:[...G.values()].sort((g,L)=>L.selfUs-g.selfUs),samples:{nodeIds:ne,timeDeltasUs:Q}},ee=[...W.entries()].flatMap(([g,L])=>[...L.entries()].sort((J,ce)=>ce[1]-J[1]).slice(0,3).map(([J,ce])=>({tier:g,frameKey:l[J].key,samples:ce})));return{cpu:ue,jit:{origin:"jsc-profile",tiers:M,topFramesByTier:ee}}}var gn=1000;async function E(n,s={}){let o=s.intervalUs??gn,u,l=Bun.nanoseconds(),f=await fn(async()=>(u=await n(),u),o),T=Bun.nanoseconds()-l,{cpu:B,jit:C}=Ue(f.stackTraces,o);return{result:u,cpu:B,jit:C,diagnosticWallNs:T}}var bn=500,hn=20,$e=3,wn=10,kn=2,yn=0.1,Tn=1000,xn=1e4;function _e(n){let s=Math.log10(Math.max(1,n)/1e6),o=Math.round($e+kn*s);return Math.min(wn,Math.max($e,o))}function Sn(n,s){let o=Math.floor(s/n);return Math.min(hn,Math.max(o,_e(n)))}var De=0;function A(n){if(typeof n==="number")De+=n;else if(n!==void 0&&n!==null)De+=1}function be(n){return n!==null&&typeof n==="object"&&typeof n.then==="function"}function Le(n,s){return Math.max(1,Math.ceil(Tn/n),Math.ceil(s/(n*xn)))}async function We(n,s={}){let o=(s.budgetMs??bn)*1e6,u=o*(s.warmup??yn),l=Bun.nanoseconds(),f=0,T=0;while(T<u){let ee=n();A(be(ee)?await ee:ee),f++,T=Bun.nanoseconds()-l}let B;if(f>0)B=Math.max(1,T/f);else{let ee=Bun.nanoseconds(),ie=n();A(be(ie)?await ie:ie),B=Math.max(1,Bun.nanoseconds()-ee)}let C=Le(B,o);if(C>1){let ee=Bun.nanoseconds();for(let ie=0;ie<C;ie++){let g=n();A(be(g)?await g:g)}B=Math.max(1,(Bun.nanoseconds()-ee)/C),C=Le(B,o)}let _=B*C,U=s.samples??s.minSamples??Sn(_,o),M=s.samples!==void 0?0:o,W=[],ne=Bun.nanoseconds(),Q=0,j=0;while(j<U||Q<M){let ee=Bun.nanoseconds();for(let g=0;g<C;g++){let L=n();A(be(L)?await L:L)}let ie=Bun.nanoseconds();if(W.push({i:j,wallNs:(ie-ee)/C}),j++,Q=Bun.nanoseconds()-ne,s.gc)Bun.gc(!0);if(s.samples!==void 0&&j>=s.samples)break}let G=W.map((ee)=>ee.wallNs),Z=h(G);if(C>1)Z.batch=C;let te=S(Z,[],"inprocess"),ue=_e(_);if(W.length<ue)te.push({code:"low-sample-count",message:`Only ${W.length} sample(s) at ~${Mn(_)} per trial; ${ue} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:W.length,target:ue,trialCostNs:_}});return{trials:W,timing:Z,warnings:te}}function Mn(n){if(n>=1e9)return`${(n/1e9).toFixed(2)}s`;if(n>=1e6)return`${(n/1e6).toFixed(1)}ms`;if(n>=1000)return`${(n/1000).toFixed(1)}\xB5s`;return`${n.toFixed(0)}ns`}var Me=[],oe,pe;function xe(n,s,o,u){let l=oe;oe={name:n,description:o?.description,isolate:o?.isolate,gc:o?.gc,cpu:o?.cpu,alloc:o?.alloc,before:o?.before,after:o?.after,skip:u.skip,only:u.only};try{s()}finally{oe=l}}var re=Object.assign((n,s,o)=>xe(n,s,o,{}),{skip:(n,s,o)=>xe(n,s,o,{skip:!0}),only:(n,s,o)=>xe(n,s,o,{only:!0})});function Se(n,s,o,u){let l=pe!==void 0||o?.params!==void 0?{...pe,...o?.params}:void 0;Me.push({groupName:oe?.name,groupDescription:oe?.description,groupIsolate:oe?.isolate,groupGc:oe?.gc,groupCpu:oe?.cpu,groupAlloc:oe?.alloc,groupBefore:oe?.before,groupAfter:oe?.after,name:n,fn:s,baseline:o?.baseline,params:l,skipped:u.skip||oe?.skip,only:u.only||oe?.only,opts:o})}var se=Object.assign((n,s,o)=>Se(n,s,o,{}),{skip:(n,s,o)=>Se(n,s,o,{skip:!0}),only:(n,s,o)=>Se(n,s,o,{only:!0})});function x(){return Me}function Y(){Me.length=0,oe=void 0,pe=void 0}function X(n,s){let o=pe;pe=n;try{return s()}finally{pe=o}}function y(n){return n.groupName?`${n.groupName}/${n.name}`:n.name}function H(n,s){return n.opts?.isolate??n.groupIsolate??s}function Ge(n,s){return n.opts?.gc??n.groupGc??s}function je(n,s){return n.opts?.cpu??n.groupCpu??s}function He(n,s){return n.opts?.alloc??n.groupAlloc??s}function v(n,s){if(!s)return[...n];let o=new RegExp(s);return n.filter((u)=>o.test(y(u)))}import{heapStats as Rn}from"bun:jsc";var vn=100;function Je(){try{return Rn().heapSize}catch{return process.memoryUsage().heapUsed}}async function Ve(n,s=vn){let o=Bun.nanoseconds();Bun.gc(!0);let u=Je();for(let T=0;T<s;T++){let B=n();if(B instanceof Promise)await B}Bun.gc(!0);let l=Je(),f=Bun.nanoseconds()-o;return{memory:{origin:"heapStats",bytesPerOp:Math.max(0,(l-u)/s)},diagnosticWallNs:f}}var In=200,Nn=20;async function qe(n,s=In){let o=s*1e6,u=async()=>{let B=Bun.nanoseconds();while(Bun.nanoseconds()-B<o){let C=n();if(C instanceof Promise)await C}},{cpu:l,jit:f,diagnosticWallNs:T}=await E(u);return{cpu:l,jit:f,diagnosticWallNs:T}}function ze(n){let{llint:s,baseline:o,dfg:u,ftl:l}=n.tiers,f=s+o+u+l;if(f===0)return;let T=s/f*100,B=o/f*100,C=u/f*100,_=l/f*100;if(T+B<=Nn)return;return{code:"jit-cold",message:`${(T+B).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:T,baselinePct:B,dfgPct:C,ftlPct:_}}}async function P(n,s,o){let l=s.some((U)=>!U.skipped)&&o.noiseCheck!==!1?p():void 0,f=l?F(l):void 0,T=new Map,B=new Map;s.forEach((U,M)=>{if(U.groupName===void 0||U.skipped)return;if(!T.has(U.groupName))T.set(U.groupName,M);B.set(U.groupName,M)});let C=[],_=[];for(let U=0;U<s.length;U++){let M=s[U],W=y(M),ne=Be(n,W,{label:W,baseline:M.baseline,group:M.groupName,description:M.opts?.description,groupDescription:M.groupDescription,isolated:o.markIsolated,params:M.params,skipped:M.skipped});if(C.push(ne),M.skipped)continue;let Q=M.groupName!==void 0&&T.get(M.groupName)===U,j=M.groupName!==void 0&&B.get(M.groupName)===U;if(Q&&M.groupBefore)await M.groupBefore();if(M.opts?.before)await M.opts.before();let G={budgetMs:M.opts?.budgetMs??o.budgetMs,samples:M.opts?.samples??o.samples,minSamples:M.opts?.minSamples??o.minSamples,warmup:o.warmup,gc:Ge(M,o.gc??!1)},Z=await We(M.fn,G);if(_.push(m({workload:ne,configFingerprint:a({budgetMs:G.budgetMs??null,samples:G.samples??null,minSamples:G.minSamples??null,gc:G.gc??!1}),trials:Z.trials,timing:Z.timing,warnings:f&&_.length===0?[...Z.warnings,f]:Z.warnings})),je(M,o.cpu??!1)){let te=await qe(M.fn),ue=ze(te.jit);_.push(d({workload:ne,phase:"cpu",configFingerprint:a({cpu:!0}),diagnosticWallNs:te.diagnosticWallNs,cpu:te.cpu,jit:te.jit,warnings:ue?[ue]:[],artifacts:[]}))}if(He(M,o.alloc??!1)){let te=await Ve(M.fn);_.push(d({workload:ne,phase:"memstats",configFingerprint:a({alloc:!0}),diagnosticWallNs:te.diagnosticWallNs,memory:te.memory,warnings:[],artifacts:[]}))}if(M.opts?.after)await M.opts.after();if(j&&M.groupAfter)await M.groupAfter()}return t(C,_,l)}
|
|
12
|
-
export{R,e,h,i,S,I,O,z,N,b,w,t,k,q,m,d,K,a,V,c,D,r,p,F,E,A,re,se,x,Y,X,y,H,v,P};
|
package/chunk-dpxy38mq.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{R,e,h,i,S,I,O,z,N,b,t,k,q,m,d,K,a,V,r,p,F,E,x,X,v,P}from"./chunk-2s4xk1mg.js";function Le(c,y,w){let H=c[0];if(H==="bun"||H?.endsWith("/bun"))return{argv:[H,...y,...c.slice(1)],env:w};return{argv:c,env:{...process.env,...w,BUN_OPTIONS:y.join(" ")}}}function Hn(c){return c.startsWith("file://")?c.slice(7):c}function _e(c,y,w){let H=c.nodes,A=H.length,ie=new Map,Y=[],D=new Map,se=new Int32Array(A);for(let ae=0;ae<A;ae++){let fe=H[ae],ce=fe.callFrame,ye=Hn(ce.url),ke=ie.get(ce.functionName);if(ke===void 0)ke=new Map,ie.set(ce.functionName,ke);let Pe=ke.get(ye);if(Pe===void 0)Pe=Y.length,ke.set(ye,Pe),Y.push({key:e("fr",ce.functionName,ye),name:ce.functionName,url:ye||void 0,line:ce.lineNumber>=0?ce.lineNumber:void 0,col:ce.columnNumber>=0?ce.columnNumber:void 0});se[ae]=Pe,D.set(fe.id,ae)}let le=Array(A);for(let ae=0;ae<A;ae++){let fe=H[ae];le[ae]={id:fe.id,frameIx:se[D.get(fe.id)],children:fe.children??[]}}let re=new Float64Array(A),ue=new Float64Array(A),{samples:oe,timeDeltas:me}=c;for(let ae=0;ae<oe.length;ae++){let fe=D.get(oe[ae]);if(fe===void 0)continue;re[fe]+=me[ae]??0,ue[fe]+=1}let pe=new Int32Array(A).fill(-1);for(let ae=0;ae<A;ae++){let fe=H[ae].children;if(!fe)continue;for(let ce of fe){let ye=D.get(ce);if(ye!==void 0)pe[ye]=ae}}let de=[],ge=[];for(let ae=A-1;ae>=0;ae--)if(pe[ae]===-1)ge.push(ae);while(ge.length>0){let ae=ge.pop();de.push(ae);let fe=H[ae].children;if(!fe)continue;for(let ce of fe){let ye=D.get(ce);if(ye!==void 0&&pe[ye]===ae)ge.push(ye)}}let he=new Float64Array(A);for(let ae=de.length-1;ae>=0;ae--){let fe=de[ae];he[fe]+=re[fe];let ce=pe[fe];if(ce>=0)he[ce]+=he[fe]}let xe=Array(Y.length),we=[];for(let ae=0;ae<A;ae++){let fe=le[ae].frameIx,ce=xe[fe];if(ce)ce.selfUs+=re[ae],ce.totalUs+=he[ae],ce.samples+=ue[ae];else{let ye={frameIx:fe,selfUs:re[ae],totalUs:he[ae],samples:ue[ae]};xe[fe]=ye,we.push(ye)}}return{origin:y,samplingIntervalUs:w,frames:Y,nodes:le,totals:we.sort((ae,fe)=>fe.selfUs-ae.selfUs),samples:{nodeIds:c.samples,timeDeltasUs:c.timeDeltas}}}async function nn(c){let y=`${c.artifactDir}/${c.fileName}`,{argv:w,env:H}=Le(c.argv,["--cpu-prof","--cpu-prof-dir",c.artifactDir,"--cpu-prof-name",c.fileName,"--cpu-prof-interval",String(c.intervalUs)],c.env),A=Bun.nanoseconds(),Y=await Bun.spawn(w,{cwd:c.cwd,env:H,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,D=Bun.nanoseconds()-A,se=Bun.file(y);if(!await se.exists())return{diagnosticWallNs:D,exitCode:Y,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${y} after exit ${Y}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:y,argv:c.argv}}]};let le=await se.json(),re=_e(le,"cpu-prof",c.intervalUs),ue=le.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:D,exitCode:Y,artifactPath:y,cpu:re,warnings:ue}}function tn(c,y="heap-prof"){let{node_fields:w,node_types:H}=c.snapshot.meta,A=w.indexOf("type"),ie=w.indexOf("self_size"),Y=w.length,D=H[0];if(A===-1||ie===-1||!Array.isArray(D))return{origin:y,typeCounts:[],objectCount:c.snapshot.node_count};let se=D.length,le=Array(se),re=new Map,ue=[],oe=0,me=c.nodes,pe=me.length;for(let we=0;we<pe;we+=Y){let ae=me[we+A],fe=me[we+ie]??0;oe+=fe;let ce;if(ae>=0&&ae<se){if(ce=le[ae],ce===void 0)ce={type:D[ae],count:0,bytes:0},le[ae]=ce,ue.push(ce)}else{let ye=`unknown(${ae})`;if(ce=re.get(ye),ce===void 0)ce={type:ye,count:0,bytes:0},re.set(ye,ce),ue.push(ce)}ce.count++,ce.bytes+=fe}let de=ue.sort((we,ae)=>ae.count-we.count),ge=de.slice(0,20),he=de.slice(20),xe=ge.map(({type:we,count:ae,bytes:fe})=>({type:we,count:ae,retainedBytes:fe}));if(he.length>0){let we=0,ae=0;for(let fe of he)we+=fe.count,ae+=fe.bytes;xe.push({type:"other",count:we,retainedBytes:ae})}return{origin:y,heapSizeBytes:oe,objectCount:c.snapshot.node_count,typeCounts:xe}}async function rn(c){let y=`${c.artifactDir}/${c.fileName}`,{argv:w,env:H}=Le(c.argv,["--heap-prof","--heap-prof-dir",c.artifactDir,"--heap-prof-name",c.fileName],c.env),A=Bun.nanoseconds(),Y=await Bun.spawn(w,{cwd:c.cwd,env:H,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,D=Bun.nanoseconds()-A,se=Bun.file(y);if(!await se.exists())return{diagnosticWallNs:D,exitCode:Y,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${y} after exit ${Y}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:y,argv:c.argv}}]};let le=await se.json(),re=tn(le,"heap-prof");return{diagnosticWallNs:D,exitCode:Y,artifactPath:y,heap:re,warnings:[]}}import{Session as zn}from"inspector/promises";var Gn=1000;async function sn(c,y={}){let w=y.intervalUs??Gn,H=new zn;H.connect();let A=Bun.nanoseconds();try{await H.post("Profiler.enable"),await H.post("Profiler.setSamplingInterval",{interval:w}),await H.post("Profiler.start");let ie=await c(),{profile:Y}=await H.post("Profiler.stop"),D=Bun.nanoseconds()-A,se=_e(Y,"inspector",w);return{result:ie,cpu:se,diagnosticWallNs:D}}finally{H.disconnect()}}function Kn(c){let y=c>>>0;return()=>{y=y+1831565813|0;let w=Math.imul(y^y>>>15,1|y);return w=w+Math.imul(w^w>>>7,61|w)^w,((w^w>>>14)>>>0)/4294967296}}var je=2000,Jn=2000;function mn(c){let y=c.length,w=y>>1;return y%2===0?(c[w-1]+c[w])/2:c[w]}function on(c,y,w){if(c.length<=w)return c;let H=[...c];for(let A=0;A<w;A++){let ie=A+Math.floor(y()*(H.length-A)),Y=H[A];H[A]=H[ie],H[ie]=Y}return H.slice(0,w)}function an(c,y){let w=c.length,H=new Float64Array(w);for(let A=0;A<w;A++)H[A]=c[Math.floor(y()*w)];return H.sort(),mn(H)}function cn(c,y,w={}){let H=w.seed??(Date.now()^Math.imul(c.length,2654435761))>>>0,A=Kn(H),ie=w.iterations??Jn,Y=c.length>je||y.length>je,D=on(c,A,je),se=on(y,A,je),le=new Float64Array(D);le.sort();let re=mn(le),ue=new Float64Array(ie);for(let oe=0;oe<ie;oe++){let me=an(D,A),pe=an(se,A);ue[oe]=re===0?pe-me===0?0:1/0:(pe-me)/re*100}return ue.sort(),{ci95:[i(ue,0.025),i(ue,0.975)],seed:H,data:{subsampled:Y,iterations:ie}}}function Yn(c){let y=c<0?-1:1,w=Math.abs(c),H=0.254829592,A=-0.284496736,ie=1.421413741,Y=-1.453152027,D=1.061405429,se=0.3275911,le=1/(1+0.3275911*w),re=1-((((1.061405429*le+-1.453152027)*le+1.421413741)*le+-0.284496736)*le+0.254829592)*le*Math.exp(-w*w);return y*re}function qn(c){return 0.5*(1+Yn(c/Math.SQRT2))}function un(c,y){let w=c.length,H=y.length,A=w+H,ie=[...c.map((de)=>({v:de,group:0})),...y.map((de)=>({v:de,group:1}))].sort((de,ge)=>de.v-ge.v),Y=new Float64Array(A),D=0,se=0;while(se<A){let de=se;while(de+1<A&&ie[de+1].v===ie[se].v)de++;let ge=(se+de)/2+1;for(let xe=se;xe<=de;xe++)Y[xe]=ge;let he=de-se+1;if(he>1)D+=he**3-he;se=de+1}let le=0;for(let de=0;de<A;de++)if(ie[de].group===0)le+=Y[de];let re=le-w*(w+1)/2,ue=w*H/2,oe=Math.sqrt(w*H*(A+1-D/(A*(A-1)))/12),me=oe===0?0:(re-ue)/oe,pe=Math.min(1,Math.max(0,2*(1-qn(Math.abs(me)))));return{u:re,z:me,pValue:pe}}var u={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Ye=5;function Ve(c,y){if(c===0)return y===0?0:1/0;return(y-c)/c*100}function Oe(c,y,w){return c.measurements.find((H)=>H.workloadId===y&&H.phase===w)}function Qn(c,y){let w=[];if(c.platform.os!==y.platform.os)w.push({field:"platform.os",base:c.platform.os,cand:y.platform.os});if(c.platform.arch!==y.platform.arch)w.push({field:"platform.arch",base:c.platform.arch,cand:y.platform.arch});if(c.bunVersion!==y.bunVersion)w.push({field:"bunVersion",base:c.bunVersion,cand:y.bunVersion});if(c.environment&&y.environment){if(c.environment.cpuModel!==y.environment.cpuModel)w.push({field:"cpuModel",base:c.environment.cpuModel,cand:y.environment.cpuModel});if(c.environment.cores!==y.environment.cores)w.push({field:"cores",base:c.environment.cores,cand:y.environment.cores})}if(w.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${w.map((H)=>H.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:w}}}function B(c){let y=[];for(let H of c){if(!H.timing)continue;let A=1+H.timing.medianDeltaPct/100;if(Number.isFinite(A)&&A>0)y.push(Math.log(A))}if(y.length===0)return null;let w=y.reduce((H,A)=>H+A,0)/y.length;return(Math.exp(w)-1)*100}function M(c,y,w=u){let H=new Set(c.workloads.map((oe)=>oe.id)),A=new Set(y.workloads.map((oe)=>oe.id)),ie=[];for(let oe of c.workloads){if(!A.has(oe.id))continue;let me=U(c,y,oe.id,w);if(me)ie.push(me)}let Y=c.workloads.filter((oe)=>!A.has(oe.id)),D=y.workloads.filter((oe)=>!H.has(oe.id)),se=0,le=0,re=0;for(let oe of ie){if(!oe.timing)continue;if(oe.timing.verdict==="regressed")se++;else if(oe.timing.verdict==="improved")le++;else re++}let ue=Math.max(w.timingPct,c.environment?.noise.floorPct??0,y.environment?.noise.floorPct??0);return{comparisons:ie,unmatched:{baseOnly:Y,candOnly:D},summary:{matched:ie.length,regressed:se,improved:le,unchanged:re,geomeanPct:B(ie),effectiveTimingPct:ue,verdict:ie.some((oe)=>oe.verdict==="fail")?"fail":"pass"}}}function U(c,y,w,H=u){let A=Oe(c,w,"timing"),ie=Oe(y,w,"timing"),Y=Oe(c,w,"cpu"),D=Oe(y,w,"cpu"),se=Oe(c,w,"heap"),le=Oe(y,w,"heap"),re=y.workloads.find((ae)=>ae.id===w),ue=A?.id??Y?.id??se?.id,oe=ie?.id??D?.id??le?.id??re?.id;if(!ue||!oe)return;let me=!1,pe=[],de=Qn(c,y);if(de)pe.push(de);let ge=Math.max(H.timingPct,c.environment?.noise.floorPct??0,y.environment?.noise.floorPct??0),he;if(A?.timing&&re?.skipped&&!ie?.timing)he={medianDeltaPct:0,meanDeltaPct:0,effectPct:0,verdict:"unchanged"},pe.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:w}});else if(A?.timing&&ie?.timing){let ae=A.timing.samples,fe=ie.timing.samples,ce=Ve(A.timing.median,ie.timing.median),ye=Ve(A.timing.mean,ie.timing.mean),ke=(Pe,be)=>{if(Pe>ge)return"regressed";if(be<-ge)return"improved";return"unchanged"};if(ae.length<Ye||fe.length<Ye){let Pe=ke(ce,ce);if(Pe==="regressed")me=!0;he={medianDeltaPct:ce,meanDeltaPct:ye,effectPct:ce,verdict:Pe},pe.push({code:"thin-comparison",message:`Only ${ae.length} baseline / ${fe.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Ye}+ per side).`,data:{baseSamples:ae.length,candSamples:fe.length}})}else{let Pe=cn(ae,fe,{iterations:H.bootstrapIterations}),be=un(ae,fe),Me=be.pValue<H.alpha?ke(Pe.ci95[0],Pe.ci95[1]):"unchanged";if(Me==="regressed")me=!0;he={medianDeltaPct:ce,meanDeltaPct:ye,effectPct:ce,ci95:Pe.ci95,pValue:be.pValue,seed:Pe.seed,verdict:Me}}}let xe;if(Y?.cpu&&D?.cpu){let ae=new Map(Y.cpu.totals.map((Pe)=>[Y.cpu.frames[Pe.frameIx].key,Pe])),fe=new Map(D.cpu.totals.map((Pe)=>[D.cpu.frames[Pe.frameIx].key,Pe])),ce=new Map(Y.cpu.frames.map((Pe)=>[Pe.key,Pe.name])),ye=new Map(D.cpu.frames.map((Pe)=>[Pe.key,Pe.name]));xe=[...new Set([...ae.keys(),...fe.keys()])].map((Pe)=>{let be=ae.get(Pe)?.selfUs??0,Me=fe.get(Pe)?.selfUs??0;return{frameKey:Pe,name:ye.get(Pe)??ce.get(Pe)??Pe,baseSelfUs:be,candSelfUs:Me,deltaPct:Ve(be,Me)}}).sort((Pe,be)=>Math.abs(be.deltaPct)-Math.abs(Pe.deltaPct));for(let Pe of xe)if((Pe.baseSelfUs>=H.minFrameSelfUs||Pe.candSelfUs>=H.minFrameSelfUs)&&Pe.deltaPct>H.frameSelfPct)me=!0}let we;if(se?.heap&&le?.heap){let ae=new Map(se.heap.typeCounts.map((ye)=>[ye.type,ye])),fe=new Map(le.heap.typeCounts.map((ye)=>[ye.type,ye]));we=[...new Set([...ae.keys(),...fe.keys()])].map((ye)=>{let ke=ae.get(ye),Pe=fe.get(ye);return{type:ye,baseCount:ke?.count??0,candCount:Pe?.count??0,baseBytes:ke?.retainedBytes,candBytes:Pe?.retainedBytes,deltaPct:Ve(ke?.count??0,Pe?.count??0)}}).sort((ye,ke)=>Math.abs(ke.deltaPct)-Math.abs(ye.deltaPct));for(let ye of we)if(ye.deltaPct>H.heapTypePct)me=!0}return{id:e("cmp",ue,oe),baselineMeasurementId:ue,candidateMeasurementId:oe,timing:he,...pe.length>0&&{warnings:pe},frames:xe,heapTypes:we,thresholds:{...H,effectiveTimingPct:ge},verdict:me?"fail":"pass"}}var Ue="node_modules/.cache/ostia",Xn=".ostia/baselines",Zn={runs:null,warmup:3,outDir:Ue,baselineDir:Xn,baseline:"main",cpuIntervalUs:1000,thresholds:u,workloads:[]};function pn(c){return{...Zn,...c,thresholds:{...u,...c.thresholds??{}}}}async function ln(c){let y=Bun.file(c);if(!await y.exists())return;return pn(await y.json())}async function dn(c){let y=c.startsWith("/")?c:`${process.cwd()}/${c}`;if(!await Bun.file(y).exists())return;let w=await import(y);return pn(w.default??{})}async function T(c){if(c!==void 0)return c.endsWith(".ts")?dn(c):ln(c);return await dn("ostia.config.ts")??ln("ostia.config.json")}function s(c,y){return`${c.baselineDir}/${y??c.baseline}.json`}async function W(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var et=10,nt=3000000000,tt=3;function qe(c){if(c.timeSource)I(c.timeSource);let y=c.warmup??tt,w=c.samples,H=c.minSamples??et,A=w??H,ie=w!==void 0?0:c.budgetMs!==void 0?c.budgetMs*1e6:nt,Y=c.timeSource!==void 0,D=c.ignoreExitCodes??[],se=new Set(D),le=[],re=0,ue=0,oe=!1,me;function pe(){if(oe)return!0;if(w!==void 0)return ue>=w;return ue>=A&&re>=ie}async function de(ge,he){if(c.prepare)await N(c.prepare,{phase:ge,index:he},{cwd:c.cwd,env:c.env,timeoutMs:c.timeoutMs,signal:c.signal});return z(c)}return{async warmup(){for(let ge=0;ge<y;ge++){if(c.signal?.aborted)return;await de("warmup",ge)}},async step(){if(pe()||c.signal?.aborted)return!1;let ge=await de("timing",ue);if(c.signal?.aborted)return!1;if(ge.timeSourceNoMatch)me??=ge.timeSourceMissOutput;if(le.push({i:ue,wallNs:ge.wallNs,exitCode:ge.exitCode??void 0,userNs:ge.userNs,systemNs:ge.systemNs,maxRssBytes:ge.maxRssBytes,...ge.reportedNs!==void 0&&{reportedNs:ge.reportedNs},...ge.timedOut?{timedOut:!0}:{},...ge.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),re+=ge.wallNs,ue++,c.failOnNonzero&&ge.exitCode!==null&&ge.exitCode!==0&&!se.has(ge.exitCode))oe=!0;return!0},done:pe,result(){let ge=le.filter((ce)=>!ce.timedOut&&!ce.timeSourceNoMatch),he=ge.map((ce)=>Y?ce.reportedNs:ce.wallNs),xe=[],we=le.filter((ce)=>ce.timedOut).length;if(we>0)xe.push({code:"timeout",message:`${we} of ${le.length} trial(s) timed out after ${c.timeoutMs}ms.`,data:{timeoutMs:c.timeoutMs,trials:we}});let ae=le.filter((ce)=>ce.timeSourceNoMatch).length;if(ae>0&&c.timeSource){let{pattern:ce}=c.timeSource;xe.push({code:"time-source-no-match",message:`${ae} of ${le.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof ce==="string"?ce:ce.source,trials:ae,...me!==void 0&&{output:me}}})}if(he.length===0)return{trials:le,warnings:xe};let fe=h(he);return xe.push(...S(fe,ge.map((ce)=>ce.exitCode),Y?"reported":"subprocess",D)),{trials:le,timing:fe,warnings:xe}}}}async function Qe(c){await c.warmup();while(await c.step());}async function J(c){let y=qe(c);return await Qe(y),y.result()}async function C(c,y){let w=new Set;for(let H of c)for await(let A of new Bun.Glob(H).scan({cwd:y,absolute:!1}))w.add(A);return[...w].sort()}var fn=new URL("./runner.ts",import.meta.url).pathname;function j(){return Math.max(1,navigator.hardwareConcurrency||1)}async function L(c,y){return C(c,y)}function rt(c){if(c===void 0)return;return c==="auto"?j():c}async function G(c,y,w=process.cwd()){return{suites:c.suites.length>0?c.suites:y?.suites?await L(y.suites,w):[],budgetMs:c.budgetMs??y?.budgetMs,samples:c.samples??y?.samples,minSamples:c.minSamples??y?.minSamples,jobs:c.jobs??rt(y?.jobs),gc:c.gc??y?.gc??!1,cpu:c.cpu??y?.cpu??!1,alloc:c.alloc??y?.alloc??!1,filter:c.filter??y?.filter,isolate:c.isolate??y?.isolate??!1,preload:c.preload.length>0?c.preload:y?.preload??[],bunFlags:c.bunFlags,outDir:c.outDir??y?.outDir,noiseCheck:c.noiseCheck,timeoutMs:c.timeoutMs??y?.timeoutMs,cwd:w}}async function f(c){if(c.samples!==void 0&&(!Number.isFinite(c.samples)||c.samples<1))throw RangeError(`bench: samples must be >= 1, got ${c.samples}`);if(c.minSamples!==void 0&&(!Number.isFinite(c.minSamples)||c.minSamples<1))throw RangeError(`bench: minSamples must be >= 1, got ${c.minSamples}`);if(c.budgetMs!==void 0&&!Number.isFinite(c.budgetMs))throw RangeError(`bench: budgetMs must be finite, got ${c.budgetMs}`);let w=`${c.outDir??Ue}/bench-tmp`,H=c.cwd??process.cwd(),A=Math.max(1,Math.floor(c.jobs??1)),ie={budgetMs:c.budgetMs,samples:c.samples,minSamples:c.minSamples,gc:c.gc,cpu:c.cpu,alloc:c.alloc,noiseCheck:c.noiseCheck},Y=(ue)=>ue.startsWith("/")?ue:`${H}/${ue}`,D=c.suites.map(Y),se=(c.preload??[]).map(Y),le=c.bunFlags??[],re=async(ue,oe)=>{let me=new Set,pe=0,de,ge=async()=>{while(de===void 0&&!c.signal?.aborted&&pe<ue.length){let he=pe++;try{let xe=!1,we=c.timeoutMs!==void 0?AbortSignal.timeout(c.timeoutMs):void 0;we?.addEventListener("abort",()=>{xe=!0},{once:!0});let ae=O(we,c.signal),fe=Bun.spawn(ue[he],{cwd:H,stdout:"inherit",stderr:"inherit",stdin:"ignore",...ae&&{signal:ae,killSignal:"SIGKILL"}});me.add(fe);let ce=await fe.exited;if(me.delete(fe),c.signal?.aborted)return;if(xe)throw Error(`Bench suite timed out after ${c.timeoutMs}ms: ${oe(he)}`);if(ce!==0)throw Error(`Bench suite failed: ${oe(he)} (runner exited ${ce})`)}catch(xe){de??=xe instanceof Error?xe:Error(String(xe));for(let we of me)we.kill()}}};if(await Promise.all(Array.from({length:Math.min(A,ue.length)},ge)),de)throw de};try{let ue=D.map((ce)=>`${w}/${e("bench-plan",ce)}.json`),oe=D.map((ce)=>`${w}/${e("bench-primary",ce)}.json`),me=D.map((ce,ye)=>["bun",...le,fn,ce,oe[ye],JSON.stringify({...ie,filter:c.filter,isolate:c.isolate,preload:se,planPath:ue[ye]})]);await re(me,(ce)=>c.suites[ce]);let pe=await Promise.all(ue.map(async(ce)=>{if(!await Bun.file(ce).exists())return[];let{tasks:ye}=await Bun.file(ce).json();return ye})),de=await Promise.all(oe.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),ge=[];for(let ce=0;ce<pe.length;ce++)for(let ye of pe[ce])if(ye.isolate)ge.push({suiteIndex:ce,taskIds:[ye.id]});let he=ge.map((ce,ye)=>`${w}/${e("bench-item",D[ce.suiteIndex],ye)}.json`),xe=ge.map((ce,ye)=>["bun",...le,fn,D[ce.suiteIndex],he[ye],JSON.stringify({...ie,taskIds:ce.taskIds,preload:se,markIsolated:!0})]);await re(xe,(ce)=>c.suites[ge[ce].suiteIndex]);let we=await Promise.all(he.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),ae=[],fe=[];for(let ce=0;ce<pe.length;ce++){let ye=de[ce];if(!ye)continue;let ke=new Map;for(let Me of ye.measurements){let $e=ke.get(Me.workloadId)??[];$e.push(Me),ke.set(Me.workloadId,$e)}let Pe=0,be=new Map;ge.forEach((Me,$e)=>{let Ce=we[$e];if(Me.suiteIndex===ce&&Ce)be.set(Me.taskIds[0],Ce)});for(let Me of pe[ce])if(Me.isolate){let $e=be.get(Me.id);if(!$e)continue;let Ce=$e.workloads[0];ae.push(Ce);for(let Ae of $e.measurements)if(Ae.workloadId===Ce.id)fe.push(Ae)}else{let $e=ye.workloads[Pe];ae.push($e),Pe++;for(let Ce of ke.get($e.id)??[])fe.push(Ce)}}if(c.signal?.aborted&&fe.length>0){let ce=fe[fe.length-1];ce.warnings=[...ce.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return t(ae,fe,de.find((ce)=>ce!==void 0)?.environment)}finally{await Bun.spawn(["rm","-rf",w]).exited}}function Z(c,y,w=8){if(w<=1)throw RangeError(`range: multiplier must be > 1, got ${w}`);if(c<=0)throw RangeError(`range: start must be > 0, got ${c}`);let H=[];for(let A=c;A<=y;A*=w)H.push(A);if(!H.includes(y))H.push(y);return H}function Se(c,y){if(y){let w=c.measurements.find((H)=>H.id===y);return w?.cpu?[w]:[]}return c.measurements.filter((w)=>w.phase==="cpu"&&w.cpu)}function Ne(c){let y=c.nodes,w=y.length,H=it(c),A=new Int32Array(w).fill(-1);for(let se=0;se<w;se++)for(let le of y[se].children){let re=H(le);if(re!==-1)A[re]=se}let ie=[];for(let se=0;se<w;se++)if(A[se]===-1)ie.push(se);let Y=[],D=[];for(let se=ie.length-1;se>=0;se--)D.push(ie[se]);while(D.length>0){let se=D.pop();Y.push(se);for(let le of y[se].children){let re=H(le);if(re!==-1&&A[re]===se)D.push(re)}}return{count:w,indexOf:H,parentIx:A,roots:ie,order:Y}}function it(c){let y=c.nodes,w=y.length,H=1/0,A=-1/0,ie=!0;for(let D=0;D<w;D++){let se=y[D].id;if(!Number.isInteger(se)){ie=!1;break}if(se<H)H=se;if(se>A)A=se}if(ie&&w>0&&A-H<w*4+64){let D=A-H+1,se=new Int32Array(D).fill(-1);for(let le=0;le<w;le++)se[y[le].id-H]=le;return(le)=>{let re=le-H;return re>=0&&re<D?se[re]:-1}}let Y=new Map;for(let D=0;D<w;D++)Y.set(y[D].id,D);return(D)=>Y.get(D)??-1}function gn(c,y){let{count:w,indexOf:H,parentIx:A,order:ie}=y,Y=new Float64Array(w),D=new Float64Array(w),se=c.samples?.nodeIds??[],le=c.samples?.timeDeltasUs??[];for(let ue=0;ue<se.length;ue++){let oe=H(se[ue]);if(oe===-1)continue;Y[oe]+=le[ue]??0,D[oe]+=1}let re=new Float64Array(w);for(let ue=ie.length-1;ue>=0;ue--){let oe=ie[ue];re[oe]+=Y[oe];let me=A[oe];if(me>=0)re[me]+=re[oe]}return{selfUs:Y,totalUs:re,samples:D}}var hn={name:"collapsed",async render(c,y={}){return{files:Se(c,y.measurementId).map((A)=>{let ie=A.cpu,{nodes:Y,frames:D}=ie,se=Ne(ie),le=Array(se.count);for(let pe of se.order){let de=D[Y[pe].frameIx].name||"(anonymous)",ge=se.parentIx[pe];le[pe]=ge===-1?de:`${le[ge]};${de}`}let re=new Float64Array(se.count),ue=[],oe=ie.samples?.nodeIds??[];for(let pe=0;pe<oe.length;pe++){let de=se.indexOf(oe[pe]);if(de===-1)continue;if(re[de]++===0)ue.push(de)}let me=Array(ue.length);for(let pe=0;pe<ue.length;pe++){let de=ue[pe];me[pe]=`${le[de]} ${re[de]}`}return{path:`${A.id}.collapsed.txt`,content:me.join(`
|
|
3
|
-
`)+(me.length>0?`
|
|
4
|
-
`:"")}})}}};var bn={name:"cpuprofile",async render(c,y={}){let w=Se(c,y.measurementId),H=[],A=[];for(let ie of w){if(ie.cpu?.origin!=="cpu-prof"&&ie.cpu?.origin!=="inspector"){A.push(`${ie.id} (origin ${ie.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let Y=ie.artifacts.find((se)=>se.kind==="cpuprofile");if(!Y){A.push(`${ie.id} (no cpuprofile artifact recorded on this run)`);continue}let D=Bun.file(Y.path);if(!await D.exists()){A.push(`${ie.id} (artifact missing on disk: ${Y.path})`);continue}H.push({path:`${ie.id}.cpuprofile`,content:await D.text()})}if(H.length===0&&A.length>0)return{text:`No .cpuprofile artifacts available:
|
|
5
|
-
${A.map((ie)=>` - ${ie}`).join(`
|
|
6
|
-
`)}
|
|
7
|
-
`};return{files:H}}};var wn={name:"json",async render(c){return{text:V(c)}}};var yn={name:"jsonl",async render(c){let{measurements:y,...w}=c;return{text:`${[R({kind:"document",...w}),...y.map((A)=>R({kind:"measurement",...A}))].join(`
|
|
8
|
-
`)}
|
|
9
|
-
`}}};var Fe=0.5,st={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function Be(c){let y=Math.abs(c);if(y>=1e9)return"s";if(y>=1e6)return"ms";if(y>=1000)return"\xB5s";return"ns"}function ot(c){let y=Math.floor(Math.log10(Math.max(Math.abs(c),1)))+1;return Math.max(1,3-y)}function ve(c,y=Be(c)){let w=c/st[y];return`${w.toFixed(ot(w))} ${y}`}function He(c){return`${c.cpuModel} \xB7 ${c.cores} cores \xB7 load ${c.loadAvg1.toFixed(1)} \xB7 noise floor ${c.noise.floorPct.toFixed(1)}%`}function g(c){return`${c.sha} (${c.branch}${c.dirty?", dirty":""})`}function n(c){return c?.label??c?.command?.join(" ")??c?.entry?.task??c?.id??"unknown"}function ze(c,y){if(c===1)return y?"1.00\xD7 (baseline)":"1.00\xD7";if(c>1)return`${c.toFixed(2)}\xD7 slower`;return`${(1/c).toFixed(2)}\xD7 faster`}function xn(c){return c.replace(/\|/g,"\\|").replace(/</g,"<").replace(/>/g,">").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function Ge(c){if(!c?.entry)return;if(c.entry.group!==void 0)return c.entry.group;let y=c.entry.task,w=y.lastIndexOf("/");return w===-1?void 0:y.slice(0,w)}function We(c){let y=Math.min(...c.map((A)=>A.run.timing.median)),w=new Map;for(let A of c){let ie=Ge(A.workload);if(ie===void 0)continue;let Y=w.get(ie);if(Y)Y.push(A);else w.set(ie,[A])}let H=new Map;for(let A of c){let ie=Ge(A.workload);if(ie===void 0){H.set(A,y);continue}let Y=w.get(ie)??[A],D=Y.find((se)=>se.workload?.baseline);H.set(A,D?D.run.timing.median:Math.min(...Y.map((se)=>se.run.timing.median)))}return H}function Pn(c){return(c/1e6).toFixed(3)}function Mn(c){if(!c?.params)return"";return` (${Object.entries(c.params).map(([w,H])=>`${w}=${H}`).join(", ")})`}function Te(c){return xn(String(c))}function at(c){let y;for(let w of c){let H=w?.params?Object.keys(w.params):void 0;if(H?.length!==2)return;if(y===void 0)y=H;else if(H.length!==y.length||H.some((A,ie)=>A!==y[ie]))return}return y}var kn=10,Rn=10,$n={name:"markdown",async render(c){let y=new Map(c.workloads.map((D)=>[D.id,D])),w=[];w.push("# Profile Report","");let H=c.git?` \xB7 ${g(c.git)}`:"";if(w.push(`Bun ${c.bunVersion} \xB7 ostia ${c.toolVersion} \xB7 ${c.platform.os}/${c.platform.arch} \xB7 ${c.createdAt}${H}`,""),c.environment)w.push(He(c.environment),"");let A=(c.comparisons??[]).flatMap((D)=>D.warnings??[]).find((D)=>D.code==="environment-mismatch");if(A)w.push(`> \u26A0 ${A.message}`,"");let ie=c.measurements.filter((D)=>D.phase==="timing"&&D.timing!==void 0),Y=c.workloads.filter((D)=>D.skipped&&!ie.some((se)=>se.workloadId===D.id));if(ie.length>0||Y.length>0){w.push("## Timing","");let D=new Map,se=[];for(let ue of ie){let oe=y.get(ue.workloadId)?.entry?.group;if(oe===void 0){se.push(ue);continue}let me=D.get(oe);if(me)me.push(ue);else D.set(oe,[ue])}let le=new Map;for(let[ue,oe]of D){let me=at(oe.map((pe)=>y.get(pe.workloadId)));if(me)le.set(ue,{keys:me,runs:oe});else se.push(...oe)}if(se.length>0||Y.length>0){let ue=ie.map((he)=>({run:he,workload:y.get(he.workloadId)})),oe=ue.length>1,me=oe?We(ue):void 0,pe=new Map(ue.map((he)=>[he.run.id,me?.get(he)??he.run.timing.median])),de=oe?" Relative |":"",ge=oe?"---|":"";w.push(`| Task | Median | Spread (p75\u2026p99) | Mean \xB1 SD | Range | MAD |${de}`,`|---|---|---|---|---|---|${ge}`);for(let he of se){let xe=y.get(he.workloadId),we=Te(n(xe)+Mn(xe)),ae=he.timing,fe=Be(ae.median),ce=ae.p75??ae.median,ye=ae.p99??ae.max,ke=ae.mad!==void 0?ve(ae.mad,fe):"-",Pe=oe?` ${ze(ae.median/(pe.get(he.id)??ae.median),!!xe?.baseline)} |`:"";w.push(`| ${we} | ${ve(ae.median,fe)} | ${ve(ce,fe)}\u2026${ve(ye,fe)} | ${ve(ae.mean,fe)} \xB1 ${ve(ae.stddev,fe)} | ${ve(ae.min,fe)}\u2026${ve(ae.max,fe)} | ${ke} |${Pe}`)}for(let he of Y){let xe=Te(n(he)+Mn(he)),we=oe?" - |":"";w.push(`| ${xe} | - skipped | - | - | - | - |${we}`)}w.push("")}for(let[ue,{keys:oe,runs:me}]of le){let[pe,de]=oe,ge=[],he=[],xe=new Map;for(let we of me){let ae=y.get(we.workloadId).params,fe=ae[pe],ce=ae[de];if(!ge.includes(fe))ge.push(fe);if(!he.includes(ce))he.push(ce);xe.set(`${fe}\x00${ce}`,we)}w.push(`### ${Te(ue)} (${Te(pe)} \xD7 ${Te(de)})`,""),w.push(`| ${Te(pe)} \\ ${Te(de)} | ${he.map(Te).join(" | ")} |`,`|---|${he.map(()=>"---").join("|")}|`);for(let we of ge){let ae=he.map((fe)=>{let ce=xe.get(`${we}\x00${fe}`);return ce?ve(ce.timing.median):"-"});w.push(`| ${Te(we)} | ${ae.join(" | ")} |`)}w.push("")}let re=ie.filter((ue)=>ue.warnings.length>0);if(re.length>0){w.push("### Warnings","");for(let ue of re){let oe=n(y.get(ue.workloadId));for(let me of ue.warnings)w.push(`- **${oe}**: ${me.message} (\`${me.code}\`)`)}w.push("")}}for(let D of c.measurements){if(D.phase!=="cpu"&&D.phase!=="heap")continue;let se=n(y.get(D.workloadId));if(D.phase==="cpu"){if(w.push(`## CPU capture - ${se}`,""),w.push(`instrumented, diagnostic wall ${Pn(D.diagnosticWallNs??0)}ms`,""),D.cpu){w.push(`origin: \`${D.cpu.origin}\`, interval: ${D.cpu.samplingIntervalUs}\xB5s`,""),w.push("| Self % | Self (ms) | Total (ms) | Frame |","|---|---|---|---|");let le=D.cpu.totals.reduce((re,ue)=>re+ue.selfUs,0)||1;for(let re of D.cpu.totals.slice(0,kn)){let ue=D.cpu.frames[re.frameIx],oe=(re.selfUs/le*100).toFixed(1);w.push(`| ${oe}% | ${(re.selfUs/1000).toFixed(2)} | ${(re.totalUs/1000).toFixed(2)} | ${Te(ue?.name||"(anonymous)")} |`)}if(w.push(""),D.jit){let re=D.jit.tiers;w.push(`JIT tiers: LLInt ${re.llint} \xB7 Baseline ${re.baseline} \xB7 DFG ${re.dfg} \xB7 FTL ${re.ftl}`,"")}}}else if(w.push(`## Heap snapshot - ${se}`,""),w.push(`instrumented, diagnostic wall ${Pn(D.diagnosticWallNs??0)}ms`,""),D.heap){w.push(`${D.heap.objectCount??"?"} objects, ${((D.heap.heapSizeBytes??0)/1e6).toFixed(2)}MB`,""),w.push("| Count | Type |","|---|---|");for(let le of D.heap.typeCounts.slice(0,Rn))w.push(`| ${le.count} | ${Te(le.type)} |`);w.push("")}for(let le of D.artifacts)w.push(`- artifact: \`${le.path}\``);for(let le of D.warnings)w.push(`- ! ${le.message} (\`${le.code}\`)`);if(D.artifacts.length>0||D.warnings.length>0)w.push("")}if(c.comparisons&&c.comparisons.length>0){w.push("## Comparisons","");for(let D of c.comparisons){let se=c.measurements.find((re)=>re.id===D.candidateMeasurementId),le=n(se?y.get(se.workloadId):y.get(D.candidateMeasurementId));if(w.push(`### ${D.verdict==="pass"?"\u2713":"\u2717"} ${le}`,""),D.timing){let re=D.timing.medianDeltaPct>0?"+":"",ue=D.timing.verdict==="unchanged"&&D.timing.pValue!==void 0&&D.timing.pValue>=D.thresholds.alpha?"~":"",oe=[];if(se?.timing)oe.push(`n=${se.timing.samples.length}`);if(D.timing.ci95)oe.push(`95% CI [${D.timing.ci95[0]>0?"+":""}${D.timing.ci95[0].toFixed(1)}%, ${D.timing.ci95[1]>0?"+":""}${D.timing.ci95[1].toFixed(1)}%]`);if(D.timing.pValue!==void 0)oe.push(`p=${D.timing.pValue.toFixed(4)}`);oe.push(`threshold ${D.thresholds.effectiveTimingPct.toFixed(1)}%`),w.push(`- timing: ${ue}${re}${D.timing.medianDeltaPct.toFixed(1)}% median, ${oe.join(", ")} (**${D.timing.verdict}**)`)}for(let re of D.frames?.slice(0,kn)??[]){if(Math.abs(re.deltaPct)<Fe)continue;let ue=re.deltaPct>0?"+":"";w.push(`- frame \`${Te(re.name)}\`: ${ue}${re.deltaPct.toFixed(1)}% self-time (${(re.baseSelfUs/1000).toFixed(2)}ms \u2192 ${(re.candSelfUs/1000).toFixed(2)}ms)`)}for(let re of D.heapTypes?.slice(0,Rn)??[]){if(Math.abs(re.deltaPct)<Fe)continue;let ue=re.deltaPct>0?"+":"";w.push(`- heap \`${Te(re.type)}\`: ${ue}${re.deltaPct.toFixed(1)}% count (${re.baseCount} \u2192 ${re.candCount})`)}for(let re of D.warnings??[]){if(re.code==="environment-mismatch")continue;w.push(`- ! ${re.message} (\`${re.code}\`)`)}w.push("")}}return{text:w.join(`
|
|
10
|
-
`)}}};var mt=15;function Xe(c){return`n${c}`}function ct(c,y,w){return`${(c||"(anonymous)").replace(/"/g,"'")} (self ${(y/1000).toFixed(2)}ms, total ${(w/1000).toFixed(2)}ms)`}function ut(c,y,w,H){let A=[];if(H<=0)return A;for(let ie=0;ie<y;ie++){if(ie===w)continue;let Y=c[ie];if(A.length===H&&Y<=c[A[H-1]])continue;let D=A.length;while(D>0&&c[A[D-1]]<Y)D--;if(A.splice(D,0,ie),A.length>H)A.pop()}return A}var vn={name:"mermaid",async render(c,y={}){let w=y.topN??mt;return{files:Se(c,y.measurementId).map((ie)=>{let Y=ie.cpu,{nodes:D,frames:se}=Y,le=Ne(Y),{selfUs:re,totalUs:ue}=gn(Y,le),{parentIx:oe}=le,me=le.roots[0]??-1,pe=ut(re,le.count,me,w),de=new Set(me!==-1?[me]:[]),ge=[];for(let xe of pe){ge.length=0;for(let we=xe;we!==-1;we=oe[we])ge.push(we);for(let we=ge.length-1;we>=0;we--)de.add(ge[we])}let he=["graph TD"];for(let xe of de){let we=D[xe].id;he.push(` ${Xe(we)}["${ct(se[D[xe].frameIx].name,re[xe],ue[xe])}"]`)}for(let xe of de){let we=oe[xe];if(we!==-1&&de.has(we))he.push(` ${Xe(D[we].id)} --> ${Xe(D[xe].id)}`)}return{path:`${ie.id}.mermaid.md`,content:`${he.join(`
|
|
11
|
-
`)}
|
|
12
|
-
`}})}}};var l=1;function Re(c){return Number.isFinite(c)?Number(c.toPrecision(6)):c}function Ze(c,y){return c?.entry?.task??c?.label??c?.command?.join(" ")??y}function Cn(c,y){if(y?.entry?.group!==void 0)c.group=y.entry.group;if(y?.description!==void 0)c.description=y.description;if(y?.groupDescription!==void 0)c.groupDescription=y.groupDescription;if(y?.params!==void 0)c.params=y.params}function Tn(c){if(!c?.timing)return;let y={medianPct:Re(c.timing.medianDeltaPct),meanPct:Re(c.timing.meanDeltaPct),verdict:c.timing.verdict,pass:c.verdict==="pass",effectiveTimingPct:Re(c.thresholds.effectiveTimingPct),matched:!0};if(c.timing.ci95)y.ci95=[Re(c.timing.ci95[0]),Re(c.timing.ci95[1])];if(c.timing.pValue!==void 0)y.pValue=Re(c.timing.pValue);return y}function lt(c,y,w,H){let A={event:"run",protocolVersion:l,schemaVersion:c.schemaVersion,workloadId:y.id,task:Ze(y,y.id),skipped:!0,batch:1,warnings:(w?.warnings??[]).map((Y)=>Y.data?{code:Y.code,data:Y.data}:{code:Y.code})};if(Cn(A,y),H!==void 0)A.noiseFloorPct=Re(H);let ie=Tn(w);if(ie)A.delta=ie;return A}function dt(c){let y=new Map(c.workloads.map((re)=>[re.id,re])),w=c.environment?.noise.floorPct,H=c.measurements.filter((re)=>re.phase==="timing"&&re.timing!==void 0).map((re)=>({run:re,workload:y.get(re.workloadId)})),A=H.length>1?We(H):void 0,ie=new Map((c.comparisons??[]).map((re)=>[re.candidateMeasurementId,re])),Y=new Set(H.map((re)=>re.run.workloadId)),D=new Map;for(let re of c.measurements){if(re.phase!=="cpu"||re.warnings.length===0)continue;let ue=D.get(re.workloadId)??[];D.set(re.workloadId,[...ue,...re.warnings])}let se=c.workloads.filter((re)=>re.skipped&&!Y.has(re.id)).map((re)=>lt(c,re,ie.get(re.id),w));return[...H.map((re)=>{let{run:ue,workload:oe}=re,me=ue.timing,pe=ie.get(ue.id),de={event:"run",protocolVersion:l,schemaVersion:c.schemaVersion,workloadId:ue.workloadId,task:Ze(oe,ue.workloadId),unit:"ns",samples:me.samples.length,batch:me.batch??1,mean:Re(me.mean),median:Re(me.median),stddev:Re(me.stddev),stddevPct:Re(me.mean===0?0:me.stddev/me.mean*100),min:Re(me.min),max:Re(me.max),warnings:[...ue.warnings,...D.get(ue.workloadId)??[],...pe?.warnings??[]].map((he)=>he.data?{code:he.code,data:he.data}:{code:he.code})};if(me.p75!==void 0)de.p75=Re(me.p75);if(me.p99!==void 0)de.p99=Re(me.p99);if(me.mad!==void 0)de.mad=Re(me.mad);if(Cn(de,oe),A)de.relative=Re(me.median/(A.get(re)??me.median));if(oe?.baseline)de.baseline=!0;if(w!==void 0)de.noiseFloorPct=Re(w);let ge=Tn(pe);if(ge)de.delta=ge;return de}),...se]}function pt(c){if(!c.unmatched)return[];let y=(w,H)=>({event:"unmatched",protocolVersion:l,workloadId:w.id,task:Ze(w,w.id),side:H});return[...c.unmatched.baseOnly.map((w)=>y(w,"base")),...c.unmatched.candOnly.map((w)=>y(w,"cand"))]}function ft(c,y){let w=c.comparisonSummary,H=(y.unmatched?.baseOnly.length??0)+(y.unmatched?.candOnly.length??0),A={event:"summary",protocolVersion:l,command:y.command,matched:w?.matched??0,regressed:w?.regressed??0,improved:w?.improved??0,unchanged:w?.unchanged??0,unmatched:H,geomeanPct:w?.geomeanPct!==void 0?w.geomeanPct:null,effectiveTimingPct:Re(w?.effectiveTimingPct??0),verdict:y.exitCode===0?"pass":"fail",exitCode:y.exitCode};if(y.command==="ci"){if(A.cached=y.cached??0,A.executed=y.executed??0,A.failed=y.failed??0,A.missingBaseline=y.missingBaseline??0,y.baseline)A.baseline=y.baseline}if(c.environment)A.noiseFloorPct=Re(c.environment.noise.floorPct);if(y.baseGit||y.candGit)A.git={...y.baseGit&&{base:y.baseGit},...y.candGit&&{cand:y.candGit}};if(y.exportedTo)A.exportedTo=y.exportedTo;return A}var In={name:"minimal",async render(c,y={}){let w=[...dt(c)];if(y.protocol)w.push(...pt(y.protocol)),w.push(ft(c,y.protocol));let H=w.map((A)=>JSON.stringify(A));return{text:H.length>0?`${H.join(`
|
|
13
|
-
`)}
|
|
14
|
-
`:""}}};var gt="https://www.speedscope.app/file-format-schema.json";function Sn(c){return c?.label??c?.command?.join(" ")??c?.entry?.task??"profile"}var Dn={name:"speedscope",async render(c,y={}){let w=Se(c,y.measurementId),H=new Map(c.workloads.map((ie)=>[ie.id,ie]));return{files:w.map((ie)=>{let Y=ie.cpu,{nodes:D}=Y,se=Ne(Y),le=Y.samples?.nodeIds??[],re=Y.samples?.timeDeltasUs??[],ue=Array(se.count);for(let de of se.order){let ge=se.parentIx[de],he=D[de].frameIx;ue[de]=ge===-1?[he]:[...ue[ge],he]}let oe=Array(le.length);for(let de=0;de<le.length;de++){let ge=se.indexOf(le[de]);oe[de]=ge===-1?[]:ue[ge]}let me=0;for(let de=0;de<re.length;de++)me+=re[de];let pe={$schema:gt,exporter:"ostia",name:Sn(H.get(ie.workloadId)),activeProfileIndex:0,shared:{frames:Y.frames.map((de)=>({name:de.name||"(anonymous)",file:de.url,line:de.line!==void 0?de.line+1:void 0}))},profiles:[{type:"sampled",name:Sn(H.get(ie.workloadId)),unit:"microseconds",startValue:0,endValue:me,samples:oe,weights:re}]};return{path:`${ie.id}.speedscope.json`,content:`${JSON.stringify(pe,null,2)}
|
|
15
|
-
`}})}}};function ht(c){return(c/1e6).toFixed(3)}function bt(c){if(c<1024)return`${c.toFixed(0)}B`;if(c<1048576)return`${(c/1024).toFixed(2)}KB`;return`${(c/1048576).toFixed(2)}MB`}var Nn={name:"table",async render(c){let y=c.measurements.filter((be)=>be.phase==="timing"&&be.timing!==void 0),w=new Map(c.workloads.map((be)=>[be.id,be])),H=c.environment?[He(c.environment),""]:[],A=c.workloads.filter((be)=>be.skipped&&!y.some((Me)=>Me.workloadId===be.id));if(y.length===0&&A.length===0){let be=On(c,w);return{text:be.length>0?`${[...H,...be].join(`
|
|
16
|
-
`)}
|
|
17
|
-
`:`(no timing runs)
|
|
18
|
-
`}}let ie=new Map(y.map((be)=>[be.workloadId,be])),Y=[],D=[];for(let be of c.workloads){let Me=ie.get(be.id),$e=n(be);if(Me){let Ce={kind:"measured",run:Me,workload:be,label:$e};Y.push(Ce),D.push(Ce)}else if(be.skipped)Y.push({kind:"skipped",workload:be,label:$e})}let se=new Map(c.measurements.filter((be)=>be.phase==="memstats"&&be.memory?.bytesPerOp!==void 0).map((be)=>[be.workloadId,be.memory.bytesPerOp])),le=se.size>0,re=D.length>1,ue=We(D),oe=new Map,me=new Map,pe;for(let be of Y){let Me=Ge(be.workload);if(Me!==pe){if(Me!==void 0)me.set(be,Me);pe=Me}oe.set(be,Me!==void 0?" ":"")}let de=Math.max(4,...Y.map((be)=>oe.get(be).length+be.label.length)),ge=10,he=18,xe=18,we=10,ae=[...H],fe=le?` ${"Alloc/op".padEnd(we)}`:"",ce=`${"Task".padEnd(de)} ${"Median".padEnd(ge)} ${"Spread".padEnd(he)} ${"Range".padEnd(xe)}${fe}${re?" Relative":""}`;ae.push(ce),ae.push("-".repeat(ce.length));let ye=[];for(let be of Y){let Me=me.get(be);if(Me!==void 0)ae.push(`${Me}:`);let $e=oe.get(be);if(be.kind==="skipped"){ae.push(`${($e+be.label).padEnd(de)} - skipped`);continue}let{run:Ce,label:Ae,workload:Ke}=be,Ie=Ce.timing,Ee=Be(Ie.median),Bn=Ie.p75??Ie.median,An=Ie.p99??Ie.max,Ln=ve(Ie.median,Ee),_n=`${ve(Bn,Ee)}\u2026${ve(An,Ee)}`,jn=`${ve(Ie.min,Ee)}\u2026${ve(Ie.max,Ee)}`,Je=`${($e+Ae).padEnd(de)} ${Ln.padEnd(ge)} ${_n.padEnd(he)} ${jn.padEnd(xe)}`;if(le){let De=Ke?se.get(Ke.id):void 0,Vn=De!==void 0?bt(De):"";Je+=` ${Vn.padEnd(we)}`}if(re){let De=Ie.median/(ue.get(be)??Ie.median);Je+=` ${ze(De,!!Ke?.baseline)}`}if(ae.push(Je),Ce.warnings.length>0)ae.push(`${" ".repeat($e.length)} ! ${Ce.warnings.map((De)=>De.code).join(", ")}`),ye.push(be)}if(ye.length>0){ae.push(""),ae.push("Warnings:");for(let be of ye)for(let Me of be.run.warnings)ae.push(` ${be.label}: ${Me.message}`)}let ke=wt(c,w);if(ke.length>0)ae.push(""),ae.push(...ke);let Pe=On(c,w);if(Pe.length>0)ae.push(""),ae.push(...Pe);return{text:`${ae.map((be)=>be.trimEnd()).join(`
|
|
19
|
-
`)}
|
|
20
|
-
`}}};function On(c,y){if(!c.comparisons||c.comparisons.length===0)return[];let w=[],H=new Map(c.measurements.map((Y)=>[Y.id,Y])),A=c.comparisons.flatMap((Y)=>Y.warnings??[]).find((Y)=>Y.code==="environment-mismatch");if(A)w.push(`\u26A0 ${A.message}`,"");let ie=[];for(let Y of c.comparisons){let D=H.get(Y.candidateMeasurementId),se=y.get(D?.workloadId??Y.candidateMeasurementId),le=se?n(se):Y.candidateMeasurementId,re=Y.verdict==="pass"?"\u2713":"\u2717";if(w.push(`${re} ${le}`),Y.timing){let oe=(me)=>`${me>=0?"+":""}${me.toFixed(1)}%`;if(Y.timing.ci95&&Y.timing.pValue!==void 0){let me=Y.timing.pValue<0.001?"p<0.001":`p=${Y.timing.pValue.toFixed(3)}`;w.push(` timing: ${oe(Y.timing.medianDeltaPct)} median, 95% CI [${oe(Y.timing.ci95[0])}, ${oe(Y.timing.ci95[1])}], ${me} (${Y.timing.verdict})`)}else w.push(` timing: ${oe(Y.timing.medianDeltaPct)} median (${Y.timing.verdict})`)}if(Y.frames)for(let oe of Y.frames.slice(0,Fn)){if(Math.abs(oe.deltaPct)<Fe)continue;let me=oe.deltaPct>0?"+":"";w.push(` frame ${oe.name}: ${me}${oe.deltaPct.toFixed(1)}% self-time (${(oe.baseSelfUs/1000).toFixed(2)}ms -> ${(oe.candSelfUs/1000).toFixed(2)}ms)`)}if(Y.heapTypes)for(let oe of Y.heapTypes.slice(0,Wn)){if(Math.abs(oe.deltaPct)<Fe)continue;let me=oe.deltaPct>0?"+":"";w.push(` heap ${oe.type}: ${me}${oe.deltaPct.toFixed(1)}% count (${oe.baseCount} -> ${oe.candCount})`)}let ue=(Y.warnings??[]).filter((oe)=>oe.code!=="environment-mismatch");if(ue.length>0){w.push(` ! ${ue.map((oe)=>oe.code).join(", ")}`);for(let oe of ue)ie.push({label:le,message:oe.message})}}if(ie.length>0){w.push("","Comparison warnings:");for(let Y of ie)w.push(` ${Y.label}: ${Y.message}`)}return w}var Fn=5,Wn=5;function wt(c,y){let w=[];for(let H of c.measurements){if(H.phase!=="cpu"&&H.phase!=="heap")continue;let A=y.get(H.workloadId),ie=A?n(A):H.workloadId;if(H.phase==="cpu")if(H.cpu){w.push(`CPU capture - ${ie} (instrumented, ${H.cpu.samplingIntervalUs}\xB5s interval, diagnostic wall ${ht(H.diagnosticWallNs??0)}ms)`);let Y=H.cpu.totals.reduce((D,se)=>D+se.selfUs,0)||1;for(let D of H.cpu.totals.slice(0,Fn)){let se=H.cpu.frames[D.frameIx],le=(D.selfUs/Y*100).toFixed(1);w.push(` ${le.padStart(5)}% ${(D.selfUs/1000).toFixed(2).padStart(8)}ms self ${se?.name??"?"}`)}}else w.push(`CPU capture - ${ie} (instrumented, no evidence captured)`);else if(H.heap){let Y=((H.heap.heapSizeBytes??0)/1e6).toFixed(2);w.push(`Heap snapshot - ${ie} (instrumented, ${H.heap.objectCount??"?"} objects, ${Y}MB)`);for(let D of H.heap.typeCounts.slice(0,Wn))w.push(` ${String(D.count).padStart(6)} ${D.type}`)}else w.push(`Heap snapshot - ${ie} (instrumented, no evidence captured)`);for(let Y of H.artifacts)w.push(` artifact: ${Y.path}`);for(let Y of H.warnings)w.push(` ! ${Y.message}`)}return w}var o={table:Nn,json:wn,markdown:$n,jsonl:yn,minimal:In,collapsed:hn,mermaid:vn,speedscope:Dn,cpuprofile:bn};async function Q(c={}){let y=x();if(y.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let w=y.filter((D)=>D.only),H=w.length>0?w:y;if(w.length>0)process.stderr.write(`bench: ${w.length} task(s) selected by .only
|
|
21
|
-
`);let A=v(H,c.filter);if(A.length===0)throw Error(`run(): filter ${JSON.stringify(c.filter)} matched zero of ${H.length} registered task(s).`);let ie=Bun.main,Y=await P(ie,A,c);if(!c.quiet){let D=c.format??"table",{text:se}=await o[D].render(Y,{});if(se)process.stdout.write(se)}return Y}function ee(c,y){let w=Object.keys(c),H=(A,ie)=>{if(A===w.length){X(ie,()=>y(ie));return}let Y=w[A];for(let D of c[Y])H(A+1,{...ie,[Y]:D})};H(0,{})}function ne(c){return c}var en=1000;async function _(c){if(c.samples!==void 0&&(!Number.isFinite(c.samples)||c.samples<1))throw RangeError(`time: samples must be >= 1, got ${c.samples}`);if(c.minSamples!==void 0&&(!Number.isFinite(c.minSamples)||c.minSamples<1))throw RangeError(`time: minSamples must be >= 1, got ${c.minSamples}`);if(c.warmup!==void 0&&(!Number.isFinite(c.warmup)||c.warmup<0))throw RangeError(`time: warmup must be >= 0, got ${c.warmup}`);if(c.budgetMs!==void 0&&!Number.isFinite(c.budgetMs))throw RangeError(`time: budgetMs must be finite, got ${c.budgetMs}`);let y=a({samples:c.samples??null,budgetMs:c.budgetMs??null,minSamples:c.minSamples??null,warmup:c.warmup??null,cpu:c.cpu??!1,heap:c.heap??!1,cpuIntervalUs:c.cpuIntervalUs??en}),H=`${c.outDir??Ue}/artifacts`,A=c.noiseCheck===!1?void 0:p(),ie=A?F(A):void 0,Y=[],D=[],se=c.commands.map((me)=>{let pe=typeof me==="string"||Array.isArray(me)?{command:me}:me,de=Array.isArray(pe.command)?pe.command:b(pe.command),ge=pe.prepare??c.prepare,he=pe.timeSource??c.timeSource,xe=pe.timeoutMs??c.timeoutMs,we=pe.ignoreExitCodes??c.ignoreExitCodes,ae=pe.failOnNonzero??c.failOnNonzero,fe=k(de,pe.label??(Array.isArray(pe.command)?void 0:pe.command),{prepare:ge,timeSource:he});return{argv:de,workload:fe,prepare:ge,timeSource:he,timeoutMs:xe,ignoreExitCodes:we,failOnNonzero:ae}}),le=(c.interleave??!0)&&se.length>1,re=(me)=>({argv:me.argv,cwd:c.cwd,env:c.env,samples:c.samples,budgetMs:c.budgetMs,minSamples:c.minSamples,warmup:c.warmup,prepare:me.prepare,timeSource:me.timeSource,timeoutMs:me.timeoutMs,ignoreExitCodes:me.ignoreExitCodes,failOnNonzero:me.failOnNonzero,signal:c.signal}),ue=se.map((me)=>qe(re(me))),oe=async(me)=>{let{argv:pe,workload:de,prepare:ge}=se[me];Y.push(de);let he=ue[me].result(),xe=m({workload:de,configFingerprint:y,trials:he.trials,timing:he.timing,warnings:ie&&D.length===0?[...he.warnings,ie]:he.warnings,interleaved:le?!0:void 0});if(D.push(xe),!c.signal?.aborted)D.push(...await yt({workload:de,argv:pe,timingMeasurementId:xe.id,cfgFp:y,opts:c,artifactDir:H,prepare:ge}))};if(le){for(let pe of ue)await pe.warmup();let me=!0;while(me){me=!1;for(let pe of ue)if(await pe.step())me=!0}for(let pe=0;pe<se.length;pe++)await oe(pe)}else for(let me=0;me<se.length;me++)await Qe(ue[me]),await oe(me);if(c.signal?.aborted&&D.length>0){let me=D[D.length-1];me.warnings=[...me.warnings,Un()]}return t(Y,D,A)}function Un(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function yt({workload:c,argv:y,timingMeasurementId:w,cfgFp:H,opts:A,artifactDir:ie,prepare:Y}){let D=[],se=async(le)=>{if(Y)await N(Y,{phase:le,index:0},{cwd:A.cwd,env:A.env})};if(A.cpu){await se("cpu");let le=`${w}-cpu.cpuprofile`,re=await nn({argv:y,cwd:A.cwd,env:A.env,artifactDir:ie,fileName:le,intervalUs:A.cpuIntervalUs??en});D.push(await En({workload:c,phase:"cpu",configFingerprint:H,diagnosticWallNs:re.diagnosticWallNs,exitCode:re.exitCode,cpu:re.cpu,artifactPath:re.artifactPath,artifactKind:"cpuprofile",warnings:re.warnings}))}if(A.heap){await se("heap");let le=`${w}-heap.heapsnapshot`,re=await rn({argv:y,cwd:A.cwd,env:A.env,artifactDir:ie,fileName:le});D.push(await En({workload:c,phase:"heap",configFingerprint:H,diagnosticWallNs:re.diagnosticWallNs,exitCode:re.exitCode,heap:re.heap,artifactPath:re.artifactPath,artifactKind:"heapsnapshot",warnings:re.warnings}))}return D}async function En(c){let y=`${c.workload.id}-${c.phase}-${c.configFingerprint}`,w=c.artifactPath?[await K(y,c.artifactKind,c.artifactPath)]:[];return d({workload:c.workload,phase:c.phase,configFingerprint:c.configFingerprint,diagnosticWallNs:c.diagnosticWallNs,exitCode:c.exitCode,cpu:c.cpu,heap:c.heap,warnings:c.warnings,artifacts:w})}async function te(c,y={}){let w=q(c),H=a({intervalUs:y.intervalUs??en,origin:y.origin??"inspector"}),A=(D)=>D.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];if(y.signal?.aborted){let D=Bun.nanoseconds(),se=await c(),le=d({workload:w,phase:"cpu",configFingerprint:H,diagnosticWallNs:Bun.nanoseconds()-D,warnings:[Un()],artifacts:[]});return{result:se,measurement:le,document:t([w],[le])}}let ie=y.origin==="jsc"?await E(c,y):{...await sn(c,y),jit:void 0},Y=d({workload:w,phase:"cpu",configFingerprint:H,diagnosticWallNs:ie.diagnosticWallNs,cpu:ie.cpu,jit:ie.jit,warnings:A(ie.cpu),artifacts:[]});return{result:ie.result,measurement:Y,document:t([w],[Y])}}
|
|
22
|
-
export{u,B,M,U,T,s,W,C,j,L,G,f,J,g,n,Z,l,o,Q,ee,ne,_,te};
|