@codspeed/tinybench-plugin 6.1.1 → 7.0.0-beta.0
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/dist/index.cjs +75 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.es5.js +76 -17
- package/dist/index.es5.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -36,19 +36,26 @@ var __publicField$1 = (obj, key, value) => {
|
|
|
36
36
|
return value;
|
|
37
37
|
};
|
|
38
38
|
class BaseBenchRunner {
|
|
39
|
-
constructor(bench, rootCallingFile) {
|
|
39
|
+
constructor(bench, rootCallingFile, isolationMode = { kind: "SharedProcess" }) {
|
|
40
|
+
this.isolationMode = isolationMode;
|
|
40
41
|
__publicField$1(this, "bench");
|
|
41
42
|
__publicField$1(this, "rootCallingFile");
|
|
42
43
|
this.bench = bench;
|
|
43
44
|
this.rootCallingFile = rootCallingFile;
|
|
44
45
|
}
|
|
46
|
+
get isChild() {
|
|
47
|
+
return this.isolationMode.kind === "Fork";
|
|
48
|
+
}
|
|
45
49
|
setupBenchRun() {
|
|
46
50
|
core.setupCore();
|
|
47
51
|
this.logStart();
|
|
48
52
|
}
|
|
49
53
|
logStart() {
|
|
54
|
+
if (this.isChild) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
50
57
|
console.log(
|
|
51
|
-
`[CodSpeed] running with @codspeed/tinybench v${"
|
|
58
|
+
`[CodSpeed] running with @codspeed/tinybench v${"7.0.0-beta.0"} (${this.getModeName()})`
|
|
52
59
|
);
|
|
53
60
|
}
|
|
54
61
|
getTaskUri(task) {
|
|
@@ -68,27 +75,48 @@ class BaseBenchRunner {
|
|
|
68
75
|
}
|
|
69
76
|
finalizeBenchRun() {
|
|
70
77
|
core.teardownCore();
|
|
71
|
-
|
|
78
|
+
if (!this.isChild) {
|
|
79
|
+
console.log(
|
|
80
|
+
`[CodSpeed] Done running ${this.bench.tasks.length} benches.`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
72
83
|
return this.bench.tasks;
|
|
73
84
|
}
|
|
74
85
|
setupBenchMethods() {
|
|
75
86
|
this.bench.run = async () => {
|
|
87
|
+
const tasks = this.selectTasks();
|
|
88
|
+
if (this.isChild && tasks.length === 0) {
|
|
89
|
+
return this.bench.tasks;
|
|
90
|
+
}
|
|
76
91
|
this.setupBenchRun();
|
|
77
|
-
for (const task of
|
|
92
|
+
for (const task of tasks) {
|
|
78
93
|
const uri = this.getTaskUri(task);
|
|
79
94
|
await this.runTaskAsync(task, uri);
|
|
80
95
|
}
|
|
81
96
|
return this.finalizeAsyncRun();
|
|
82
97
|
};
|
|
83
98
|
this.bench.runSync = () => {
|
|
99
|
+
const tasks = this.selectTasks();
|
|
100
|
+
if (this.isChild && tasks.length === 0) {
|
|
101
|
+
return this.bench.tasks;
|
|
102
|
+
}
|
|
84
103
|
this.setupBenchRun();
|
|
85
|
-
for (const task of
|
|
104
|
+
for (const task of tasks) {
|
|
86
105
|
const uri = this.getTaskUri(task);
|
|
87
106
|
this.runTaskSync(task, uri);
|
|
88
107
|
}
|
|
89
108
|
return this.finalizeSyncRun();
|
|
90
109
|
};
|
|
91
110
|
}
|
|
111
|
+
/** The tasks this process measures: all of them, or the isolated one. */
|
|
112
|
+
selectTasks() {
|
|
113
|
+
const { isolationMode } = this;
|
|
114
|
+
if (isolationMode.kind !== "Fork")
|
|
115
|
+
return this.bench.tasks;
|
|
116
|
+
return this.bench.tasks.filter(
|
|
117
|
+
(task) => this.getTaskUri(task) === isolationMode.uri
|
|
118
|
+
);
|
|
119
|
+
}
|
|
92
120
|
}
|
|
93
121
|
|
|
94
122
|
function setupCodspeedAnalysisBench(bench, rootCallingFile) {
|
|
@@ -168,8 +196,9 @@ var __publicField = (obj, key, value) => {
|
|
|
168
196
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
169
197
|
return value;
|
|
170
198
|
};
|
|
171
|
-
function setupCodspeedWalltimeBench(bench, rootCallingFile) {
|
|
172
|
-
const
|
|
199
|
+
function setupCodspeedWalltimeBench(bench, rootCallingFile, options) {
|
|
200
|
+
const isolationMode = core.walltimeIsolation(options.forks);
|
|
201
|
+
const runner = new WalltimeBenchRunner(bench, rootCallingFile, isolationMode);
|
|
173
202
|
runner.installInstrumentHooks();
|
|
174
203
|
runner.setupBenchMethods();
|
|
175
204
|
}
|
|
@@ -229,6 +258,11 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
229
258
|
core.InstrumentHooks.addMarker(process.pid, core.MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
230
259
|
}
|
|
231
260
|
async runTaskAsync(task, uri) {
|
|
261
|
+
const { isolationMode } = this;
|
|
262
|
+
if (isolationMode.kind === "Forks") {
|
|
263
|
+
const samples = await core.runForks(uri, isolationMode.forks);
|
|
264
|
+
return this.registerForkedBenchmark(task, samples);
|
|
265
|
+
}
|
|
232
266
|
if (getBenchOptions(this.bench).warmup) {
|
|
233
267
|
await task.warmup();
|
|
234
268
|
}
|
|
@@ -237,8 +271,12 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
237
271
|
await core.mongoMeasurement.stop(uri);
|
|
238
272
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
239
273
|
}
|
|
240
|
-
|
|
241
|
-
|
|
274
|
+
runTaskSync(task, uri) {
|
|
275
|
+
const { isolationMode } = this;
|
|
276
|
+
if (isolationMode.kind === "Forks") {
|
|
277
|
+
const samples = core.runForksSync(uri, isolationMode.forks);
|
|
278
|
+
return this.registerForkedBenchmark(task, samples);
|
|
279
|
+
}
|
|
242
280
|
if (getBenchOptions(this.bench).warmup) {
|
|
243
281
|
task.warmupSync();
|
|
244
282
|
}
|
|
@@ -252,15 +290,33 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
252
290
|
return this.finalizeWalltimeRun(false);
|
|
253
291
|
}
|
|
254
292
|
registerCodspeedBenchmarkFromTask(task) {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
293
|
+
if (this.isolationMode.kind === "Fork") {
|
|
294
|
+
core.writeForkSamples(
|
|
295
|
+
this.isolationMode.samplesFile,
|
|
296
|
+
task.result?.latency.samples ?? []
|
|
297
|
+
);
|
|
258
298
|
return;
|
|
259
299
|
}
|
|
300
|
+
if (!task.result) {
|
|
301
|
+
return this.warnNoResult(task);
|
|
302
|
+
}
|
|
303
|
+
this.registerCodspeedBenchmark(task, task.result);
|
|
304
|
+
}
|
|
305
|
+
registerForkedBenchmark(task, samples) {
|
|
306
|
+
if (samples.length === 0) {
|
|
307
|
+
return this.warnNoResult(task);
|
|
308
|
+
}
|
|
309
|
+
this.registerCodspeedBenchmark(task, core.samplesToResult(samples));
|
|
310
|
+
}
|
|
311
|
+
warnNoResult(task) {
|
|
312
|
+
console.warn(` \u26A0 No result data available for ${this.getTaskUri(task)}`);
|
|
313
|
+
}
|
|
314
|
+
registerCodspeedBenchmark(task, result) {
|
|
315
|
+
const uri = this.getTaskUri(task);
|
|
260
316
|
const opts = getBenchOptions(this.bench);
|
|
261
317
|
const warmupIterations = opts.warmup ? opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT : 0;
|
|
262
318
|
const stats = convertTinybenchResultToBenchmarkStats(
|
|
263
|
-
|
|
319
|
+
result,
|
|
264
320
|
warmupIterations
|
|
265
321
|
);
|
|
266
322
|
this.codspeedBenchmarks.push({
|
|
@@ -278,6 +334,9 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
278
334
|
this.logTaskCompletion(uri, "Collected walltime data for");
|
|
279
335
|
}
|
|
280
336
|
finalizeWalltimeRun(isAsync) {
|
|
337
|
+
if (this.isChild) {
|
|
338
|
+
return this.bench.tasks;
|
|
339
|
+
}
|
|
281
340
|
if (this.codspeedBenchmarks.length > 0) {
|
|
282
341
|
core.writeWalltimeResults(this.codspeedBenchmarks, isAsync);
|
|
283
342
|
}
|
|
@@ -290,7 +349,7 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
290
349
|
const TINYBENCH_WARMUP_DEFAULT = 16;
|
|
291
350
|
function convertTinybenchResultToBenchmarkStats(result, warmupIterations) {
|
|
292
351
|
const { min, max, mean, sd, samples } = result.latency;
|
|
293
|
-
const sortedTimesNs =
|
|
352
|
+
const sortedTimesNs = core.sortedSamplesNs(samples);
|
|
294
353
|
const meanNs = core.msToNs(mean);
|
|
295
354
|
const stdevNs = core.msToNs(sd);
|
|
296
355
|
const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } = core.calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });
|
|
@@ -313,7 +372,7 @@ function convertTinybenchResultToBenchmarkStats(result, warmupIterations) {
|
|
|
313
372
|
}
|
|
314
373
|
|
|
315
374
|
core.tryIntrospect();
|
|
316
|
-
function withCodSpeed(bench) {
|
|
375
|
+
function withCodSpeed(bench, options = {}) {
|
|
317
376
|
const codspeedRunnerMode = core.getCodspeedRunnerMode();
|
|
318
377
|
if (codspeedRunnerMode === "disabled") {
|
|
319
378
|
return bench;
|
|
@@ -338,7 +397,7 @@ function withCodSpeed(bench) {
|
|
|
338
397
|
if (instrumentMode === "analysis") {
|
|
339
398
|
setupCodspeedAnalysisBench(bench, rootCallingFile);
|
|
340
399
|
} else if (instrumentMode === "walltime") {
|
|
341
|
-
setupCodspeedWalltimeBench(bench, rootCallingFile);
|
|
400
|
+
setupCodspeedWalltimeBench(bench, rootCallingFile, options);
|
|
342
401
|
}
|
|
343
402
|
return bench;
|
|
344
403
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/taskData.ts","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/benchOptions.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench, Fn, FnOptions } from \"tinybench\";\n\n// tinybench stores the benchmark function and its options as private fields on\n// `Task`. They were reachable through casts on older majors but became true\n// `#private` fields in v6, so we capture them ourselves when `bench.add` runs\n// and key them by task name, mirroring the URI map.\nexport interface CapturedTaskData {\n fn: Fn;\n fnOpts?: FnOptions;\n}\n\nconst taskDataMap = new WeakMap<Bench, Map<string, CapturedTaskData>>();\n\nexport function getOrCreateTaskDataMap(\n bench: Bench,\n): Map<string, CapturedTaskData> {\n let map = taskDataMap.get(bench);\n if (!map) {\n map = new Map<string, CapturedTaskData>();\n taskDataMap.set(bench, map);\n }\n return map;\n}\n\nexport function getTaskData(\n bench: Bench,\n taskName: string,\n): CapturedTaskData | undefined {\n return taskDataMap.get(bench)?.get(taskName);\n}\n","import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import { setupCore, teardownCore } from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { CapturedTaskData, getTaskData } from \"./taskData\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(bench: Bench, rootCallingFile: string) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected getTaskData(task: Task): CapturedTaskData {\n const data = getTaskData(this.bench, task.name);\n if (!data) {\n throw new Error(\n `[CodSpeed] No captured function found for task \"${task.name}\"`,\n );\n }\n return data;\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);\n return this.bench.tasks;\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n optimizeFunctionSync,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = this.getTaskData(task);\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n const rootFrame = wrapWithRootFrame(fn);\n InstrumentHooks.startBenchmark();\n try {\n await rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = this.getTaskData(task);\n\n fnOpts?.beforeAll?.call(task, \"run\");\n\n optimizeFunctionSync(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n fnOpts?.beforeEach?.call(task, \"run\");\n\n global.gc?.();\n const rootFrame = wrapWithRootFrameSync(fn);\n InstrumentHooks.startBenchmark();\n try {\n rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import { Bench, Hook } from \"tinybench\";\n\n// The benchmark options tinybench resolves: timing knobs plus the suite-level\n// setup/teardown hooks. tinybench guarantees `setup`/`teardown` are populated\n// (at least with no-op defaults), so they are non-optional here.\nexport interface ResolvedBenchOptions {\n setup: Hook;\n teardown: Hook;\n warmup?: boolean;\n warmupIterations?: number;\n warmupTime?: number;\n iterations?: number;\n time?: number;\n retainSamples?: boolean;\n}\n\n// Up to tinybench v5 the resolved options lived under `bench.opts`; from v6 they\n// are flattened onto the bench instance itself. Returning the holder object\n// (rather than a copy) keeps in-place mutation of `setup`/`teardown` working,\n// which the walltime runner relies on to bracket its instrumentation window.\nexport function getBenchOptions(bench: Bench): ResolvedBenchOptions {\n const opts = (bench as unknown as { opts?: ResolvedBenchOptions }).opts;\n return opts ?? (bench as unknown as ResolvedBenchOptions);\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Task, TaskResult } from \"tinybench\";\nimport { getBenchOptions } from \"./benchOptions\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new WalltimeBenchRunner(bench, rootCallingFile);\n runner.installInstrumentHooks();\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n // Carries the window start timestamp from the setup hook to the teardown\n // hook. Tasks run strictly sequentially, so a single field is enough.\n private runStart: bigint | null = null;\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n /**\n * Drive the instrumentation window from the task's setup/teardown hooks so it\n * brackets only tinybench's measured loop, excluding warmup and the\n * statistics computation (`processRunResult`) that surround it. The user's\n * own hooks are preserved and still run in their original order relative to\n * the work under test.\n */\n public installInstrumentHooks(): void {\n // The resolved options expose `setup`/`teardown` as typed `Readonly`, but\n // tinybench populates them with (at least) no-op defaults and lets them be\n // reassigned at runtime.\n const opts = getBenchOptions(this.bench);\n\n // We build the walltime statistics from the per-round latency samples.\n // tinybench stopped retaining them by default in v6, so opt back in.\n opts.retainSamples = true;\n\n const userSetup = opts.setup;\n const userTeardown = opts.teardown;\n\n opts.setup = (task, mode) => {\n const setupResult = userSetup(task, mode);\n if (mode === \"run\") {\n InstrumentHooks.startBenchmark();\n this.runStart = InstrumentHooks.currentTimestamp();\n }\n return setupResult;\n };\n\n opts.teardown = (task, mode) => {\n if (mode === \"run\" && task) {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(\n process.pid,\n this.getTaskUri(task),\n );\n if (this.runStart !== null) {\n this.sendBenchmarkMarkers(this.runStart, runEnd);\n }\n\n this.runStart = null;\n }\n return userTeardown(task, mode);\n };\n }\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // run the warmup of the task right before its actual run\n if (getBenchOptions(this.bench).warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await task.run();\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected runTaskSync(task: Task, _uri: string): void {\n if (getBenchOptions(this.bench).warmup) {\n task.warmupSync();\n }\n\n task.runSync();\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n const uri = this.getTaskUri(task);\n\n if (!task.result) {\n console.warn(` ⚠ No result data available for ${uri}`);\n return;\n }\n\n const opts = getBenchOptions(this.bench);\n const warmupIterations = opts.warmup\n ? (opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: opts.iterations ?? null,\n max_time_ns: opts.time ? msToNs(opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: TaskResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n // Get individual sample times in nanoseconds and sort them\n const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateTaskDataMap } from \"./taskData\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n const instrumentMode = getInstrumentMode();\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const taskDataMap = getOrCreateTaskDataMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n taskDataMap.set(name, { fn, fnOpts: opts });\n // In walltime mode the task is driven by tinybench's own measured loop, so\n // the root frame must be baked into the function tinybench stores rather\n // than injected later (the function is an inaccessible private field on the\n // task from tinybench v6 onwards). The sync wrapper is transparent to the\n // function's return value, so it preserves tinybench's sync/async handling.\n const registeredFn =\n instrumentMode === \"walltime\" ? wrapWithRootFrameSync(fn) : fn;\n return rawAdd.bind(bench)(name, registeredFn, opts);\n };\n\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField","setupCore","teardownCore","getCodspeedRunnerMode","InstrumentHooks","optimizeFunction","mongoMeasurement","wrapWithRootFrame","optimizeFunctionSync","wrapWithRootFrameSync","MARKER_TYPE_BENCHMARK_START","MARKER_TYPE_BENCHMARK_END","msToNs","writeWalltimeResults","calculateQuantiles","msToS","tryIntrospect","getCallingFile","getInstrumentMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/taskData.ts","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/benchOptions.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench, Fn, FnOptions } from \"tinybench\";\n\n// tinybench stores the benchmark function and its options as private fields on\n// `Task`. They were reachable through casts on older majors but became true\n// `#private` fields in v6, so we capture them ourselves when `bench.add` runs\n// and key them by task name, mirroring the URI map.\nexport interface CapturedTaskData {\n fn: Fn;\n fnOpts?: FnOptions;\n}\n\nconst taskDataMap = new WeakMap<Bench, Map<string, CapturedTaskData>>();\n\nexport function getOrCreateTaskDataMap(\n bench: Bench,\n): Map<string, CapturedTaskData> {\n let map = taskDataMap.get(bench);\n if (!map) {\n map = new Map<string, CapturedTaskData>();\n taskDataMap.set(bench, map);\n }\n return map;\n}\n\nexport function getTaskData(\n bench: Bench,\n taskName: string,\n): CapturedTaskData | undefined {\n return taskDataMap.get(bench)?.get(taskName);\n}\n","import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import { setupCore, teardownCore, type IsolationMode } from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { CapturedTaskData, getTaskData } from \"./taskData\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(\n bench: Bench,\n rootCallingFile: string,\n /** Only walltime runs are isolated. */\n protected readonly isolationMode: IsolationMode = { kind: \"SharedProcess\" },\n ) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n protected get isChild(): boolean {\n return this.isolationMode.kind === \"Fork\";\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n // The parent already printed the banner, children stay quiet.\n if (this.isChild) {\n return;\n }\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected getTaskData(task: Task): CapturedTaskData {\n const data = getTaskData(this.bench, task.name);\n if (!data) {\n throw new Error(\n `[CodSpeed] No captured function found for task \"${task.name}\"`,\n );\n }\n return data;\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n // The parent already printed the summary line, children stay quiet.\n if (!this.isChild) {\n console.log(\n `[CodSpeed] Done running ${this.bench.tasks.length} benches.`,\n );\n }\n return this.bench.tasks;\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n const tasks = this.selectTasks();\n // A child that owns none of this bench's tasks must not touch the\n // instruments, the bench that owns its task does.\n if (this.isChild && tasks.length === 0) {\n return this.bench.tasks;\n }\n this.setupBenchRun();\n\n for (const task of tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n const tasks = this.selectTasks();\n if (this.isChild && tasks.length === 0) {\n return this.bench.tasks;\n }\n this.setupBenchRun();\n\n for (const task of tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n\n /** The tasks this process measures: all of them, or the isolated one. */\n private selectTasks(): Task[] {\n const { isolationMode } = this;\n if (isolationMode.kind !== \"Fork\") return this.bench.tasks;\n return this.bench.tasks.filter(\n (task) => this.getTaskUri(task) === isolationMode.uri,\n );\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n optimizeFunctionSync,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = this.getTaskData(task);\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n const rootFrame = wrapWithRootFrame(fn);\n InstrumentHooks.startBenchmark();\n try {\n await rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = this.getTaskData(task);\n\n fnOpts?.beforeAll?.call(task, \"run\");\n\n optimizeFunctionSync(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n fnOpts?.beforeEach?.call(task, \"run\");\n\n global.gc?.();\n const rootFrame = wrapWithRootFrameSync(fn);\n InstrumentHooks.startBenchmark();\n try {\n rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import { Bench, Hook } from \"tinybench\";\n\n// The benchmark options tinybench resolves: timing knobs plus the suite-level\n// setup/teardown hooks. tinybench guarantees `setup`/`teardown` are populated\n// (at least with no-op defaults), so they are non-optional here.\nexport interface ResolvedBenchOptions {\n setup: Hook;\n teardown: Hook;\n warmup?: boolean;\n warmupIterations?: number;\n warmupTime?: number;\n iterations?: number;\n time?: number;\n retainSamples?: boolean;\n}\n\n// Up to tinybench v5 the resolved options lived under `bench.opts`; from v6 they\n// are flattened onto the bench instance itself. Returning the holder object\n// (rather than a copy) keeps in-place mutation of `setup`/`teardown` working,\n// which the walltime runner relies on to bracket its instrumentation window.\nexport function getBenchOptions(bench: Bench): ResolvedBenchOptions {\n const opts = (bench as unknown as { opts?: ResolvedBenchOptions }).opts;\n return opts ?? (bench as unknown as ResolvedBenchOptions);\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n mongoMeasurement,\n msToNs,\n msToS,\n runForks,\n runForksSync,\n samplesToResult,\n sortedSamplesNs,\n walltimeIsolation,\n writeForkSamples,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n type RoundsResult,\n type WalltimeOptions,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { getBenchOptions } from \"./benchOptions\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n options: WalltimeOptions,\n): void {\n const isolationMode = walltimeIsolation(options.forks);\n const runner = new WalltimeBenchRunner(bench, rootCallingFile, isolationMode);\n runner.installInstrumentHooks();\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n // Carries the window start timestamp from the setup hook to the teardown\n // hook. Tasks run strictly sequentially, so a single field is enough.\n private runStart: bigint | null = null;\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n /**\n * Drive the instrumentation window from the task's setup/teardown hooks so it\n * brackets only tinybench's measured loop, excluding warmup and the\n * statistics computation (`processRunResult`) that surround it. The user's\n * own hooks are preserved and still run in their original order relative to\n * the work under test.\n */\n public installInstrumentHooks(): void {\n // The resolved options expose `setup`/`teardown` as typed `Readonly`, but\n // tinybench populates them with (at least) no-op defaults and lets them be\n // reassigned at runtime.\n const opts = getBenchOptions(this.bench);\n\n // We build the walltime statistics from the per-round latency samples.\n // tinybench stopped retaining them by default in v6, so opt back in.\n opts.retainSamples = true;\n\n const userSetup = opts.setup;\n const userTeardown = opts.teardown;\n\n opts.setup = (task, mode) => {\n const setupResult = userSetup(task, mode);\n if (mode === \"run\") {\n InstrumentHooks.startBenchmark();\n this.runStart = InstrumentHooks.currentTimestamp();\n }\n return setupResult;\n };\n\n opts.teardown = (task, mode) => {\n if (mode === \"run\" && task) {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(\n process.pid,\n this.getTaskUri(task),\n );\n if (this.runStart !== null) {\n this.sendBenchmarkMarkers(this.runStart, runEnd);\n }\n\n this.runStart = null;\n }\n return userTeardown(task, mode);\n };\n }\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { isolationMode } = this;\n if (isolationMode.kind === \"Forks\") {\n const samples = await runForks(uri, isolationMode.forks);\n return this.registerForkedBenchmark(task, samples);\n }\n\n // run the warmup of the task right before its actual run\n if (getBenchOptions(this.bench).warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await task.run();\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { isolationMode } = this;\n if (isolationMode.kind === \"Forks\") {\n const samples = runForksSync(uri, isolationMode.forks);\n return this.registerForkedBenchmark(task, samples);\n }\n\n if (getBenchOptions(this.bench).warmup) {\n task.warmupSync();\n }\n\n task.runSync();\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n // A fork hands its samples to the parent, which reports the benchmark.\n // Without a result it hands none, and the parent warns once.\n if (this.isolationMode.kind === \"Fork\") {\n writeForkSamples(\n this.isolationMode.samplesFile,\n task.result?.latency.samples ?? [],\n );\n return;\n }\n if (!task.result) {\n return this.warnNoResult(task);\n }\n this.registerCodspeedBenchmark(task, task.result);\n }\n\n private registerForkedBenchmark(task: Task, samples: Float64Array): void {\n if (samples.length === 0) {\n return this.warnNoResult(task);\n }\n this.registerCodspeedBenchmark(task, samplesToResult(samples));\n }\n\n private warnNoResult(task: Task): void {\n console.warn(` ⚠ No result data available for ${this.getTaskUri(task)}`);\n }\n\n private registerCodspeedBenchmark(task: Task, result: RoundsResult): void {\n const uri = this.getTaskUri(task);\n const opts = getBenchOptions(this.bench);\n const warmupIterations = opts.warmup\n ? (opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: opts.iterations ?? null,\n max_time_ns: opts.time ? msToNs(opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // A fork only hands its samples to the parent, which reports the results.\n if (this.isChild) {\n return this.bench.tasks;\n }\n\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: RoundsResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n const sortedTimesNs = sortedSamplesNs(samples);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n wrapWithRootFrameSync,\n type WalltimeOptions,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateTaskDataMap } from \"./taskData\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(\n bench: Bench,\n options: WalltimeOptions = {},\n): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n const instrumentMode = getInstrumentMode();\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const taskDataMap = getOrCreateTaskDataMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n taskDataMap.set(name, { fn, fnOpts: opts });\n // In walltime mode the task is driven by tinybench's own measured loop, so\n // the root frame must be baked into the function tinybench stores rather\n // than injected later (the function is an inaccessible private field on the\n // task from tinybench v6 onwards). The sync wrapper is transparent to the\n // function's return value, so it preserves tinybench's sync/async handling.\n const registeredFn =\n instrumentMode === \"walltime\" ? wrapWithRootFrameSync(fn) : fn;\n return rawAdd.bind(bench)(name, registeredFn, opts);\n };\n\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile, options);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField","setupCore","teardownCore","getCodspeedRunnerMode","InstrumentHooks","optimizeFunction","mongoMeasurement","wrapWithRootFrame","optimizeFunctionSync","wrapWithRootFrameSync","walltimeIsolation","MARKER_TYPE_BENCHMARK_START","MARKER_TYPE_BENCHMARK_END","runForks","runForksSync","writeForkSamples","samplesToResult","msToNs","writeWalltimeResults","sortedSamplesNs","calculateQuantiles","msToS","tryIntrospect","getCallingFile","getInstrumentMode"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { SetupInstrumentsRequestBody, SetupInstrumentsResponse } from '@codspeed/core';
|
|
1
|
+
import { WalltimeOptions, SetupInstrumentsRequestBody, SetupInstrumentsResponse } from '@codspeed/core';
|
|
2
2
|
import { Bench } from 'tinybench';
|
|
3
3
|
|
|
4
|
-
declare function withCodSpeed(bench: Bench): Bench;
|
|
4
|
+
declare function withCodSpeed(bench: Bench, options?: WalltimeOptions): Bench;
|
|
5
5
|
/**
|
|
6
6
|
* Dynamically setup the CodSpeed instruments.
|
|
7
7
|
*/
|
package/dist/index.es5.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { setupCore, teardownCore, getCodspeedRunnerMode, InstrumentHooks, optimizeFunction, mongoMeasurement, wrapWithRootFrame, optimizeFunctionSync, wrapWithRootFrameSync, MARKER_TYPE_BENCHMARK_START, MARKER_TYPE_BENCHMARK_END, msToNs, writeWalltimeResults, calculateQuantiles, msToS, tryIntrospect, getCallingFile, getInstrumentMode } from '@codspeed/core';
|
|
1
|
+
import { setupCore, teardownCore, getCodspeedRunnerMode, InstrumentHooks, optimizeFunction, mongoMeasurement, wrapWithRootFrame, optimizeFunctionSync, wrapWithRootFrameSync, walltimeIsolation, MARKER_TYPE_BENCHMARK_START, MARKER_TYPE_BENCHMARK_END, runForks, runForksSync, writeForkSamples, samplesToResult, msToNs, writeWalltimeResults, sortedSamplesNs, calculateQuantiles, msToS, tryIntrospect, getCallingFile, getInstrumentMode } from '@codspeed/core';
|
|
2
2
|
|
|
3
3
|
const taskDataMap = /* @__PURE__ */ new WeakMap();
|
|
4
4
|
function getOrCreateTaskDataMap(bench) {
|
|
@@ -34,19 +34,26 @@ var __publicField$1 = (obj, key, value) => {
|
|
|
34
34
|
return value;
|
|
35
35
|
};
|
|
36
36
|
class BaseBenchRunner {
|
|
37
|
-
constructor(bench, rootCallingFile) {
|
|
37
|
+
constructor(bench, rootCallingFile, isolationMode = { kind: "SharedProcess" }) {
|
|
38
|
+
this.isolationMode = isolationMode;
|
|
38
39
|
__publicField$1(this, "bench");
|
|
39
40
|
__publicField$1(this, "rootCallingFile");
|
|
40
41
|
this.bench = bench;
|
|
41
42
|
this.rootCallingFile = rootCallingFile;
|
|
42
43
|
}
|
|
44
|
+
get isChild() {
|
|
45
|
+
return this.isolationMode.kind === "Fork";
|
|
46
|
+
}
|
|
43
47
|
setupBenchRun() {
|
|
44
48
|
setupCore();
|
|
45
49
|
this.logStart();
|
|
46
50
|
}
|
|
47
51
|
logStart() {
|
|
52
|
+
if (this.isChild) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
48
55
|
console.log(
|
|
49
|
-
`[CodSpeed] running with @codspeed/tinybench v${"
|
|
56
|
+
`[CodSpeed] running with @codspeed/tinybench v${"7.0.0-beta.0"} (${this.getModeName()})`
|
|
50
57
|
);
|
|
51
58
|
}
|
|
52
59
|
getTaskUri(task) {
|
|
@@ -66,27 +73,48 @@ class BaseBenchRunner {
|
|
|
66
73
|
}
|
|
67
74
|
finalizeBenchRun() {
|
|
68
75
|
teardownCore();
|
|
69
|
-
|
|
76
|
+
if (!this.isChild) {
|
|
77
|
+
console.log(
|
|
78
|
+
`[CodSpeed] Done running ${this.bench.tasks.length} benches.`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
70
81
|
return this.bench.tasks;
|
|
71
82
|
}
|
|
72
83
|
setupBenchMethods() {
|
|
73
84
|
this.bench.run = async () => {
|
|
85
|
+
const tasks = this.selectTasks();
|
|
86
|
+
if (this.isChild && tasks.length === 0) {
|
|
87
|
+
return this.bench.tasks;
|
|
88
|
+
}
|
|
74
89
|
this.setupBenchRun();
|
|
75
|
-
for (const task of
|
|
90
|
+
for (const task of tasks) {
|
|
76
91
|
const uri = this.getTaskUri(task);
|
|
77
92
|
await this.runTaskAsync(task, uri);
|
|
78
93
|
}
|
|
79
94
|
return this.finalizeAsyncRun();
|
|
80
95
|
};
|
|
81
96
|
this.bench.runSync = () => {
|
|
97
|
+
const tasks = this.selectTasks();
|
|
98
|
+
if (this.isChild && tasks.length === 0) {
|
|
99
|
+
return this.bench.tasks;
|
|
100
|
+
}
|
|
82
101
|
this.setupBenchRun();
|
|
83
|
-
for (const task of
|
|
102
|
+
for (const task of tasks) {
|
|
84
103
|
const uri = this.getTaskUri(task);
|
|
85
104
|
this.runTaskSync(task, uri);
|
|
86
105
|
}
|
|
87
106
|
return this.finalizeSyncRun();
|
|
88
107
|
};
|
|
89
108
|
}
|
|
109
|
+
/** The tasks this process measures: all of them, or the isolated one. */
|
|
110
|
+
selectTasks() {
|
|
111
|
+
const { isolationMode } = this;
|
|
112
|
+
if (isolationMode.kind !== "Fork")
|
|
113
|
+
return this.bench.tasks;
|
|
114
|
+
return this.bench.tasks.filter(
|
|
115
|
+
(task) => this.getTaskUri(task) === isolationMode.uri
|
|
116
|
+
);
|
|
117
|
+
}
|
|
90
118
|
}
|
|
91
119
|
|
|
92
120
|
function setupCodspeedAnalysisBench(bench, rootCallingFile) {
|
|
@@ -166,8 +194,9 @@ var __publicField = (obj, key, value) => {
|
|
|
166
194
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
167
195
|
return value;
|
|
168
196
|
};
|
|
169
|
-
function setupCodspeedWalltimeBench(bench, rootCallingFile) {
|
|
170
|
-
const
|
|
197
|
+
function setupCodspeedWalltimeBench(bench, rootCallingFile, options) {
|
|
198
|
+
const isolationMode = walltimeIsolation(options.forks);
|
|
199
|
+
const runner = new WalltimeBenchRunner(bench, rootCallingFile, isolationMode);
|
|
171
200
|
runner.installInstrumentHooks();
|
|
172
201
|
runner.setupBenchMethods();
|
|
173
202
|
}
|
|
@@ -227,6 +256,11 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
227
256
|
InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
228
257
|
}
|
|
229
258
|
async runTaskAsync(task, uri) {
|
|
259
|
+
const { isolationMode } = this;
|
|
260
|
+
if (isolationMode.kind === "Forks") {
|
|
261
|
+
const samples = await runForks(uri, isolationMode.forks);
|
|
262
|
+
return this.registerForkedBenchmark(task, samples);
|
|
263
|
+
}
|
|
230
264
|
if (getBenchOptions(this.bench).warmup) {
|
|
231
265
|
await task.warmup();
|
|
232
266
|
}
|
|
@@ -235,8 +269,12 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
235
269
|
await mongoMeasurement.stop(uri);
|
|
236
270
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
237
271
|
}
|
|
238
|
-
|
|
239
|
-
|
|
272
|
+
runTaskSync(task, uri) {
|
|
273
|
+
const { isolationMode } = this;
|
|
274
|
+
if (isolationMode.kind === "Forks") {
|
|
275
|
+
const samples = runForksSync(uri, isolationMode.forks);
|
|
276
|
+
return this.registerForkedBenchmark(task, samples);
|
|
277
|
+
}
|
|
240
278
|
if (getBenchOptions(this.bench).warmup) {
|
|
241
279
|
task.warmupSync();
|
|
242
280
|
}
|
|
@@ -250,15 +288,33 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
250
288
|
return this.finalizeWalltimeRun(false);
|
|
251
289
|
}
|
|
252
290
|
registerCodspeedBenchmarkFromTask(task) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
291
|
+
if (this.isolationMode.kind === "Fork") {
|
|
292
|
+
writeForkSamples(
|
|
293
|
+
this.isolationMode.samplesFile,
|
|
294
|
+
task.result?.latency.samples ?? []
|
|
295
|
+
);
|
|
256
296
|
return;
|
|
257
297
|
}
|
|
298
|
+
if (!task.result) {
|
|
299
|
+
return this.warnNoResult(task);
|
|
300
|
+
}
|
|
301
|
+
this.registerCodspeedBenchmark(task, task.result);
|
|
302
|
+
}
|
|
303
|
+
registerForkedBenchmark(task, samples) {
|
|
304
|
+
if (samples.length === 0) {
|
|
305
|
+
return this.warnNoResult(task);
|
|
306
|
+
}
|
|
307
|
+
this.registerCodspeedBenchmark(task, samplesToResult(samples));
|
|
308
|
+
}
|
|
309
|
+
warnNoResult(task) {
|
|
310
|
+
console.warn(` \u26A0 No result data available for ${this.getTaskUri(task)}`);
|
|
311
|
+
}
|
|
312
|
+
registerCodspeedBenchmark(task, result) {
|
|
313
|
+
const uri = this.getTaskUri(task);
|
|
258
314
|
const opts = getBenchOptions(this.bench);
|
|
259
315
|
const warmupIterations = opts.warmup ? opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT : 0;
|
|
260
316
|
const stats = convertTinybenchResultToBenchmarkStats(
|
|
261
|
-
|
|
317
|
+
result,
|
|
262
318
|
warmupIterations
|
|
263
319
|
);
|
|
264
320
|
this.codspeedBenchmarks.push({
|
|
@@ -276,6 +332,9 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
276
332
|
this.logTaskCompletion(uri, "Collected walltime data for");
|
|
277
333
|
}
|
|
278
334
|
finalizeWalltimeRun(isAsync) {
|
|
335
|
+
if (this.isChild) {
|
|
336
|
+
return this.bench.tasks;
|
|
337
|
+
}
|
|
279
338
|
if (this.codspeedBenchmarks.length > 0) {
|
|
280
339
|
writeWalltimeResults(this.codspeedBenchmarks, isAsync);
|
|
281
340
|
}
|
|
@@ -288,7 +347,7 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
288
347
|
const TINYBENCH_WARMUP_DEFAULT = 16;
|
|
289
348
|
function convertTinybenchResultToBenchmarkStats(result, warmupIterations) {
|
|
290
349
|
const { min, max, mean, sd, samples } = result.latency;
|
|
291
|
-
const sortedTimesNs = samples
|
|
350
|
+
const sortedTimesNs = sortedSamplesNs(samples);
|
|
292
351
|
const meanNs = msToNs(mean);
|
|
293
352
|
const stdevNs = msToNs(sd);
|
|
294
353
|
const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } = calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });
|
|
@@ -311,7 +370,7 @@ function convertTinybenchResultToBenchmarkStats(result, warmupIterations) {
|
|
|
311
370
|
}
|
|
312
371
|
|
|
313
372
|
tryIntrospect();
|
|
314
|
-
function withCodSpeed(bench) {
|
|
373
|
+
function withCodSpeed(bench, options = {}) {
|
|
315
374
|
const codspeedRunnerMode = getCodspeedRunnerMode();
|
|
316
375
|
if (codspeedRunnerMode === "disabled") {
|
|
317
376
|
return bench;
|
|
@@ -336,7 +395,7 @@ function withCodSpeed(bench) {
|
|
|
336
395
|
if (instrumentMode === "analysis") {
|
|
337
396
|
setupCodspeedAnalysisBench(bench, rootCallingFile);
|
|
338
397
|
} else if (instrumentMode === "walltime") {
|
|
339
|
-
setupCodspeedWalltimeBench(bench, rootCallingFile);
|
|
398
|
+
setupCodspeedWalltimeBench(bench, rootCallingFile, options);
|
|
340
399
|
}
|
|
341
400
|
return bench;
|
|
342
401
|
}
|
package/dist/index.es5.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es5.js","sources":["../src/taskData.ts","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/benchOptions.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench, Fn, FnOptions } from \"tinybench\";\n\n// tinybench stores the benchmark function and its options as private fields on\n// `Task`. They were reachable through casts on older majors but became true\n// `#private` fields in v6, so we capture them ourselves when `bench.add` runs\n// and key them by task name, mirroring the URI map.\nexport interface CapturedTaskData {\n fn: Fn;\n fnOpts?: FnOptions;\n}\n\nconst taskDataMap = new WeakMap<Bench, Map<string, CapturedTaskData>>();\n\nexport function getOrCreateTaskDataMap(\n bench: Bench,\n): Map<string, CapturedTaskData> {\n let map = taskDataMap.get(bench);\n if (!map) {\n map = new Map<string, CapturedTaskData>();\n taskDataMap.set(bench, map);\n }\n return map;\n}\n\nexport function getTaskData(\n bench: Bench,\n taskName: string,\n): CapturedTaskData | undefined {\n return taskDataMap.get(bench)?.get(taskName);\n}\n","import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import { setupCore, teardownCore } from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { CapturedTaskData, getTaskData } from \"./taskData\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(bench: Bench, rootCallingFile: string) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected getTaskData(task: Task): CapturedTaskData {\n const data = getTaskData(this.bench, task.name);\n if (!data) {\n throw new Error(\n `[CodSpeed] No captured function found for task \"${task.name}\"`,\n );\n }\n return data;\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);\n return this.bench.tasks;\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n optimizeFunctionSync,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = this.getTaskData(task);\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n const rootFrame = wrapWithRootFrame(fn);\n InstrumentHooks.startBenchmark();\n try {\n await rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = this.getTaskData(task);\n\n fnOpts?.beforeAll?.call(task, \"run\");\n\n optimizeFunctionSync(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n fnOpts?.beforeEach?.call(task, \"run\");\n\n global.gc?.();\n const rootFrame = wrapWithRootFrameSync(fn);\n InstrumentHooks.startBenchmark();\n try {\n rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import { Bench, Hook } from \"tinybench\";\n\n// The benchmark options tinybench resolves: timing knobs plus the suite-level\n// setup/teardown hooks. tinybench guarantees `setup`/`teardown` are populated\n// (at least with no-op defaults), so they are non-optional here.\nexport interface ResolvedBenchOptions {\n setup: Hook;\n teardown: Hook;\n warmup?: boolean;\n warmupIterations?: number;\n warmupTime?: number;\n iterations?: number;\n time?: number;\n retainSamples?: boolean;\n}\n\n// Up to tinybench v5 the resolved options lived under `bench.opts`; from v6 they\n// are flattened onto the bench instance itself. Returning the holder object\n// (rather than a copy) keeps in-place mutation of `setup`/`teardown` working,\n// which the walltime runner relies on to bracket its instrumentation window.\nexport function getBenchOptions(bench: Bench): ResolvedBenchOptions {\n const opts = (bench as unknown as { opts?: ResolvedBenchOptions }).opts;\n return opts ?? (bench as unknown as ResolvedBenchOptions);\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Task, TaskResult } from \"tinybench\";\nimport { getBenchOptions } from \"./benchOptions\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new WalltimeBenchRunner(bench, rootCallingFile);\n runner.installInstrumentHooks();\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n // Carries the window start timestamp from the setup hook to the teardown\n // hook. Tasks run strictly sequentially, so a single field is enough.\n private runStart: bigint | null = null;\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n /**\n * Drive the instrumentation window from the task's setup/teardown hooks so it\n * brackets only tinybench's measured loop, excluding warmup and the\n * statistics computation (`processRunResult`) that surround it. The user's\n * own hooks are preserved and still run in their original order relative to\n * the work under test.\n */\n public installInstrumentHooks(): void {\n // The resolved options expose `setup`/`teardown` as typed `Readonly`, but\n // tinybench populates them with (at least) no-op defaults and lets them be\n // reassigned at runtime.\n const opts = getBenchOptions(this.bench);\n\n // We build the walltime statistics from the per-round latency samples.\n // tinybench stopped retaining them by default in v6, so opt back in.\n opts.retainSamples = true;\n\n const userSetup = opts.setup;\n const userTeardown = opts.teardown;\n\n opts.setup = (task, mode) => {\n const setupResult = userSetup(task, mode);\n if (mode === \"run\") {\n InstrumentHooks.startBenchmark();\n this.runStart = InstrumentHooks.currentTimestamp();\n }\n return setupResult;\n };\n\n opts.teardown = (task, mode) => {\n if (mode === \"run\" && task) {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(\n process.pid,\n this.getTaskUri(task),\n );\n if (this.runStart !== null) {\n this.sendBenchmarkMarkers(this.runStart, runEnd);\n }\n\n this.runStart = null;\n }\n return userTeardown(task, mode);\n };\n }\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // run the warmup of the task right before its actual run\n if (getBenchOptions(this.bench).warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await task.run();\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected runTaskSync(task: Task, _uri: string): void {\n if (getBenchOptions(this.bench).warmup) {\n task.warmupSync();\n }\n\n task.runSync();\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n const uri = this.getTaskUri(task);\n\n if (!task.result) {\n console.warn(` ⚠ No result data available for ${uri}`);\n return;\n }\n\n const opts = getBenchOptions(this.bench);\n const warmupIterations = opts.warmup\n ? (opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: opts.iterations ?? null,\n max_time_ns: opts.time ? msToNs(opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: TaskResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n // Get individual sample times in nanoseconds and sort them\n const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateTaskDataMap } from \"./taskData\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n const instrumentMode = getInstrumentMode();\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const taskDataMap = getOrCreateTaskDataMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n taskDataMap.set(name, { fn, fnOpts: opts });\n // In walltime mode the task is driven by tinybench's own measured loop, so\n // the root frame must be baked into the function tinybench stores rather\n // than injected later (the function is an inaccessible private field on the\n // task from tinybench v6 onwards). The sync wrapper is transparent to the\n // function's return value, so it preserves tinybench's sync/async handling.\n const registeredFn =\n instrumentMode === \"walltime\" ? wrapWithRootFrameSync(fn) : fn;\n return rawAdd.bind(bench)(name, registeredFn, opts);\n };\n\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField"],"mappings":";;AAWA,MAAM,WAAA,uBAAkB,OAAA,EAA8C;AAE/D,SAAS,uBACd,KAAA,EAC+B;AAC/B,EAAA,IAAI,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,uBAAU,GAAA,EAA8B;AACxC,IAAA,WAAA,CAAY,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,WAAA,CACd,OACA,QAAA,EAC8B;AAC9B,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG,IAAI,QAAQ,CAAA;AAC7C;;AC1BO,MAAM,UAAA,uBAAiB,OAAA,EAAoC;AAE3D,SAAS,UAAA,CACd,KAAA,EACA,QAAA,EACA,eAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACnC,EAAA,OAAO,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAG,eAAA,CAAA,EAAA,EAAoB,QAAA,CAAA,CAAA;AACzD;AAEO,SAAS,kBAAkB,KAAA,EAAmC;AACnE,EAAA,IAAI,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,uBAAa,GAAA,EAAoB;AACjC,IAAA,UAAA,CAAW,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;;;;;;;;ACdO,MAAe,eAAA,CAAgB;AAAA,EAIpC,WAAA,CAAY,OAAc,eAAA,EAAyB;AAHnD,IAAAA,eAAA,CAAA,IAAA,EAAU,OAAA,CAAA;AACV,IAAAA,eAAA,CAAA,IAAA,EAAU,iBAAA,CAAA;AAGR,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,SAAA,EAAU;AACV,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,OAAA,CAAA,EAAA,EAAgB,IAAA,CAAK,WAAA,EAAY,CAAA,CAAA;AAAA,KACnF;AAAA,EACF;AAAA,EAEU,WAAW,IAAA,EAAoB;AACvC,IAAA,OAAO,WAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAK,eAAe,CAAA;AAAA,EAC/D;AAAA,EAEU,YAAY,IAAA,EAA8B;AAClD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mDAAmD,IAAA,CAAK,IAAA,CAAA,CAAA;AAAA,OAC1D;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,iBAAA,CAAkB,KAAa,MAAA,EAAsB;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAA,CAAA,EAAU,GAAA,CAAA,CAAK,CAAA;AAAA,EAC3C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,IAAA,CAAK,KAAA,CAAM,MAAM,MAAA,CAAA,SAAA,CAAiB,CAAA;AACzE,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AAAA,EAQO,iBAAA,GAA0B;AAC/B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,YAAY;AAC3B,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA;AAAA,MACnC;AAEA,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM;AACzB,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,IAAA,CAAK,WAAA,CAAY,MAAM,GAAG,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,IAC9B,CAAA;AAAA,EACF;AACF;;ACpEO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EACtC,WAAA,GAAsB;AAC9B,IAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,IAAA,OAAO,CAAA,EAAG,UAAA,CAAA,KAAA,CAAA;AAAA,EACZ;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,OAAO,eAAA,CAAgB,cAAA,EAAe,GAAI,UAAA,GAAa,SAAA;AAAA,EACzD;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AACnE,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA;AAE5C,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAEhC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,SAAA,GAAY,kBAAkB,EAAE,CAAA;AACtC,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,EAAU;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAExC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,WAAA,CAAY,MAAY,GAAA,EAAmB;AACnD,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA;AAE5C,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEnC,IAAA,oBAAA,CAAqB,YAAY;AAC/B,MAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACpC,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEpC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,SAAA,GAAY,sBAAsB,EAAE,CAAA;AAC1C,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,IAAI;AACF,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAElC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AACF;;AC3EO,SAAS,gBAAgB,KAAA,EAAoC;AAClE,EAAA,MAAM,OAAQ,KAAA,CAAqD,IAAA;AACnE,EAAA,OAAO,IAAA,IAAS,KAAA;AAClB;;;;;;;;ACPO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,sBAAA,EAAuB;AAC9B,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EAAlD,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAA0C,EAAC,CAAA;AAInD;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAA0B,IAAA,CAAA;AAAA,EAAA;AAAA,EAExB,WAAA,GAAsB;AAC9B,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,sBAAA,GAA+B;AAIpC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAIvC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,IAAA,MAAM,eAAe,IAAA,CAAK,QAAA;AAE1B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,EAAM,IAAA,KAAS;AAC3B,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AACxC,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,QAAA,IAAA,CAAK,QAAA,GAAW,gBAAgB,gBAAA,EAAiB;AAAA,MACnD;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,IAAA,EAAM,IAAA,KAAS;AAC9B,MAAA,IAAI,IAAA,KAAS,SAAS,IAAA,EAAM;AAC1B,QAAA,MAAM,MAAA,GAAS,gBAAgB,gBAAA,EAAiB;AAChD,QAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,QAAA,eAAA,CAAgB,oBAAA;AAAA,UACd,OAAA,CAAQ,GAAA;AAAA,UACR,IAAA,CAAK,WAAW,IAAI;AAAA,SACtB;AACA,QAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,UAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAAA,QACjD;AAEA,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB;AACA,MAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,UAAkB,MAAA,EAAsB;AACnE,IAAA,eAAA,CAAgB,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA;AAAA,MACR,2BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,eAAA,CAAgB,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,yBAAA,EAA2B,MAAM,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AAEnE,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,EAAQ;AACtC,MAAA,MAAM,KAAK,MAAA,EAAO;AAAA,IACpB;AAEA,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAChC,IAAA,MAAM,KAAK,GAAA,EAAI;AACf,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAE/B,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGU,WAAA,CAAY,MAAY,IAAA,EAAoB;AACpD,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,EAAQ;AACtC,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EACtC;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,kCAAkC,IAAA,EAAkB;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,2CAAsC,GAAA,CAAA,CAAK,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,GACzB,IAAA,CAAK,oBAAoB,wBAAA,GAC1B,CAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,sCAAA;AAAA,MACZ,IAAA,CAAK,MAAA;AAAA,MACL;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK;AAAA,MAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,QAC/B,aAAa,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,QAC7C,iBAAA,EAAmB,IAAA;AAAA;AAAA,QACnB,cAAA,EACE,KAAK,MAAA,IAAU,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI;AAAA,OAC/D;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,6BAA6B,CAAA;AAAA,EAC3D;AAAA,EAEQ,oBAAoB,OAAA,EAA0B;AAEpD,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,oBAAA,CAAqB,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAA,SAAA;AAAA,KACnE;AACA,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AACF;AAEA,MAAM,wBAAA,GAA2B,EAAA;AAEjC,SAAS,sCAAA,CACP,QACA,gBAAA,EACgB;AAChB,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM,EAAA,EAAI,OAAA,KAAY,MAAA,CAAO,OAAA;AAG/C,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,EAAE,CAAA;AAEzB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,kBAAA,EAAoB,oBAAA,EAAqB,GACxE,kBAAA,CAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IAClC,cAAA,EAAgB,CAAA;AAAA;AAAA,IAChB,QAAQ,aAAA,CAAc,MAAA;AAAA,IACtB,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA,EAAc;AAAA,GAChB;AACF;;ACxLA,aAAA,EAAc;AAEP,SAAS,aAAa,KAAA,EAAqB;AAChD,EAAA,MAAM,qBAAqB,qBAAA,EAAsB;AACjD,EAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,eAAe,CAAC,CAAA;AACxC,EAAA,MAAM,iBAAiB,iBAAA,EAAkB;AAGzC,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,uBAAuB,KAAK,CAAA;AAChD,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA;AACrB,EAAA,KAAA,CAAM,GAAA,GAAM,CAAC,IAAA,EAAM,EAAA,EAAI,IAAA,KAAU;AAC/B,IAAA,MAAM,WAAA,GAAc,eAAe,CAAC,CAAA;AACpC,IAAA,IAAI,GAAA,GAAM,WAAA;AACV,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,GAAA,IAAO,KAAK,KAAA,CAAM,IAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,GAAA,IAAO,CAAA,EAAA,EAAK,IAAA,CAAA,CAAA;AACZ,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AACpB,IAAA,WAAA,CAAY,IAAI,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;AAM1C,IAAA,MAAM,YAAA,GACJ,cAAA,KAAmB,UAAA,GAAa,qBAAA,CAAsB,EAAE,CAAA,GAAI,EAAA;AAC9D,IAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,EAAM,cAAc,IAAI,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AACxC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,iBACpB,IAAA,EACmC;AACnC,EAAA,IAAI,CAAC,eAAA,CAAgB,cAAA,EAAe,EAAG;AACrC,IAAA,OAAA,CAAQ,KAAK,6DAA6D,CAAA;AAE1E,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,QAAA,EAAS;AAAA,EACrC;AAEA,EAAA,OAAO,MAAM,gBAAA,CAAiB,gBAAA,CAAiB,IAAI,CAAA;AACrD;;;;"}
|
|
1
|
+
{"version":3,"file":"index.es5.js","sources":["../src/taskData.ts","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/benchOptions.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench, Fn, FnOptions } from \"tinybench\";\n\n// tinybench stores the benchmark function and its options as private fields on\n// `Task`. They were reachable through casts on older majors but became true\n// `#private` fields in v6, so we capture them ourselves when `bench.add` runs\n// and key them by task name, mirroring the URI map.\nexport interface CapturedTaskData {\n fn: Fn;\n fnOpts?: FnOptions;\n}\n\nconst taskDataMap = new WeakMap<Bench, Map<string, CapturedTaskData>>();\n\nexport function getOrCreateTaskDataMap(\n bench: Bench,\n): Map<string, CapturedTaskData> {\n let map = taskDataMap.get(bench);\n if (!map) {\n map = new Map<string, CapturedTaskData>();\n taskDataMap.set(bench, map);\n }\n return map;\n}\n\nexport function getTaskData(\n bench: Bench,\n taskName: string,\n): CapturedTaskData | undefined {\n return taskDataMap.get(bench)?.get(taskName);\n}\n","import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import { setupCore, teardownCore, type IsolationMode } from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { CapturedTaskData, getTaskData } from \"./taskData\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(\n bench: Bench,\n rootCallingFile: string,\n /** Only walltime runs are isolated. */\n protected readonly isolationMode: IsolationMode = { kind: \"SharedProcess\" },\n ) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n protected get isChild(): boolean {\n return this.isolationMode.kind === \"Fork\";\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n // The parent already printed the banner, children stay quiet.\n if (this.isChild) {\n return;\n }\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected getTaskData(task: Task): CapturedTaskData {\n const data = getTaskData(this.bench, task.name);\n if (!data) {\n throw new Error(\n `[CodSpeed] No captured function found for task \"${task.name}\"`,\n );\n }\n return data;\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n // The parent already printed the summary line, children stay quiet.\n if (!this.isChild) {\n console.log(\n `[CodSpeed] Done running ${this.bench.tasks.length} benches.`,\n );\n }\n return this.bench.tasks;\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n const tasks = this.selectTasks();\n // A child that owns none of this bench's tasks must not touch the\n // instruments, the bench that owns its task does.\n if (this.isChild && tasks.length === 0) {\n return this.bench.tasks;\n }\n this.setupBenchRun();\n\n for (const task of tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n const tasks = this.selectTasks();\n if (this.isChild && tasks.length === 0) {\n return this.bench.tasks;\n }\n this.setupBenchRun();\n\n for (const task of tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n\n /** The tasks this process measures: all of them, or the isolated one. */\n private selectTasks(): Task[] {\n const { isolationMode } = this;\n if (isolationMode.kind !== \"Fork\") return this.bench.tasks;\n return this.bench.tasks.filter(\n (task) => this.getTaskUri(task) === isolationMode.uri,\n );\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n optimizeFunctionSync,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = this.getTaskData(task);\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n const rootFrame = wrapWithRootFrame(fn);\n InstrumentHooks.startBenchmark();\n try {\n await rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = this.getTaskData(task);\n\n fnOpts?.beforeAll?.call(task, \"run\");\n\n optimizeFunctionSync(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n fnOpts?.beforeEach?.call(task, \"run\");\n\n global.gc?.();\n const rootFrame = wrapWithRootFrameSync(fn);\n InstrumentHooks.startBenchmark();\n try {\n rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import { Bench, Hook } from \"tinybench\";\n\n// The benchmark options tinybench resolves: timing knobs plus the suite-level\n// setup/teardown hooks. tinybench guarantees `setup`/`teardown` are populated\n// (at least with no-op defaults), so they are non-optional here.\nexport interface ResolvedBenchOptions {\n setup: Hook;\n teardown: Hook;\n warmup?: boolean;\n warmupIterations?: number;\n warmupTime?: number;\n iterations?: number;\n time?: number;\n retainSamples?: boolean;\n}\n\n// Up to tinybench v5 the resolved options lived under `bench.opts`; from v6 they\n// are flattened onto the bench instance itself. Returning the holder object\n// (rather than a copy) keeps in-place mutation of `setup`/`teardown` working,\n// which the walltime runner relies on to bracket its instrumentation window.\nexport function getBenchOptions(bench: Bench): ResolvedBenchOptions {\n const opts = (bench as unknown as { opts?: ResolvedBenchOptions }).opts;\n return opts ?? (bench as unknown as ResolvedBenchOptions);\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n mongoMeasurement,\n msToNs,\n msToS,\n runForks,\n runForksSync,\n samplesToResult,\n sortedSamplesNs,\n walltimeIsolation,\n writeForkSamples,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n type RoundsResult,\n type WalltimeOptions,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { getBenchOptions } from \"./benchOptions\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n options: WalltimeOptions,\n): void {\n const isolationMode = walltimeIsolation(options.forks);\n const runner = new WalltimeBenchRunner(bench, rootCallingFile, isolationMode);\n runner.installInstrumentHooks();\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n // Carries the window start timestamp from the setup hook to the teardown\n // hook. Tasks run strictly sequentially, so a single field is enough.\n private runStart: bigint | null = null;\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n /**\n * Drive the instrumentation window from the task's setup/teardown hooks so it\n * brackets only tinybench's measured loop, excluding warmup and the\n * statistics computation (`processRunResult`) that surround it. The user's\n * own hooks are preserved and still run in their original order relative to\n * the work under test.\n */\n public installInstrumentHooks(): void {\n // The resolved options expose `setup`/`teardown` as typed `Readonly`, but\n // tinybench populates them with (at least) no-op defaults and lets them be\n // reassigned at runtime.\n const opts = getBenchOptions(this.bench);\n\n // We build the walltime statistics from the per-round latency samples.\n // tinybench stopped retaining them by default in v6, so opt back in.\n opts.retainSamples = true;\n\n const userSetup = opts.setup;\n const userTeardown = opts.teardown;\n\n opts.setup = (task, mode) => {\n const setupResult = userSetup(task, mode);\n if (mode === \"run\") {\n InstrumentHooks.startBenchmark();\n this.runStart = InstrumentHooks.currentTimestamp();\n }\n return setupResult;\n };\n\n opts.teardown = (task, mode) => {\n if (mode === \"run\" && task) {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(\n process.pid,\n this.getTaskUri(task),\n );\n if (this.runStart !== null) {\n this.sendBenchmarkMarkers(this.runStart, runEnd);\n }\n\n this.runStart = null;\n }\n return userTeardown(task, mode);\n };\n }\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { isolationMode } = this;\n if (isolationMode.kind === \"Forks\") {\n const samples = await runForks(uri, isolationMode.forks);\n return this.registerForkedBenchmark(task, samples);\n }\n\n // run the warmup of the task right before its actual run\n if (getBenchOptions(this.bench).warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await task.run();\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { isolationMode } = this;\n if (isolationMode.kind === \"Forks\") {\n const samples = runForksSync(uri, isolationMode.forks);\n return this.registerForkedBenchmark(task, samples);\n }\n\n if (getBenchOptions(this.bench).warmup) {\n task.warmupSync();\n }\n\n task.runSync();\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n // A fork hands its samples to the parent, which reports the benchmark.\n // Without a result it hands none, and the parent warns once.\n if (this.isolationMode.kind === \"Fork\") {\n writeForkSamples(\n this.isolationMode.samplesFile,\n task.result?.latency.samples ?? [],\n );\n return;\n }\n if (!task.result) {\n return this.warnNoResult(task);\n }\n this.registerCodspeedBenchmark(task, task.result);\n }\n\n private registerForkedBenchmark(task: Task, samples: Float64Array): void {\n if (samples.length === 0) {\n return this.warnNoResult(task);\n }\n this.registerCodspeedBenchmark(task, samplesToResult(samples));\n }\n\n private warnNoResult(task: Task): void {\n console.warn(` ⚠ No result data available for ${this.getTaskUri(task)}`);\n }\n\n private registerCodspeedBenchmark(task: Task, result: RoundsResult): void {\n const uri = this.getTaskUri(task);\n const opts = getBenchOptions(this.bench);\n const warmupIterations = opts.warmup\n ? (opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: opts.iterations ?? null,\n max_time_ns: opts.time ? msToNs(opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // A fork only hands its samples to the parent, which reports the results.\n if (this.isChild) {\n return this.bench.tasks;\n }\n\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: RoundsResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n const sortedTimesNs = sortedSamplesNs(samples);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n wrapWithRootFrameSync,\n type WalltimeOptions,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateTaskDataMap } from \"./taskData\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(\n bench: Bench,\n options: WalltimeOptions = {},\n): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n const instrumentMode = getInstrumentMode();\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const taskDataMap = getOrCreateTaskDataMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n taskDataMap.set(name, { fn, fnOpts: opts });\n // In walltime mode the task is driven by tinybench's own measured loop, so\n // the root frame must be baked into the function tinybench stores rather\n // than injected later (the function is an inaccessible private field on the\n // task from tinybench v6 onwards). The sync wrapper is transparent to the\n // function's return value, so it preserves tinybench's sync/async handling.\n const registeredFn =\n instrumentMode === \"walltime\" ? wrapWithRootFrameSync(fn) : fn;\n return rawAdd.bind(bench)(name, registeredFn, opts);\n };\n\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile, options);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField"],"mappings":";;AAWA,MAAM,WAAA,uBAAkB,OAAA,EAA8C;AAE/D,SAAS,uBACd,KAAA,EAC+B;AAC/B,EAAA,IAAI,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,uBAAU,GAAA,EAA8B;AACxC,IAAA,WAAA,CAAY,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,WAAA,CACd,OACA,QAAA,EAC8B;AAC9B,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG,IAAI,QAAQ,CAAA;AAC7C;;AC1BO,MAAM,UAAA,uBAAiB,OAAA,EAAoC;AAE3D,SAAS,UAAA,CACd,KAAA,EACA,QAAA,EACA,eAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACnC,EAAA,OAAO,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAG,eAAA,CAAA,EAAA,EAAoB,QAAA,CAAA,CAAA;AACzD;AAEO,SAAS,kBAAkB,KAAA,EAAmC;AACnE,EAAA,IAAI,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,uBAAa,GAAA,EAAoB;AACjC,IAAA,UAAA,CAAW,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;;;;;;;;ACdO,MAAe,eAAA,CAAgB;AAAA,EAIpC,YACE,KAAA,EACA,eAAA,EAEmB,gBAA+B,EAAE,IAAA,EAAM,iBAAgB,EAC1E;AADmB,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAPrB,IAAAA,eAAA,CAAA,IAAA,EAAU,OAAA,CAAA;AACV,IAAAA,eAAA,CAAA,IAAA,EAAU,iBAAA,CAAA;AAQR,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA,EAEA,IAAc,OAAA,GAAmB;AAC/B,IAAA,OAAO,IAAA,CAAK,cAAc,IAAA,KAAS,MAAA;AAAA,EACrC;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,SAAA,EAAU;AACV,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AAEvB,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,cAAA,CAAA,EAAA,EAAgB,IAAA,CAAK,WAAA,EAAY,CAAA,CAAA;AAAA,KACnF;AAAA,EACF;AAAA,EAEU,WAAW,IAAA,EAAoB;AACvC,IAAA,OAAO,WAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAK,eAAe,CAAA;AAAA,EAC/D;AAAA,EAEU,YAAY,IAAA,EAA8B;AAClD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mDAAmD,IAAA,CAAK,IAAA,CAAA,CAAA;AAAA,OAC1D;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,iBAAA,CAAkB,KAAa,MAAA,EAAsB;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAA,CAAA,EAAU,GAAA,CAAA,CAAK,CAAA;AAAA,EAC3C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,YAAA,EAAa;AAEb,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,wBAAA,EAA2B,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAA,SAAA;AAAA,OAC9C;AAAA,IACF;AACA,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AAAA,EAQO,iBAAA,GAA0B;AAC/B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,YAAY;AAC3B,MAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAG/B,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACtC,QAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MACpB;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA;AAAA,MACnC;AAEA,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACtC,QAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MACpB;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,IAAA,CAAK,WAAA,CAAY,MAAM,GAAG,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,IAC9B,CAAA;AAAA,EACF;AAAA;AAAA,EAGQ,WAAA,GAAsB;AAC5B,IAAA,MAAM,EAAE,eAAc,GAAI,IAAA;AAC1B,IAAA,IAAI,cAAc,IAAA,KAAS,MAAA;AAAQ,MAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AACrD,IAAA,OAAO,IAAA,CAAK,MAAM,KAAA,CAAM,MAAA;AAAA,MACtB,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,IAAI,MAAM,aAAA,CAAc;AAAA,KACpD;AAAA,EACF;AACF;;ACzGO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EACtC,WAAA,GAAsB;AAC9B,IAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,IAAA,OAAO,CAAA,EAAG,UAAA,CAAA,KAAA,CAAA;AAAA,EACZ;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,OAAO,eAAA,CAAgB,cAAA,EAAe,GAAI,UAAA,GAAa,SAAA;AAAA,EACzD;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AACnE,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA;AAE5C,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAEhC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,SAAA,GAAY,kBAAkB,EAAE,CAAA;AACtC,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,EAAU;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAExC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,WAAA,CAAY,MAAY,GAAA,EAAmB;AACnD,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA;AAE5C,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEnC,IAAA,oBAAA,CAAqB,YAAY;AAC/B,MAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACpC,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEpC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,SAAA,GAAY,sBAAsB,EAAE,CAAA;AAC1C,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,IAAI;AACF,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAElC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AACF;;AC3EO,SAAS,gBAAgB,KAAA,EAAoC;AAClE,EAAA,MAAM,OAAQ,KAAA,CAAqD,IAAA;AACnE,EAAA,OAAO,IAAA,IAAS,KAAA;AAClB;;;;;;;;ACCO,SAAS,0BAAA,CACd,KAAA,EACA,eAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,OAAA,CAAQ,KAAK,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,iBAAiB,aAAa,CAAA;AAC5E,EAAA,MAAA,CAAO,sBAAA,EAAuB;AAC9B,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EAAlD,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAA0C,EAAC,CAAA;AAInD;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAA0B,IAAA,CAAA;AAAA,EAAA;AAAA,EAExB,WAAA,GAAsB;AAC9B,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,sBAAA,GAA+B;AAIpC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAIvC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,IAAA,MAAM,eAAe,IAAA,CAAK,QAAA;AAE1B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,EAAM,IAAA,KAAS;AAC3B,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AACxC,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,QAAA,IAAA,CAAK,QAAA,GAAW,gBAAgB,gBAAA,EAAiB;AAAA,MACnD;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,IAAA,EAAM,IAAA,KAAS;AAC9B,MAAA,IAAI,IAAA,KAAS,SAAS,IAAA,EAAM;AAC1B,QAAA,MAAM,MAAA,GAAS,gBAAgB,gBAAA,EAAiB;AAChD,QAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,QAAA,eAAA,CAAgB,oBAAA;AAAA,UACd,OAAA,CAAQ,GAAA;AAAA,UACR,IAAA,CAAK,WAAW,IAAI;AAAA,SACtB;AACA,QAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,UAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAAA,QACjD;AAEA,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB;AACA,MAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,UAAkB,MAAA,EAAsB;AACnE,IAAA,eAAA,CAAgB,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA;AAAA,MACR,2BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,eAAA,CAAgB,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,yBAAA,EAA2B,MAAM,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AACnE,IAAA,MAAM,EAAE,eAAc,GAAI,IAAA;AAC1B,IAAA,IAAI,aAAA,CAAc,SAAS,OAAA,EAAS;AAClC,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,GAAA,EAAK,cAAc,KAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,EAAQ;AACtC,MAAA,MAAM,KAAK,MAAA,EAAO;AAAA,IACpB;AAEA,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAChC,IAAA,MAAM,KAAK,GAAA,EAAI;AACf,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAE/B,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEU,WAAA,CAAY,MAAY,GAAA,EAAmB;AACnD,IAAA,MAAM,EAAE,eAAc,GAAI,IAAA;AAC1B,IAAA,IAAI,aAAA,CAAc,SAAS,OAAA,EAAS;AAClC,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,EAAK,aAAA,CAAc,KAAK,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,EAAQ;AACtC,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EACtC;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,kCAAkC,IAAA,EAAkB;AAG1D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,MAAA,EAAQ;AACtC,MAAA,gBAAA;AAAA,QACE,KAAK,aAAA,CAAc,WAAA;AAAA,QACnB,IAAA,CAAK,MAAA,EAAQ,OAAA,CAAQ,OAAA,IAAW;AAAC,OACnC;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAClD;AAAA,EAEQ,uBAAA,CAAwB,MAAY,OAAA,EAA6B;AACvE,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEQ,aAAa,IAAA,EAAkB;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAAsC,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5E;AAAA,EAEQ,yBAAA,CAA0B,MAAY,MAAA,EAA4B;AACxE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,GACzB,IAAA,CAAK,oBAAoB,wBAAA,GAC1B,CAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,sCAAA;AAAA,MACZ,MAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK;AAAA,MAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,QAC/B,aAAa,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,QAC7C,iBAAA,EAAmB,IAAA;AAAA;AAAA,QACnB,cAAA,EACE,KAAK,MAAA,IAAU,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI;AAAA,OAC/D;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,6BAA6B,CAAA;AAAA,EAC3D;AAAA,EAEQ,oBAAoB,OAAA,EAA0B;AAEpD,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,IACpB;AAGA,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,oBAAA,CAAqB,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAA,SAAA;AAAA,KACnE;AACA,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AACF;AAEA,MAAM,wBAAA,GAA2B,EAAA;AAEjC,SAAS,sCAAA,CACP,QACA,gBAAA,EACgB;AAChB,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM,EAAA,EAAI,OAAA,KAAY,MAAA,CAAO,OAAA;AAE/C,EAAA,MAAM,aAAA,GAAgB,gBAAgB,OAAO,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,EAAE,CAAA;AAEzB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,kBAAA,EAAoB,oBAAA,EAAqB,GACxE,kBAAA,CAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IAClC,cAAA,EAAgB,CAAA;AAAA;AAAA,IAChB,QAAQ,aAAA,CAAc,MAAA;AAAA,IACtB,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA,EAAc;AAAA,GAChB;AACF;;ACrOA,aAAA,EAAc;AAEP,SAAS,YAAA,CACd,KAAA,EACA,OAAA,GAA2B,EAAC,EACrB;AACP,EAAA,MAAM,qBAAqB,qBAAA,EAAsB;AACjD,EAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,eAAe,CAAC,CAAA;AACxC,EAAA,MAAM,iBAAiB,iBAAA,EAAkB;AAGzC,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,uBAAuB,KAAK,CAAA;AAChD,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA;AACrB,EAAA,KAAA,CAAM,GAAA,GAAM,CAAC,IAAA,EAAM,EAAA,EAAI,IAAA,KAAU;AAC/B,IAAA,MAAM,WAAA,GAAc,eAAe,CAAC,CAAA;AACpC,IAAA,IAAI,GAAA,GAAM,WAAA;AACV,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,GAAA,IAAO,KAAK,KAAA,CAAM,IAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,GAAA,IAAO,CAAA,EAAA,EAAK,IAAA,CAAA,CAAA;AACZ,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AACpB,IAAA,WAAA,CAAY,IAAI,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;AAM1C,IAAA,MAAM,YAAA,GACJ,cAAA,KAAmB,UAAA,GAAa,qBAAA,CAAsB,EAAE,CAAA,GAAI,EAAA;AAC9D,IAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,EAAM,cAAc,IAAI,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AACxC,IAAA,0BAAA,CAA2B,KAAA,EAAO,iBAAiB,OAAO,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,iBACpB,IAAA,EACmC;AACnC,EAAA,IAAI,CAAC,eAAA,CAAgB,cAAA,EAAe,EAAG;AACrC,IAAA,OAAA,CAAQ,KAAK,6DAA6D,CAAA;AAE1E,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,QAAA,EAAS;AAAA,EACrC;AAEA,EAAA,OAAO,MAAM,gBAAA,CAAiB,gBAAA,CAAiB,IAAI,CAAA;AACrD;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codspeed/tinybench-plugin",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0-beta.0",
|
|
4
4
|
"description": "tinybench compatibility layer for CodSpeed",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"codspeed",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"vitest": "^3.2.4"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@codspeed/core": "^
|
|
33
|
+
"@codspeed/core": "^7.0.0-beta.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"tinybench": ">=4.0.1"
|