UNPKG

@codspeed/tinybench-plugin

Version:

tinybench compatibility layer for CodSpeed

1 lines 28.6 kB
{"version":3,"file":"index.cjs","sources":["../../../node_modules/.pnpm/stack-trace@1.0.0-pre2/node_modules/stack-trace/index.js","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\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 { 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 Benchmark as CodspeedBenchmark,\n type BenchmarkStats,\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 getCodspeedRunnerMode,\n getGitDir,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport path from \"path\";\nimport { get as getStackTrace } from \"stack-trace\";\nimport { Bench } from \"tinybench\";\nimport { fileURLToPath } from \"url\";\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();\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();\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\nfunction getCallingFile(): string {\n const stack = getStackTrace();\n let callingFile = stack[2].getFileName(); // [here, withCodSpeed, actual caller]\n const gitDir = getGitDir(callingFile);\n if (gitDir === undefined) {\n throw new Error(\"Could not find a git repository\");\n }\n if (callingFile.startsWith(\"file://\")) {\n callingFile = fileURLToPath(callingFile);\n }\n return path.relative(gitDir, callingFile);\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","getInstrumentMode","getStackTrace","getGitDir","fileURLToPath"],"mappings":"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","x_google_ignoreList":[0]}