@codspeed/tinybench-plugin 5.5.0 → 5.7.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 +118 -62
- package/dist/index.cjs.map +1 -1
- package/dist/index.es5.js +119 -63
- package/dist/index.es5.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@codspeed/core');
|
|
4
4
|
|
|
5
|
+
const taskDataMap = /* @__PURE__ */ new WeakMap();
|
|
6
|
+
function getOrCreateTaskDataMap(bench) {
|
|
7
|
+
let map = taskDataMap.get(bench);
|
|
8
|
+
if (!map) {
|
|
9
|
+
map = /* @__PURE__ */ new Map();
|
|
10
|
+
taskDataMap.set(bench, map);
|
|
11
|
+
}
|
|
12
|
+
return map;
|
|
13
|
+
}
|
|
14
|
+
function getTaskData(bench, taskName) {
|
|
15
|
+
return taskDataMap.get(bench)?.get(taskName);
|
|
16
|
+
}
|
|
17
|
+
|
|
5
18
|
const taskUriMap = /* @__PURE__ */ new WeakMap();
|
|
6
19
|
function getTaskUri(bench, taskName, rootCallingFile) {
|
|
7
20
|
const uriMap = taskUriMap.get(bench);
|
|
@@ -35,12 +48,21 @@ class BaseBenchRunner {
|
|
|
35
48
|
}
|
|
36
49
|
logStart() {
|
|
37
50
|
console.log(
|
|
38
|
-
`[CodSpeed] running with @codspeed/tinybench v${"5.
|
|
51
|
+
`[CodSpeed] running with @codspeed/tinybench v${"5.7.0"} (${this.getModeName()})`
|
|
39
52
|
);
|
|
40
53
|
}
|
|
41
54
|
getTaskUri(task) {
|
|
42
55
|
return getTaskUri(this.bench, task.name, this.rootCallingFile);
|
|
43
56
|
}
|
|
57
|
+
getTaskData(task) {
|
|
58
|
+
const data = getTaskData(this.bench, task.name);
|
|
59
|
+
if (!data) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`[CodSpeed] No captured function found for task "${task.name}"`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
44
66
|
logTaskCompletion(uri, status) {
|
|
45
67
|
console.log(`[CodSpeed] ${status} ${uri}`);
|
|
46
68
|
}
|
|
@@ -49,20 +71,6 @@ class BaseBenchRunner {
|
|
|
49
71
|
console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);
|
|
50
72
|
return this.bench.tasks;
|
|
51
73
|
}
|
|
52
|
-
wrapWithInstrumentHooks(fn, uri) {
|
|
53
|
-
core.InstrumentHooks.startBenchmark();
|
|
54
|
-
const result = fn();
|
|
55
|
-
core.InstrumentHooks.stopBenchmark();
|
|
56
|
-
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
57
|
-
return result;
|
|
58
|
-
}
|
|
59
|
-
async wrapWithInstrumentHooksAsync(fn, uri) {
|
|
60
|
-
core.InstrumentHooks.startBenchmark();
|
|
61
|
-
const result = await fn();
|
|
62
|
-
core.InstrumentHooks.stopBenchmark();
|
|
63
|
-
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
74
|
setupBenchMethods() {
|
|
67
75
|
this.bench.run = async () => {
|
|
68
76
|
this.setupBenchRun();
|
|
@@ -95,19 +103,8 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
95
103
|
taskCompletionMessage() {
|
|
96
104
|
return core.InstrumentHooks.isInstrumented() ? "Measured" : "Checked";
|
|
97
105
|
}
|
|
98
|
-
wrapFunctionWithFrame(fn, isAsync) {
|
|
99
|
-
if (isAsync) {
|
|
100
|
-
return async function __codspeed_root_frame__() {
|
|
101
|
-
await fn();
|
|
102
|
-
};
|
|
103
|
-
} else {
|
|
104
|
-
return function __codspeed_root_frame__() {
|
|
105
|
-
fn();
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
106
|
async runTaskAsync(task, uri) {
|
|
110
|
-
const { fnOpts, fn } = task;
|
|
107
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
111
108
|
await fnOpts?.beforeAll?.call(task, "run");
|
|
112
109
|
await core.optimizeFunction(async () => {
|
|
113
110
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
@@ -117,20 +114,37 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
117
114
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
118
115
|
await core.mongoMeasurement.start(uri);
|
|
119
116
|
global.gc?.();
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
117
|
+
const rootFrame = core.wrapWithRootFrame(fn);
|
|
118
|
+
core.InstrumentHooks.startBenchmark();
|
|
119
|
+
try {
|
|
120
|
+
await rootFrame();
|
|
121
|
+
} finally {
|
|
122
|
+
core.InstrumentHooks.stopBenchmark();
|
|
123
|
+
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
124
|
+
}
|
|
124
125
|
await core.mongoMeasurement.stop(uri);
|
|
125
126
|
await fnOpts?.afterEach?.call(task, "run");
|
|
126
127
|
await fnOpts?.afterAll?.call(task, "run");
|
|
127
128
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
128
129
|
}
|
|
129
130
|
runTaskSync(task, uri) {
|
|
130
|
-
const { fnOpts, fn } = task;
|
|
131
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
131
132
|
fnOpts?.beforeAll?.call(task, "run");
|
|
133
|
+
core.optimizeFunctionSync(async () => {
|
|
134
|
+
fnOpts?.beforeEach?.call(task, "run");
|
|
135
|
+
await fn();
|
|
136
|
+
fnOpts?.afterEach?.call(task, "run");
|
|
137
|
+
});
|
|
132
138
|
fnOpts?.beforeEach?.call(task, "run");
|
|
133
|
-
|
|
139
|
+
global.gc?.();
|
|
140
|
+
const rootFrame = core.wrapWithRootFrameSync(fn);
|
|
141
|
+
core.InstrumentHooks.startBenchmark();
|
|
142
|
+
try {
|
|
143
|
+
rootFrame();
|
|
144
|
+
} finally {
|
|
145
|
+
core.InstrumentHooks.stopBenchmark();
|
|
146
|
+
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
147
|
+
}
|
|
134
148
|
fnOpts?.afterEach?.call(task, "run");
|
|
135
149
|
fnOpts?.afterAll?.call(task, "run");
|
|
136
150
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
@@ -143,40 +157,92 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
143
157
|
}
|
|
144
158
|
}
|
|
145
159
|
|
|
160
|
+
function getBenchOptions(bench) {
|
|
161
|
+
const opts = bench.opts;
|
|
162
|
+
return opts ?? bench;
|
|
163
|
+
}
|
|
164
|
+
|
|
146
165
|
var __defProp = Object.defineProperty;
|
|
147
166
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
148
167
|
var __publicField = (obj, key, value) => {
|
|
149
|
-
__defNormalProp(obj, key + "" , value);
|
|
168
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
150
169
|
return value;
|
|
151
170
|
};
|
|
152
171
|
function setupCodspeedWalltimeBench(bench, rootCallingFile) {
|
|
153
172
|
const runner = new WalltimeBenchRunner(bench, rootCallingFile);
|
|
173
|
+
runner.installInstrumentHooks();
|
|
154
174
|
runner.setupBenchMethods();
|
|
155
175
|
}
|
|
156
176
|
class WalltimeBenchRunner extends BaseBenchRunner {
|
|
157
177
|
constructor() {
|
|
158
178
|
super(...arguments);
|
|
159
179
|
__publicField(this, "codspeedBenchmarks", []);
|
|
180
|
+
// Carries the window start timestamp from the setup hook to the teardown
|
|
181
|
+
// hook. Tasks run strictly sequentially, so a single field is enough.
|
|
182
|
+
__publicField(this, "runStart", null);
|
|
160
183
|
}
|
|
161
184
|
getModeName() {
|
|
162
185
|
return "walltime mode";
|
|
163
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Drive the instrumentation window from the task's setup/teardown hooks so it
|
|
189
|
+
* brackets only tinybench's measured loop, excluding warmup and the
|
|
190
|
+
* statistics computation (`processRunResult`) that surround it. The user's
|
|
191
|
+
* own hooks are preserved and still run in their original order relative to
|
|
192
|
+
* the work under test.
|
|
193
|
+
*/
|
|
194
|
+
installInstrumentHooks() {
|
|
195
|
+
const opts = getBenchOptions(this.bench);
|
|
196
|
+
opts.retainSamples = true;
|
|
197
|
+
const userSetup = opts.setup;
|
|
198
|
+
const userTeardown = opts.teardown;
|
|
199
|
+
opts.setup = (task, mode) => {
|
|
200
|
+
const setupResult = userSetup(task, mode);
|
|
201
|
+
if (mode === "run") {
|
|
202
|
+
core.InstrumentHooks.startBenchmark();
|
|
203
|
+
this.runStart = core.InstrumentHooks.currentTimestamp();
|
|
204
|
+
}
|
|
205
|
+
return setupResult;
|
|
206
|
+
};
|
|
207
|
+
opts.teardown = (task, mode) => {
|
|
208
|
+
if (mode === "run" && task) {
|
|
209
|
+
const runEnd = core.InstrumentHooks.currentTimestamp();
|
|
210
|
+
core.InstrumentHooks.stopBenchmark();
|
|
211
|
+
core.InstrumentHooks.setExecutedBenchmark(
|
|
212
|
+
process.pid,
|
|
213
|
+
this.getTaskUri(task)
|
|
214
|
+
);
|
|
215
|
+
if (this.runStart !== null) {
|
|
216
|
+
this.sendBenchmarkMarkers(this.runStart, runEnd);
|
|
217
|
+
}
|
|
218
|
+
this.runStart = null;
|
|
219
|
+
}
|
|
220
|
+
return userTeardown(task, mode);
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
sendBenchmarkMarkers(runStart, runEnd) {
|
|
224
|
+
core.InstrumentHooks.addMarker(
|
|
225
|
+
process.pid,
|
|
226
|
+
core.MARKER_TYPE_BENCHMARK_START,
|
|
227
|
+
runStart
|
|
228
|
+
);
|
|
229
|
+
core.InstrumentHooks.addMarker(process.pid, core.MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
230
|
+
}
|
|
164
231
|
async runTaskAsync(task, uri) {
|
|
165
|
-
this.
|
|
166
|
-
if (this.bench.opts.warmup) {
|
|
232
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
167
233
|
await task.warmup();
|
|
168
234
|
}
|
|
169
235
|
await core.mongoMeasurement.start(uri);
|
|
170
|
-
await
|
|
236
|
+
await task.run();
|
|
171
237
|
await core.mongoMeasurement.stop(uri);
|
|
172
238
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
173
239
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (this.bench.
|
|
177
|
-
task.
|
|
240
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
241
|
+
runTaskSync(task, _uri) {
|
|
242
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
243
|
+
task.warmupSync();
|
|
178
244
|
}
|
|
179
|
-
|
|
245
|
+
task.runSync();
|
|
180
246
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
181
247
|
}
|
|
182
248
|
finalizeAsyncRun() {
|
|
@@ -185,27 +251,14 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
185
251
|
finalizeSyncRun() {
|
|
186
252
|
return this.finalizeWalltimeRun(false);
|
|
187
253
|
}
|
|
188
|
-
wrapTaskFunction(task, isAsync) {
|
|
189
|
-
const { fn } = task;
|
|
190
|
-
if (isAsync) {
|
|
191
|
-
async function __codspeed_root_frame__2() {
|
|
192
|
-
await fn();
|
|
193
|
-
}
|
|
194
|
-
task.fn = __codspeed_root_frame__2;
|
|
195
|
-
} else {
|
|
196
|
-
let __codspeed_root_frame__2 = function() {
|
|
197
|
-
fn();
|
|
198
|
-
};
|
|
199
|
-
task.fn = __codspeed_root_frame__2;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
254
|
registerCodspeedBenchmarkFromTask(task) {
|
|
203
255
|
const uri = this.getTaskUri(task);
|
|
204
256
|
if (!task.result) {
|
|
205
257
|
console.warn(` \u26A0 No result data available for ${uri}`);
|
|
206
258
|
return;
|
|
207
259
|
}
|
|
208
|
-
const
|
|
260
|
+
const opts = getBenchOptions(this.bench);
|
|
261
|
+
const warmupIterations = opts.warmup ? opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT : 0;
|
|
209
262
|
const stats = convertTinybenchResultToBenchmarkStats(
|
|
210
263
|
task.result,
|
|
211
264
|
warmupIterations
|
|
@@ -214,11 +267,11 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
214
267
|
name: task.name,
|
|
215
268
|
uri,
|
|
216
269
|
config: {
|
|
217
|
-
max_rounds:
|
|
218
|
-
max_time_ns:
|
|
270
|
+
max_rounds: opts.iterations ?? null,
|
|
271
|
+
max_time_ns: opts.time ? core.msToNs(opts.time) : null,
|
|
219
272
|
min_round_time_ns: null,
|
|
220
273
|
// tinybench does not have an option for this
|
|
221
|
-
warmup_time_ns:
|
|
274
|
+
warmup_time_ns: opts.warmup && opts.warmupTime ? core.msToNs(opts.warmupTime) : null
|
|
222
275
|
},
|
|
223
276
|
stats
|
|
224
277
|
});
|
|
@@ -266,7 +319,9 @@ function withCodSpeed(bench) {
|
|
|
266
319
|
return bench;
|
|
267
320
|
}
|
|
268
321
|
const rootCallingFile = core.getCallingFile(1);
|
|
322
|
+
const instrumentMode = core.getInstrumentMode();
|
|
269
323
|
const uriMap = getOrCreateUriMap(bench);
|
|
324
|
+
const taskDataMap = getOrCreateTaskDataMap(bench);
|
|
270
325
|
const rawAdd = bench.add;
|
|
271
326
|
bench.add = (name, fn, opts) => {
|
|
272
327
|
const callingFile = core.getCallingFile(1);
|
|
@@ -276,9 +331,10 @@ function withCodSpeed(bench) {
|
|
|
276
331
|
}
|
|
277
332
|
uri += `::${name}`;
|
|
278
333
|
uriMap.set(name, uri);
|
|
279
|
-
|
|
334
|
+
taskDataMap.set(name, { fn, fnOpts: opts });
|
|
335
|
+
const registeredFn = instrumentMode === "walltime" ? core.wrapWithRootFrameSync(fn) : fn;
|
|
336
|
+
return rawAdd.bind(bench)(name, registeredFn, opts);
|
|
280
337
|
};
|
|
281
|
-
const instrumentMode = core.getInstrumentMode();
|
|
282
338
|
if (instrumentMode === "analysis") {
|
|
283
339
|
setupCodspeedAnalysisBench(bench, rootCallingFile);
|
|
284
340
|
} else if (instrumentMode === "walltime") {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["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 { InstrumentHooks, setupCore, teardownCore } from \"@codspeed/core\";\nimport { Bench, Fn, Task } from \"tinybench\";\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 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 wrapWithInstrumentHooks<T>(fn: () => T, uri: string): T {\n InstrumentHooks.startBenchmark();\n const result = fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n return result;\n }\n\n protected async wrapWithInstrumentHooksAsync(\n fn: Fn,\n uri: string,\n ): Promise<unknown> {\n InstrumentHooks.startBenchmark();\n const result = await fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n return result;\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} from \"@codspeed/core\";\nimport { Bench, Fn, FnOptions, 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 private wrapFunctionWithFrame(fn: Fn, isAsync: boolean): Fn {\n if (isAsync) {\n return async function __codspeed_root_frame__() {\n await fn();\n };\n } else {\n return function __codspeed_root_frame__() {\n fn();\n };\n }\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\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 await this.wrapWithInstrumentHooksAsync(\n this.wrapFunctionWithFrame(fn, true),\n 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 } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n fnOpts?.beforeAll?.call(task, \"run\");\n fnOpts?.beforeEach?.call(task, \"run\");\n\n this.wrapWithInstrumentHooks(this.wrapFunctionWithFrame(fn, false), uri);\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 {\n calculateQuantiles,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Fn, Task, TaskResult } from \"tinybench\";\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.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, true);\n\n // run the warmup of the task right before its actual run\n if (this.bench.opts.warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await this.wrapWithInstrumentHooksAsync(() => task.run(), uri);\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, false);\n\n if (this.bench.opts.warmup) {\n task.warmup();\n }\n\n this.wrapWithInstrumentHooks(() => task.runSync(), uri);\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 wrapTaskFunction(task: Task, isAsync: boolean): void {\n const { fn } = task as unknown as { fn: Fn };\n if (isAsync) {\n // eslint-disable-next-line no-inner-declarations\n async function __codspeed_root_frame__() {\n await fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n } else {\n // eslint-disable-next-line no-inner-declarations\n function __codspeed_root_frame__() {\n fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n }\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 warmupIterations = this.bench.opts.warmup\n ? (this.bench.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: this.bench.opts.iterations ?? null,\n max_time_ns: this.bench.opts.time ? msToNs(this.bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n this.bench.opts.warmup && this.bench.opts.warmupTime\n ? msToNs(this.bench.opts.warmupTime)\n : 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} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\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\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(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 return rawAdd.bind(bench)(name, fn, opts);\n };\n\n const instrumentMode = getInstrumentMode();\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","InstrumentHooks","getCodspeedRunnerMode","optimizeFunction","mongoMeasurement","__codspeed_root_frame__","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 } 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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"}
|
package/dist/index.es5.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import { setupCore, teardownCore,
|
|
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';
|
|
2
|
+
|
|
3
|
+
const taskDataMap = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function getOrCreateTaskDataMap(bench) {
|
|
5
|
+
let map = taskDataMap.get(bench);
|
|
6
|
+
if (!map) {
|
|
7
|
+
map = /* @__PURE__ */ new Map();
|
|
8
|
+
taskDataMap.set(bench, map);
|
|
9
|
+
}
|
|
10
|
+
return map;
|
|
11
|
+
}
|
|
12
|
+
function getTaskData(bench, taskName) {
|
|
13
|
+
return taskDataMap.get(bench)?.get(taskName);
|
|
14
|
+
}
|
|
2
15
|
|
|
3
16
|
const taskUriMap = /* @__PURE__ */ new WeakMap();
|
|
4
17
|
function getTaskUri(bench, taskName, rootCallingFile) {
|
|
@@ -33,12 +46,21 @@ class BaseBenchRunner {
|
|
|
33
46
|
}
|
|
34
47
|
logStart() {
|
|
35
48
|
console.log(
|
|
36
|
-
`[CodSpeed] running with @codspeed/tinybench v${"5.
|
|
49
|
+
`[CodSpeed] running with @codspeed/tinybench v${"5.7.0"} (${this.getModeName()})`
|
|
37
50
|
);
|
|
38
51
|
}
|
|
39
52
|
getTaskUri(task) {
|
|
40
53
|
return getTaskUri(this.bench, task.name, this.rootCallingFile);
|
|
41
54
|
}
|
|
55
|
+
getTaskData(task) {
|
|
56
|
+
const data = getTaskData(this.bench, task.name);
|
|
57
|
+
if (!data) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`[CodSpeed] No captured function found for task "${task.name}"`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return data;
|
|
63
|
+
}
|
|
42
64
|
logTaskCompletion(uri, status) {
|
|
43
65
|
console.log(`[CodSpeed] ${status} ${uri}`);
|
|
44
66
|
}
|
|
@@ -47,20 +69,6 @@ class BaseBenchRunner {
|
|
|
47
69
|
console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);
|
|
48
70
|
return this.bench.tasks;
|
|
49
71
|
}
|
|
50
|
-
wrapWithInstrumentHooks(fn, uri) {
|
|
51
|
-
InstrumentHooks.startBenchmark();
|
|
52
|
-
const result = fn();
|
|
53
|
-
InstrumentHooks.stopBenchmark();
|
|
54
|
-
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
async wrapWithInstrumentHooksAsync(fn, uri) {
|
|
58
|
-
InstrumentHooks.startBenchmark();
|
|
59
|
-
const result = await fn();
|
|
60
|
-
InstrumentHooks.stopBenchmark();
|
|
61
|
-
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
62
|
-
return result;
|
|
63
|
-
}
|
|
64
72
|
setupBenchMethods() {
|
|
65
73
|
this.bench.run = async () => {
|
|
66
74
|
this.setupBenchRun();
|
|
@@ -93,19 +101,8 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
93
101
|
taskCompletionMessage() {
|
|
94
102
|
return InstrumentHooks.isInstrumented() ? "Measured" : "Checked";
|
|
95
103
|
}
|
|
96
|
-
wrapFunctionWithFrame(fn, isAsync) {
|
|
97
|
-
if (isAsync) {
|
|
98
|
-
return async function __codspeed_root_frame__() {
|
|
99
|
-
await fn();
|
|
100
|
-
};
|
|
101
|
-
} else {
|
|
102
|
-
return function __codspeed_root_frame__() {
|
|
103
|
-
fn();
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
104
|
async runTaskAsync(task, uri) {
|
|
108
|
-
const { fnOpts, fn } = task;
|
|
105
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
109
106
|
await fnOpts?.beforeAll?.call(task, "run");
|
|
110
107
|
await optimizeFunction(async () => {
|
|
111
108
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
@@ -115,20 +112,37 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
115
112
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
116
113
|
await mongoMeasurement.start(uri);
|
|
117
114
|
global.gc?.();
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
115
|
+
const rootFrame = wrapWithRootFrame(fn);
|
|
116
|
+
InstrumentHooks.startBenchmark();
|
|
117
|
+
try {
|
|
118
|
+
await rootFrame();
|
|
119
|
+
} finally {
|
|
120
|
+
InstrumentHooks.stopBenchmark();
|
|
121
|
+
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
122
|
+
}
|
|
122
123
|
await mongoMeasurement.stop(uri);
|
|
123
124
|
await fnOpts?.afterEach?.call(task, "run");
|
|
124
125
|
await fnOpts?.afterAll?.call(task, "run");
|
|
125
126
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
126
127
|
}
|
|
127
128
|
runTaskSync(task, uri) {
|
|
128
|
-
const { fnOpts, fn } = task;
|
|
129
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
129
130
|
fnOpts?.beforeAll?.call(task, "run");
|
|
131
|
+
optimizeFunctionSync(async () => {
|
|
132
|
+
fnOpts?.beforeEach?.call(task, "run");
|
|
133
|
+
await fn();
|
|
134
|
+
fnOpts?.afterEach?.call(task, "run");
|
|
135
|
+
});
|
|
130
136
|
fnOpts?.beforeEach?.call(task, "run");
|
|
131
|
-
|
|
137
|
+
global.gc?.();
|
|
138
|
+
const rootFrame = wrapWithRootFrameSync(fn);
|
|
139
|
+
InstrumentHooks.startBenchmark();
|
|
140
|
+
try {
|
|
141
|
+
rootFrame();
|
|
142
|
+
} finally {
|
|
143
|
+
InstrumentHooks.stopBenchmark();
|
|
144
|
+
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
145
|
+
}
|
|
132
146
|
fnOpts?.afterEach?.call(task, "run");
|
|
133
147
|
fnOpts?.afterAll?.call(task, "run");
|
|
134
148
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
@@ -141,40 +155,92 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
141
155
|
}
|
|
142
156
|
}
|
|
143
157
|
|
|
158
|
+
function getBenchOptions(bench) {
|
|
159
|
+
const opts = bench.opts;
|
|
160
|
+
return opts ?? bench;
|
|
161
|
+
}
|
|
162
|
+
|
|
144
163
|
var __defProp = Object.defineProperty;
|
|
145
164
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
146
165
|
var __publicField = (obj, key, value) => {
|
|
147
|
-
__defNormalProp(obj, key + "" , value);
|
|
166
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
148
167
|
return value;
|
|
149
168
|
};
|
|
150
169
|
function setupCodspeedWalltimeBench(bench, rootCallingFile) {
|
|
151
170
|
const runner = new WalltimeBenchRunner(bench, rootCallingFile);
|
|
171
|
+
runner.installInstrumentHooks();
|
|
152
172
|
runner.setupBenchMethods();
|
|
153
173
|
}
|
|
154
174
|
class WalltimeBenchRunner extends BaseBenchRunner {
|
|
155
175
|
constructor() {
|
|
156
176
|
super(...arguments);
|
|
157
177
|
__publicField(this, "codspeedBenchmarks", []);
|
|
178
|
+
// Carries the window start timestamp from the setup hook to the teardown
|
|
179
|
+
// hook. Tasks run strictly sequentially, so a single field is enough.
|
|
180
|
+
__publicField(this, "runStart", null);
|
|
158
181
|
}
|
|
159
182
|
getModeName() {
|
|
160
183
|
return "walltime mode";
|
|
161
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Drive the instrumentation window from the task's setup/teardown hooks so it
|
|
187
|
+
* brackets only tinybench's measured loop, excluding warmup and the
|
|
188
|
+
* statistics computation (`processRunResult`) that surround it. The user's
|
|
189
|
+
* own hooks are preserved and still run in their original order relative to
|
|
190
|
+
* the work under test.
|
|
191
|
+
*/
|
|
192
|
+
installInstrumentHooks() {
|
|
193
|
+
const opts = getBenchOptions(this.bench);
|
|
194
|
+
opts.retainSamples = true;
|
|
195
|
+
const userSetup = opts.setup;
|
|
196
|
+
const userTeardown = opts.teardown;
|
|
197
|
+
opts.setup = (task, mode) => {
|
|
198
|
+
const setupResult = userSetup(task, mode);
|
|
199
|
+
if (mode === "run") {
|
|
200
|
+
InstrumentHooks.startBenchmark();
|
|
201
|
+
this.runStart = InstrumentHooks.currentTimestamp();
|
|
202
|
+
}
|
|
203
|
+
return setupResult;
|
|
204
|
+
};
|
|
205
|
+
opts.teardown = (task, mode) => {
|
|
206
|
+
if (mode === "run" && task) {
|
|
207
|
+
const runEnd = InstrumentHooks.currentTimestamp();
|
|
208
|
+
InstrumentHooks.stopBenchmark();
|
|
209
|
+
InstrumentHooks.setExecutedBenchmark(
|
|
210
|
+
process.pid,
|
|
211
|
+
this.getTaskUri(task)
|
|
212
|
+
);
|
|
213
|
+
if (this.runStart !== null) {
|
|
214
|
+
this.sendBenchmarkMarkers(this.runStart, runEnd);
|
|
215
|
+
}
|
|
216
|
+
this.runStart = null;
|
|
217
|
+
}
|
|
218
|
+
return userTeardown(task, mode);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
sendBenchmarkMarkers(runStart, runEnd) {
|
|
222
|
+
InstrumentHooks.addMarker(
|
|
223
|
+
process.pid,
|
|
224
|
+
MARKER_TYPE_BENCHMARK_START,
|
|
225
|
+
runStart
|
|
226
|
+
);
|
|
227
|
+
InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
228
|
+
}
|
|
162
229
|
async runTaskAsync(task, uri) {
|
|
163
|
-
this.
|
|
164
|
-
if (this.bench.opts.warmup) {
|
|
230
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
165
231
|
await task.warmup();
|
|
166
232
|
}
|
|
167
233
|
await mongoMeasurement.start(uri);
|
|
168
|
-
await
|
|
234
|
+
await task.run();
|
|
169
235
|
await mongoMeasurement.stop(uri);
|
|
170
236
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
171
237
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (this.bench.
|
|
175
|
-
task.
|
|
238
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
239
|
+
runTaskSync(task, _uri) {
|
|
240
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
241
|
+
task.warmupSync();
|
|
176
242
|
}
|
|
177
|
-
|
|
243
|
+
task.runSync();
|
|
178
244
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
179
245
|
}
|
|
180
246
|
finalizeAsyncRun() {
|
|
@@ -183,27 +249,14 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
183
249
|
finalizeSyncRun() {
|
|
184
250
|
return this.finalizeWalltimeRun(false);
|
|
185
251
|
}
|
|
186
|
-
wrapTaskFunction(task, isAsync) {
|
|
187
|
-
const { fn } = task;
|
|
188
|
-
if (isAsync) {
|
|
189
|
-
async function __codspeed_root_frame__2() {
|
|
190
|
-
await fn();
|
|
191
|
-
}
|
|
192
|
-
task.fn = __codspeed_root_frame__2;
|
|
193
|
-
} else {
|
|
194
|
-
let __codspeed_root_frame__2 = function() {
|
|
195
|
-
fn();
|
|
196
|
-
};
|
|
197
|
-
task.fn = __codspeed_root_frame__2;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
252
|
registerCodspeedBenchmarkFromTask(task) {
|
|
201
253
|
const uri = this.getTaskUri(task);
|
|
202
254
|
if (!task.result) {
|
|
203
255
|
console.warn(` \u26A0 No result data available for ${uri}`);
|
|
204
256
|
return;
|
|
205
257
|
}
|
|
206
|
-
const
|
|
258
|
+
const opts = getBenchOptions(this.bench);
|
|
259
|
+
const warmupIterations = opts.warmup ? opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT : 0;
|
|
207
260
|
const stats = convertTinybenchResultToBenchmarkStats(
|
|
208
261
|
task.result,
|
|
209
262
|
warmupIterations
|
|
@@ -212,11 +265,11 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
212
265
|
name: task.name,
|
|
213
266
|
uri,
|
|
214
267
|
config: {
|
|
215
|
-
max_rounds:
|
|
216
|
-
max_time_ns:
|
|
268
|
+
max_rounds: opts.iterations ?? null,
|
|
269
|
+
max_time_ns: opts.time ? msToNs(opts.time) : null,
|
|
217
270
|
min_round_time_ns: null,
|
|
218
271
|
// tinybench does not have an option for this
|
|
219
|
-
warmup_time_ns:
|
|
272
|
+
warmup_time_ns: opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null
|
|
220
273
|
},
|
|
221
274
|
stats
|
|
222
275
|
});
|
|
@@ -264,7 +317,9 @@ function withCodSpeed(bench) {
|
|
|
264
317
|
return bench;
|
|
265
318
|
}
|
|
266
319
|
const rootCallingFile = getCallingFile(1);
|
|
320
|
+
const instrumentMode = getInstrumentMode();
|
|
267
321
|
const uriMap = getOrCreateUriMap(bench);
|
|
322
|
+
const taskDataMap = getOrCreateTaskDataMap(bench);
|
|
268
323
|
const rawAdd = bench.add;
|
|
269
324
|
bench.add = (name, fn, opts) => {
|
|
270
325
|
const callingFile = getCallingFile(1);
|
|
@@ -274,9 +329,10 @@ function withCodSpeed(bench) {
|
|
|
274
329
|
}
|
|
275
330
|
uri += `::${name}`;
|
|
276
331
|
uriMap.set(name, uri);
|
|
277
|
-
|
|
332
|
+
taskDataMap.set(name, { fn, fnOpts: opts });
|
|
333
|
+
const registeredFn = instrumentMode === "walltime" ? wrapWithRootFrameSync(fn) : fn;
|
|
334
|
+
return rawAdd.bind(bench)(name, registeredFn, opts);
|
|
278
335
|
};
|
|
279
|
-
const instrumentMode = getInstrumentMode();
|
|
280
336
|
if (instrumentMode === "analysis") {
|
|
281
337
|
setupCodspeedAnalysisBench(bench, rootCallingFile);
|
|
282
338
|
} else if (instrumentMode === "walltime") {
|
package/dist/index.es5.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es5.js","sources":["../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["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 { InstrumentHooks, setupCore, teardownCore } from \"@codspeed/core\";\nimport { Bench, Fn, Task } from \"tinybench\";\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 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 wrapWithInstrumentHooks<T>(fn: () => T, uri: string): T {\n InstrumentHooks.startBenchmark();\n const result = fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n return result;\n }\n\n protected async wrapWithInstrumentHooksAsync(\n fn: Fn,\n uri: string,\n ): Promise<unknown> {\n InstrumentHooks.startBenchmark();\n const result = await fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n return result;\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} from \"@codspeed/core\";\nimport { Bench, Fn, FnOptions, 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 private wrapFunctionWithFrame(fn: Fn, isAsync: boolean): Fn {\n if (isAsync) {\n return async function __codspeed_root_frame__() {\n await fn();\n };\n } else {\n return function __codspeed_root_frame__() {\n fn();\n };\n }\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\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 await this.wrapWithInstrumentHooksAsync(\n this.wrapFunctionWithFrame(fn, true),\n 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 } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n fnOpts?.beforeAll?.call(task, \"run\");\n fnOpts?.beforeEach?.call(task, \"run\");\n\n this.wrapWithInstrumentHooks(this.wrapFunctionWithFrame(fn, false), uri);\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 {\n calculateQuantiles,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Fn, Task, TaskResult } from \"tinybench\";\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.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, true);\n\n // run the warmup of the task right before its actual run\n if (this.bench.opts.warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await this.wrapWithInstrumentHooksAsync(() => task.run(), uri);\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, false);\n\n if (this.bench.opts.warmup) {\n task.warmup();\n }\n\n this.wrapWithInstrumentHooks(() => task.runSync(), uri);\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 wrapTaskFunction(task: Task, isAsync: boolean): void {\n const { fn } = task as unknown as { fn: Fn };\n if (isAsync) {\n // eslint-disable-next-line no-inner-declarations\n async function __codspeed_root_frame__() {\n await fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n } else {\n // eslint-disable-next-line no-inner-declarations\n function __codspeed_root_frame__() {\n fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n }\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 warmupIterations = this.bench.opts.warmup\n ? (this.bench.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: this.bench.opts.iterations ?? null,\n max_time_ns: this.bench.opts.time ? msToNs(this.bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n this.bench.opts.warmup && this.bench.opts.warmupTime\n ? msToNs(this.bench.opts.warmupTime)\n : 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} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\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\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(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 return rawAdd.bind(bench)(name, fn, opts);\n };\n\n const instrumentMode = getInstrumentMode();\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","__codspeed_root_frame__"],"mappings":"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"}
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codspeed/tinybench-plugin",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.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": "^5.
|
|
33
|
+
"@codspeed/core": "^5.7.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"tinybench": ">=4.0.1"
|