@codspeed/tinybench-plugin 6.2.0-alpha.0 → 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 +16 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.es5.js +17 -11
- package/dist/index.es5.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -55,7 +55,7 @@ class BaseBenchRunner {
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
console.log(
|
|
58
|
-
`[CodSpeed] running with @codspeed/tinybench v${"
|
|
58
|
+
`[CodSpeed] running with @codspeed/tinybench v${"7.0.0-beta.0"} (${this.getModeName()})`
|
|
59
59
|
);
|
|
60
60
|
}
|
|
61
61
|
getTaskUri(task) {
|
|
@@ -261,7 +261,7 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
261
261
|
const { isolationMode } = this;
|
|
262
262
|
if (isolationMode.kind === "Forks") {
|
|
263
263
|
const samples = await core.runForks(uri, isolationMode.forks);
|
|
264
|
-
return this.
|
|
264
|
+
return this.registerForkedBenchmark(task, samples);
|
|
265
265
|
}
|
|
266
266
|
if (getBenchOptions(this.bench).warmup) {
|
|
267
267
|
await task.warmup();
|
|
@@ -275,7 +275,7 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
275
275
|
const { isolationMode } = this;
|
|
276
276
|
if (isolationMode.kind === "Forks") {
|
|
277
277
|
const samples = core.runForksSync(uri, isolationMode.forks);
|
|
278
|
-
return this.
|
|
278
|
+
return this.registerForkedBenchmark(task, samples);
|
|
279
279
|
}
|
|
280
280
|
if (getBenchOptions(this.bench).warmup) {
|
|
281
281
|
task.warmupSync();
|
|
@@ -290,21 +290,27 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
290
290
|
return this.finalizeWalltimeRun(false);
|
|
291
291
|
}
|
|
292
292
|
registerCodspeedBenchmarkFromTask(task) {
|
|
293
|
-
if (!task.result) {
|
|
294
|
-
console.warn(
|
|
295
|
-
` \u26A0 No result data available for ${this.getTaskUri(task)}`
|
|
296
|
-
);
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
293
|
if (this.isolationMode.kind === "Fork") {
|
|
300
294
|
core.writeForkSamples(
|
|
301
295
|
this.isolationMode.samplesFile,
|
|
302
|
-
task.result
|
|
296
|
+
task.result?.latency.samples ?? []
|
|
303
297
|
);
|
|
304
298
|
return;
|
|
305
299
|
}
|
|
300
|
+
if (!task.result) {
|
|
301
|
+
return this.warnNoResult(task);
|
|
302
|
+
}
|
|
306
303
|
this.registerCodspeedBenchmark(task, task.result);
|
|
307
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
|
+
}
|
|
308
314
|
registerCodspeedBenchmark(task, result) {
|
|
309
315
|
const uri = this.getTaskUri(task);
|
|
310
316
|
const opts = getBenchOptions(this.bench);
|
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, 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.registerCodspeedBenchmark(task, samplesToResult(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.registerCodspeedBenchmark(task, samplesToResult(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 if (!task.result) {\n console.warn(\n ` ⚠ No result data available for ${this.getTaskUri(task)}`,\n );\n return;\n }\n // A fork hands its samples to the parent, which reports the benchmark.\n if (this.isolationMode.kind === \"Fork\") {\n writeForkSamples(\n this.isolationMode.samplesFile,\n task.result.latency.samples,\n );\n return;\n }\n this.registerCodspeedBenchmark(task, task.result);\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","samplesToResult","runForksSync","writeForkSamples","msToNs","writeWalltimeResults","sortedSamplesNs","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.es5.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { setupCore, teardownCore, getCodspeedRunnerMode, InstrumentHooks, optimizeFunction, mongoMeasurement, wrapWithRootFrame, optimizeFunctionSync, wrapWithRootFrameSync, walltimeIsolation, MARKER_TYPE_BENCHMARK_START, MARKER_TYPE_BENCHMARK_END, runForks,
|
|
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) {
|
|
@@ -53,7 +53,7 @@ class BaseBenchRunner {
|
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
55
|
console.log(
|
|
56
|
-
`[CodSpeed] running with @codspeed/tinybench v${"
|
|
56
|
+
`[CodSpeed] running with @codspeed/tinybench v${"7.0.0-beta.0"} (${this.getModeName()})`
|
|
57
57
|
);
|
|
58
58
|
}
|
|
59
59
|
getTaskUri(task) {
|
|
@@ -259,7 +259,7 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
259
259
|
const { isolationMode } = this;
|
|
260
260
|
if (isolationMode.kind === "Forks") {
|
|
261
261
|
const samples = await runForks(uri, isolationMode.forks);
|
|
262
|
-
return this.
|
|
262
|
+
return this.registerForkedBenchmark(task, samples);
|
|
263
263
|
}
|
|
264
264
|
if (getBenchOptions(this.bench).warmup) {
|
|
265
265
|
await task.warmup();
|
|
@@ -273,7 +273,7 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
273
273
|
const { isolationMode } = this;
|
|
274
274
|
if (isolationMode.kind === "Forks") {
|
|
275
275
|
const samples = runForksSync(uri, isolationMode.forks);
|
|
276
|
-
return this.
|
|
276
|
+
return this.registerForkedBenchmark(task, samples);
|
|
277
277
|
}
|
|
278
278
|
if (getBenchOptions(this.bench).warmup) {
|
|
279
279
|
task.warmupSync();
|
|
@@ -288,21 +288,27 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
288
288
|
return this.finalizeWalltimeRun(false);
|
|
289
289
|
}
|
|
290
290
|
registerCodspeedBenchmarkFromTask(task) {
|
|
291
|
-
if (!task.result) {
|
|
292
|
-
console.warn(
|
|
293
|
-
` \u26A0 No result data available for ${this.getTaskUri(task)}`
|
|
294
|
-
);
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
291
|
if (this.isolationMode.kind === "Fork") {
|
|
298
292
|
writeForkSamples(
|
|
299
293
|
this.isolationMode.samplesFile,
|
|
300
|
-
task.result
|
|
294
|
+
task.result?.latency.samples ?? []
|
|
301
295
|
);
|
|
302
296
|
return;
|
|
303
297
|
}
|
|
298
|
+
if (!task.result) {
|
|
299
|
+
return this.warnNoResult(task);
|
|
300
|
+
}
|
|
304
301
|
this.registerCodspeedBenchmark(task, task.result);
|
|
305
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
|
+
}
|
|
306
312
|
registerCodspeedBenchmark(task, result) {
|
|
307
313
|
const uri = this.getTaskUri(task);
|
|
308
314
|
const opts = getBenchOptions(this.bench);
|
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, 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.registerCodspeedBenchmark(task, samplesToResult(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.registerCodspeedBenchmark(task, samplesToResult(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 if (!task.result) {\n console.warn(\n ` ⚠ No result data available for ${this.getTaskUri(task)}`,\n );\n return;\n }\n // A fork hands its samples to the parent, which reports the benchmark.\n if (this.isolationMode.kind === \"Fork\") {\n writeForkSamples(\n this.isolationMode.samplesFile,\n task.result.latency.samples,\n );\n return;\n }\n this.registerCodspeedBenchmark(task, task.result);\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":"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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, 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":"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"}
|
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"
|