overtake 1.1.4 → 1.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { cpus } from 'node:os';\nimport { createExecutor, ExecutorOptions, ExecutorReport } from './executor.js';\nimport { MaybePromise, StepFn, SetupFn, TeardownFn, FeedFn, ReportType, ReportTypeList, DEFAULT_CYCLES } from './types.js';\n\ndeclare global {\n const benchmark: typeof Benchmark.create;\n}\n\nexport const DEFAULT_WORKERS = cpus().length;\n\nexport const AsyncFunction = (async () => {}).constructor;\nconst BENCHMARK_URL = Symbol.for('overtake.benchmarkUrl');\n\nexport interface TargetReport<R extends ReportTypeList> {\n target: string;\n measures: MeasureReport<R>[];\n}\n\nexport interface MeasureReport<R extends ReportTypeList> {\n measure: string;\n feeds: FeedReport<R>[];\n}\n\nexport interface FeedReport<R extends ReportTypeList> {\n feed: string;\n data: ExecutorReport<R>;\n}\n\nexport const DEFAULT_REPORT_TYPES = ['ops'] as const;\nexport type DefaultReportTypes = (typeof DEFAULT_REPORT_TYPES)[number];\n\nexport class MeasureContext<TContext, TInput> {\n public pre?: StepFn<TContext, TInput>;\n public post?: StepFn<TContext, TInput>;\n\n constructor(\n public title: string,\n public run: StepFn<TContext, TInput>,\n ) {}\n}\n\nexport class Measure<TContext, TInput> {\n #ctx: MeasureContext<TContext, TInput>;\n\n constructor(ctx: MeasureContext<TContext, TInput>) {\n this.#ctx = ctx;\n }\n\n pre(fn: StepFn<TContext, TInput>): Measure<TContext, TInput> {\n this.#ctx.pre = fn;\n return this;\n }\n post(fn: StepFn<TContext, TInput>): Measure<TContext, TInput> {\n this.#ctx.post = fn;\n return this;\n }\n}\n\nexport class TargetContext<TContext, TInput> {\n public teardown?: TeardownFn<TContext>;\n public measures: MeasureContext<TContext, TInput>[] = [];\n\n constructor(\n readonly title: string,\n readonly setup?: SetupFn<MaybePromise<TContext>>,\n ) {}\n}\n\nexport class Target<TContext, TInput> {\n #ctx: TargetContext<TContext, TInput>;\n\n constructor(ctx: TargetContext<TContext, TInput>) {\n this.#ctx = ctx;\n }\n teardown(fn: TeardownFn<TContext>): Target<TContext, TInput> {\n this.#ctx.teardown = fn;\n\n return this;\n }\n measure(title: string, run: StepFn<TContext, TInput>): Measure<TContext, TInput> {\n const measure = new MeasureContext(title, run);\n this.#ctx.measures.push(measure);\n\n return new Measure(measure);\n }\n}\n\nexport class FeedContext<TInput> {\n constructor(\n readonly title: string,\n readonly fn?: FeedFn<TInput>,\n ) {}\n}\n\nexport class Benchmark<TInput> {\n #targets: TargetContext<unknown, TInput>[] = [];\n #feeds: FeedContext<TInput>[] = [];\n #executed = false;\n\n static create(title: string): Benchmark<void>;\n static create<I>(title: string, fn: FeedFn<I>): Benchmark<I>;\n static create<I>(title: string, fn?: FeedFn<I> | undefined): Benchmark<I> {\n if (fn) {\n return new Benchmark(title, fn);\n } else {\n return new Benchmark(title);\n }\n }\n\n constructor(title: string);\n constructor(title: string, fn: FeedFn<TInput>);\n constructor(title: string, fn?: FeedFn<TInput> | undefined) {\n if (fn) {\n this.feed(title, fn);\n } else {\n this.feed(title);\n }\n }\n\n feed(title: string): Benchmark<TInput | void>;\n feed<I>(title: string, fn: FeedFn<I>): Benchmark<TInput | I>;\n feed<I>(title: string, fn?: FeedFn<I> | undefined): Benchmark<TInput | I> {\n const self = this as Benchmark<TInput | I>;\n self.#feeds.push(fn ? new FeedContext(title, fn) : new FeedContext(title));\n\n return self;\n }\n\n target<TContext>(title: string): Target<void, TInput>;\n target<TContext>(title: string, setup: SetupFn<Awaited<TContext>>): Target<TContext, TInput>;\n target<TContext>(title: string, setup?: SetupFn<Awaited<TContext>> | undefined): Target<TContext, TInput> {\n const target = new TargetContext<TContext, TInput>(title, setup);\n this.#targets.push(target as TargetContext<unknown, TInput>);\n\n return new Target<TContext, TInput>(target);\n }\n\n async execute<R extends readonly ReportType[] = typeof DEFAULT_REPORT_TYPES>(options: ExecutorOptions<R>): Promise<TargetReport<R>[]> {\n const {\n workers = DEFAULT_WORKERS,\n warmupCycles = 20,\n maxCycles = DEFAULT_CYCLES,\n minCycles = 50,\n absThreshold = 1_000,\n relThreshold = 0.02,\n gcObserver = true,\n reportTypes = DEFAULT_REPORT_TYPES as unknown as R,\n } = options;\n if (this.#executed) {\n throw new Error(\"Benchmark is executed and can't be reused\");\n }\n this.#executed = true;\n const benchmarkUrl = (options as unknown as Record<symbol, unknown>)[BENCHMARK_URL];\n\n const executor = createExecutor<unknown, TInput, R>({\n workers,\n warmupCycles,\n maxCycles,\n minCycles,\n absThreshold,\n relThreshold,\n gcObserver,\n reportTypes,\n [BENCHMARK_URL]: benchmarkUrl,\n } as Required<ExecutorOptions<R>>);\n\n const reports: TargetReport<R>[] = [];\n for (const target of this.#targets) {\n const targetReport: TargetReport<R> = { target: target.title, measures: [] };\n for (const measure of target.measures) {\n const measureReport: MeasureReport<R> = { measure: measure.title, feeds: [] };\n for (const feed of this.#feeds) {\n const data = await feed.fn?.();\n executor\n .push<ExecutorReport<R>>({\n setup: target.setup,\n teardown: target.teardown,\n pre: measure.pre,\n run: measure.run,\n post: measure.post,\n data,\n })\n .then((data) => {\n measureReport.feeds.push({\n feed: feed.title,\n data,\n });\n });\n }\n targetReport.measures.push(measureReport);\n }\n reports.push(targetReport);\n }\n await executor.drain();\n executor.kill();\n\n return reports;\n }\n}\n\nexport const printSimpleReports = <R extends ReportTypeList>(reports: TargetReport<R>[]) => {\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n console.group('\\n', report.target, measure);\n for (const { feed, data } of feeds) {\n const output = Object.entries(data)\n .map(([key, report]) => `${key}: ${report.toString()}`)\n .join('; ');\n console.log(feed, output);\n }\n console.groupEnd();\n }\n }\n};\n\nexport const printTableReports = <R extends ReportTypeList>(reports: TargetReport<R>[]) => {\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n console.log('\\n', report.target, measure);\n const table: Record<string, unknown> = {};\n for (const { feed, data } of feeds) {\n table[feed] = Object.fromEntries(Object.entries(data).map(([key, report]) => [key, report.toString()]));\n }\n console.table(table);\n }\n }\n};\n\nexport const printJSONReports = <R extends ReportTypeList>(reports: TargetReport<R>[], padding?: number) => {\n const output = {} as Record<string, Record<string, Record<string, string>>>;\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n const row = {} as Record<string, Record<string, string>>;\n for (const { feed, data } of feeds) {\n row[feed] = Object.fromEntries(Object.entries(data).map(([key, report]) => [key, report.toString()]));\n }\n output[`${report.target} ${measure}`] = row;\n }\n }\n console.log(JSON.stringify(output, null, padding));\n};\n"],"names":["cpus","createExecutor","DEFAULT_CYCLES","DEFAULT_WORKERS","length","AsyncFunction","BENCHMARK_URL","Symbol","for","DEFAULT_REPORT_TYPES","MeasureContext","pre","post","title","run","Measure","ctx","fn","TargetContext","teardown","measures","setup","Target","measure","push","FeedContext","Benchmark","create","feed","self","target","execute","options","workers","warmupCycles","maxCycles","minCycles","absThreshold","relThreshold","gcObserver","reportTypes","Error","benchmarkUrl","executor","reports","targetReport","measureReport","feeds","data","then","drain","kill","printSimpleReports","report","console","group","output","Object","entries","map","key","toString","join","log","groupEnd","printTableReports","table","fromEntries","printJSONReports","padding","row","JSON","stringify"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { cpus } from 'node:os';\nimport Progress from 'progress';\nimport { createExecutor, ExecutorOptions, ExecutorReport } from './executor.js';\nimport { MaybePromise, StepFn, SetupFn, TeardownFn, FeedFn, ReportType, ReportTypeList, DEFAULT_CYCLES, ProgressInfo } from './types.js';\n\ndeclare global {\n const benchmark: typeof Benchmark.create;\n}\n\nexport const DEFAULT_WORKERS = cpus().length;\n\nexport const AsyncFunction = (async () => {}).constructor;\nconst BENCHMARK_URL = Symbol.for('overtake.benchmarkUrl');\n\nexport interface TargetReport<R extends ReportTypeList> {\n target: string;\n measures: MeasureReport<R>[];\n}\n\nexport interface MeasureReport<R extends ReportTypeList> {\n measure: string;\n feeds: FeedReport<R>[];\n}\n\nexport interface FeedReport<R extends ReportTypeList> {\n feed: string;\n data: ExecutorReport<R>;\n}\n\nexport const DEFAULT_REPORT_TYPES = ['ops'] as const;\nexport type DefaultReportTypes = (typeof DEFAULT_REPORT_TYPES)[number];\n\nexport class MeasureContext<TContext, TInput> {\n public pre?: StepFn<TContext, TInput>;\n public post?: StepFn<TContext, TInput>;\n\n constructor(\n public title: string,\n public run: StepFn<TContext, TInput>,\n ) {}\n}\n\nexport class Measure<TContext, TInput> {\n #ctx: MeasureContext<TContext, TInput>;\n\n constructor(ctx: MeasureContext<TContext, TInput>) {\n this.#ctx = ctx;\n }\n\n pre(fn: StepFn<TContext, TInput>): Measure<TContext, TInput> {\n this.#ctx.pre = fn;\n return this;\n }\n post(fn: StepFn<TContext, TInput>): Measure<TContext, TInput> {\n this.#ctx.post = fn;\n return this;\n }\n}\n\nexport class TargetContext<TContext, TInput> {\n public teardown?: TeardownFn<TContext>;\n public measures: MeasureContext<TContext, TInput>[] = [];\n\n constructor(\n readonly title: string,\n readonly setup?: SetupFn<MaybePromise<TContext>>,\n ) {}\n}\n\nexport class Target<TContext, TInput> {\n #ctx: TargetContext<TContext, TInput>;\n\n constructor(ctx: TargetContext<TContext, TInput>) {\n this.#ctx = ctx;\n }\n teardown(fn: TeardownFn<TContext>): Target<TContext, TInput> {\n this.#ctx.teardown = fn;\n\n return this;\n }\n measure(title: string, run: StepFn<TContext, TInput>): Measure<TContext, TInput> {\n const measure = new MeasureContext(title, run);\n this.#ctx.measures.push(measure);\n\n return new Measure(measure);\n }\n}\n\nexport class FeedContext<TInput> {\n constructor(\n readonly title: string,\n readonly fn?: FeedFn<TInput>,\n ) {}\n}\n\nexport class Benchmark<TInput> {\n #targets: TargetContext<unknown, TInput>[] = [];\n #feeds: FeedContext<TInput>[] = [];\n #executed = false;\n\n static create(title: string): Benchmark<void>;\n static create<I>(title: string, fn: FeedFn<I>): Benchmark<I>;\n static create<I>(title: string, fn?: FeedFn<I> | undefined): Benchmark<I> {\n if (fn) {\n return new Benchmark(title, fn);\n } else {\n return new Benchmark(title);\n }\n }\n\n constructor(title: string);\n constructor(title: string, fn: FeedFn<TInput>);\n constructor(title: string, fn?: FeedFn<TInput> | undefined) {\n if (fn) {\n this.feed(title, fn);\n } else {\n this.feed(title);\n }\n }\n\n feed(title: string): Benchmark<TInput | void>;\n feed<I>(title: string, fn: FeedFn<I>): Benchmark<TInput | I>;\n feed<I>(title: string, fn?: FeedFn<I> | undefined): Benchmark<TInput | I> {\n const self = this as Benchmark<TInput | I>;\n self.#feeds.push(fn ? new FeedContext(title, fn) : new FeedContext(title));\n\n return self;\n }\n\n target<TContext>(title: string): Target<void, TInput>;\n target<TContext>(title: string, setup: SetupFn<Awaited<TContext>>): Target<TContext, TInput>;\n target<TContext>(title: string, setup?: SetupFn<Awaited<TContext>> | undefined): Target<TContext, TInput> {\n const target = new TargetContext<TContext, TInput>(title, setup);\n this.#targets.push(target as TargetContext<unknown, TInput>);\n\n return new Target<TContext, TInput>(target);\n }\n\n async execute<R extends readonly ReportType[] = typeof DEFAULT_REPORT_TYPES>(options: ExecutorOptions<R> & { progress?: boolean }): Promise<TargetReport<R>[]> {\n const {\n workers = DEFAULT_WORKERS,\n warmupCycles = 20,\n maxCycles = DEFAULT_CYCLES,\n minCycles = 50,\n absThreshold = 1_000,\n relThreshold = 0.02,\n gcObserver = true,\n reportTypes = DEFAULT_REPORT_TYPES as unknown as R,\n progress = false,\n progressInterval = 100,\n } = options;\n if (this.#executed) {\n throw new Error(\"Benchmark is executed and can't be reused\");\n }\n this.#executed = true;\n const benchmarkUrl = (options as unknown as Record<symbol, unknown>)[BENCHMARK_URL];\n\n const totalBenchmarks = this.#targets.reduce((acc, t) => acc + t.measures.length * this.#feeds.length, 0);\n const progressMap = new Map<string, number>();\n let completedBenchmarks = 0;\n let bar: Progress | null = null;\n\n if (progress && totalBenchmarks > 0) {\n bar = new Progress(' [:bar] :percent :current/:total :label', {\n total: totalBenchmarks * 100,\n width: 30,\n complete: '=',\n incomplete: ' ',\n });\n }\n\n const onProgress = progress\n ? (info: ProgressInfo) => {\n progressMap.set(info.id, info.progress);\n const totalProgress = (completedBenchmarks + [...progressMap.values()].reduce((a, b) => a + b, 0)) * 100;\n const label = info.id.length > 30 ? info.id.slice(0, 27) + '...' : info.id;\n bar?.update(totalProgress / (totalBenchmarks * 100), { label });\n }\n : undefined;\n\n const executor = createExecutor<unknown, TInput, R>({\n workers,\n warmupCycles,\n maxCycles,\n minCycles,\n absThreshold,\n relThreshold,\n gcObserver,\n reportTypes,\n onProgress,\n progressInterval,\n [BENCHMARK_URL]: benchmarkUrl,\n } as Required<ExecutorOptions<R>>);\n\n const reports: TargetReport<R>[] = [];\n for (const target of this.#targets) {\n const targetReport: TargetReport<R> = { target: target.title, measures: [] };\n for (const measure of target.measures) {\n const measureReport: MeasureReport<R> = { measure: measure.title, feeds: [] };\n for (const feed of this.#feeds) {\n const id = `${target.title}/${measure.title}/${feed.title}`;\n const data = await feed.fn?.();\n executor\n .push<ExecutorReport<R>>({\n id,\n setup: target.setup,\n teardown: target.teardown,\n pre: measure.pre,\n run: measure.run,\n post: measure.post,\n data,\n })\n .then((data) => {\n progressMap.delete(id);\n completedBenchmarks++;\n measureReport.feeds.push({\n feed: feed.title,\n data,\n });\n });\n }\n targetReport.measures.push(measureReport);\n }\n reports.push(targetReport);\n }\n await executor.drain();\n executor.kill();\n\n if (bar) {\n bar.update(1, { label: 'done' });\n bar.terminate();\n }\n\n return reports;\n }\n}\n\nexport const printSimpleReports = <R extends ReportTypeList>(reports: TargetReport<R>[]) => {\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n console.group('\\n', report.target, measure);\n for (const { feed, data } of feeds) {\n const output = Object.entries(data)\n .map(([key, report]) => `${key}: ${report.toString()}`)\n .join('; ');\n console.log(feed, output);\n }\n console.groupEnd();\n }\n }\n};\n\nexport const printTableReports = <R extends ReportTypeList>(reports: TargetReport<R>[]) => {\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n console.log('\\n', report.target, measure);\n const table: Record<string, unknown> = {};\n for (const { feed, data } of feeds) {\n table[feed] = Object.fromEntries(Object.entries(data).map(([key, report]) => [key, report.toString()]));\n }\n console.table(table);\n }\n }\n};\n\nexport const printJSONReports = <R extends ReportTypeList>(reports: TargetReport<R>[], padding?: number) => {\n const output = {} as Record<string, Record<string, Record<string, string>>>;\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n const row = {} as Record<string, Record<string, string>>;\n for (const { feed, data } of feeds) {\n row[feed] = Object.fromEntries(Object.entries(data).map(([key, report]) => [key, report.toString()]));\n }\n output[`${report.target} ${measure}`] = row;\n }\n }\n console.log(JSON.stringify(output, null, padding));\n};\n"],"names":["cpus","Progress","createExecutor","DEFAULT_CYCLES","DEFAULT_WORKERS","length","AsyncFunction","BENCHMARK_URL","Symbol","for","DEFAULT_REPORT_TYPES","MeasureContext","pre","post","title","run","Measure","ctx","fn","TargetContext","teardown","measures","setup","Target","measure","push","FeedContext","Benchmark","create","feed","self","target","execute","options","workers","warmupCycles","maxCycles","minCycles","absThreshold","relThreshold","gcObserver","reportTypes","progress","progressInterval","Error","benchmarkUrl","totalBenchmarks","reduce","acc","t","progressMap","Map","completedBenchmarks","bar","total","width","complete","incomplete","onProgress","info","set","id","totalProgress","values","a","b","label","slice","update","undefined","executor","reports","targetReport","measureReport","feeds","data","then","delete","drain","kill","terminate","printSimpleReports","report","console","group","output","Object","entries","map","key","toString","join","log","groupEnd","printTableReports","table","fromEntries","printJSONReports","padding","row","JSON","stringify"],"mappings":"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"}
package/build/runner.cjs CHANGED
@@ -67,7 +67,7 @@ const GC_STRIDE = 32;
67
67
  const OUTLIER_MULTIPLIER = 4;
68
68
  const OUTLIER_IQR_MULTIPLIER = 3;
69
69
  const OUTLIER_WINDOW = 64;
70
- const OUTLIER_ABS_THRESHOLD_NS = 10_000;
70
+ const OUTLIER_ABS_THRESHOLD = 10_000_000;
71
71
  const BASELINE_SAMPLES = 16;
72
72
  const OUTLIER_SCRATCH = new Float64Array(OUTLIER_WINDOW);
73
73
  const measureTimerOverhead = ()=>{
@@ -367,7 +367,7 @@ const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data, warmup
367
367
  } else if (postAsync) {
368
368
  await postAsync(context, input);
369
369
  }
370
- return duration;
370
+ return duration * _typescjs.DURATION_SCALE;
371
371
  };
372
372
  while(_nodeperf_hooks.performance.now() - warmupStart < 1_000 && warmupRemaining > 0){
373
373
  const duration = await runWarmup();
@@ -453,12 +453,12 @@ const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data, warmup
453
453
  if (!disableFiltering) {
454
454
  const { median, iqr } = medianAndIqr(outlierWindow);
455
455
  const maxAllowed = median + OUTLIER_IQR_MULTIPLIER * iqr || Number.POSITIVE_INFINITY;
456
- if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD_NS) {
456
+ if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD) {
457
457
  skipped++;
458
458
  continue;
459
459
  }
460
460
  const meanNumber = Number(mean);
461
- if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD_NS) {
461
+ if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD) {
462
462
  skipped++;
463
463
  continue;
464
464
  }
@@ -467,7 +467,7 @@ const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data, warmup
467
467
  const delta = sampleDuration - mean;
468
468
  mean += delta / BigInt(i);
469
469
  m2 += delta * (sampleDuration - mean);
470
- const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;
470
+ const progress = i / maxCycles * COMPLETE_VALUE;
471
471
  if (i % PROGRESS_STRIDE === 0) {
472
472
  control[_typescjs.Control.PROGRESS] = progress;
473
473
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runner.ts"],"sourcesContent":["import { performance, PerformanceObserver } from 'node:perf_hooks';\nimport { Options, Control, DURATION_SCALE } from './types.js';\nimport { GCWatcher } from './gc-watcher.js';\nimport { StepFn } from './types.js';\n\nconst COMPLETE_VALUE = 100_00;\n\nconst hr = process.hrtime.bigint.bind(process.hrtime);\n\nconst sink = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));\nconst consume = (value: unknown) => {\n let payload = 0;\n switch (typeof value) {\n case 'number':\n payload = Number.isFinite(value) ? Math.trunc(value) : 0;\n break;\n case 'bigint':\n payload = Number(value & 0xffff_ffffn);\n break;\n case 'string':\n payload = value.length;\n break;\n case 'boolean':\n payload = value ? 1 : 0;\n break;\n case 'object':\n payload = value === null ? 0 : 1;\n break;\n case 'function':\n payload = 1;\n break;\n default:\n payload = -1;\n }\n Atomics.xor(sink, 0, payload);\n};\n\nconst runSync = (run: Function, overhead: bigint) => {\n return (...args: unknown[]) => {\n const start = hr();\n const result = run(...args);\n consume(result);\n const duration = hr() - start;\n return duration > overhead ? duration - overhead : 0n;\n };\n};\n\nconst runAsync = (run: Function) => {\n return async (...args: unknown[]) => {\n const start = hr();\n const result = await run(...args);\n consume(result);\n return hr() - start;\n };\n};\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> => {\n return value !== null && (typeof value === 'object' || typeof value === 'function') && typeof (value as PromiseLike<unknown>).then === 'function';\n};\n\nconst TARGET_SAMPLE_NS = 1_000_000n; // aim for ~1ms per measured sample\nconst MAX_BATCH = 1_048_576;\nconst PROGRESS_STRIDE = 16;\nconst GC_STRIDE = 32;\nconst OUTLIER_MULTIPLIER = 4;\nconst OUTLIER_IQR_MULTIPLIER = 3;\nconst OUTLIER_WINDOW = 64;\nconst OUTLIER_ABS_THRESHOLD_NS = 10_000;\nconst BASELINE_SAMPLES = 16;\nconst OUTLIER_SCRATCH = new Float64Array(OUTLIER_WINDOW);\n\ntype GCEvent = { start: number; end: number };\ntype RunTimedSync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => bigint;\ntype RunTimedAsync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => Promise<bigint>;\n\nconst measureTimerOverhead = () => {\n let total = 0n;\n for (let i = 0; i < BASELINE_SAMPLES; i++) {\n const start = hr();\n consume(0);\n total += hr() - start;\n }\n return total / BigInt(BASELINE_SAMPLES);\n};\n\nconst collectSample = async <TContext, TInput>({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n}: {\n batchSize: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre: StepFn<TContext, TInput> | undefined;\n preIsAsync: boolean;\n post: StepFn<TContext, TInput> | undefined;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n nextNonce: (() => number) | null;\n}) => {\n const canBatchTime = !runIsAsync && !pre && !post;\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, data, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, data));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n let sampleDuration = 0n;\n for (let b = 0; b < batchSize; b++) {\n if (pre) {\n if (preIsAsync) {\n await pre(context, data);\n } else {\n pre(context, data);\n }\n }\n\n if (runIsAsync) {\n const runAsyncFn = run as RunTimedAsync<TContext, TInput>;\n const duration = nextNonce ? await runAsyncFn(context, data, nextNonce()) : await runAsyncFn(context, data);\n sampleDuration += duration;\n } else {\n const runSyncFn = run as RunTimedSync<TContext, TInput>;\n const duration = nextNonce ? runSyncFn(context, data, nextNonce()) : runSyncFn(context, data);\n sampleDuration += duration;\n }\n\n if (post) {\n if (postIsAsync) {\n await post(context, data);\n } else {\n post(context, data);\n }\n }\n }\n return (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n};\n\nconst tuneParameters = async <TContext, TInput>({\n initialBatch,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n}: {\n initialBatch: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre?: StepFn<TContext, TInput>;\n preIsAsync: boolean;\n post?: StepFn<TContext, TInput>;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n minCycles: number;\n relThreshold: number;\n maxCycles: number;\n nextNonce: (() => number) | null;\n}) => {\n let batchSize = initialBatch;\n let bestCv = Number.POSITIVE_INFINITY;\n let bestBatch = batchSize;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const samples: number[] = [];\n const sampleCount = Math.min(8, maxCycles);\n for (let s = 0; s < sampleCount; s++) {\n const duration = await collectSample({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n });\n samples.push(Number(duration));\n }\n const mean = samples.reduce((acc, v) => acc + v, 0) / samples.length;\n const variance = samples.reduce((acc, v) => acc + (v - mean) * (v - mean), 0) / Math.max(1, samples.length - 1);\n const stddev = Math.sqrt(variance);\n const cv = mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n\n if (cv < bestCv) {\n bestCv = cv;\n bestBatch = batchSize;\n }\n\n if (cv <= relThreshold || batchSize >= MAX_BATCH) {\n break;\n }\n batchSize = Math.min(MAX_BATCH, batchSize * 2);\n }\n\n const tunedRel = bestCv < relThreshold ? Math.max(bestCv * 1.5, relThreshold * 0.5) : relThreshold;\n const tunedMin = Math.min(maxCycles, Math.max(minCycles, Math.ceil(minCycles * Math.max(1, bestCv / (relThreshold || 1e-6)))));\n\n return { batchSize: bestBatch, relThreshold: tunedRel, minCycles: tunedMin };\n};\n\nconst createGCTracker = () => {\n if (process.env.OVERTAKE_GC_OBSERVER !== '1') {\n return null;\n }\n if (typeof PerformanceObserver === 'undefined') {\n return null;\n }\n\n const events: GCEvent[] = [];\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n events.push({ start: entry.startTime, end: entry.startTime + entry.duration });\n }\n });\n\n try {\n observer.observe({ entryTypes: ['gc'] });\n } catch {\n return null;\n }\n\n const overlaps = (start: number, end: number) => {\n let noisy = false;\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (event.end < start - 5_000) {\n events.splice(i, 1);\n continue;\n }\n if (event.start <= end && event.end >= start) {\n noisy = true;\n }\n }\n return noisy;\n };\n\n const dispose = () => observer.disconnect();\n\n return { overlaps, dispose };\n};\n\nconst pushWindow = (arr: number[], value: number, cap: number) => {\n if (arr.length === cap) {\n arr.shift();\n }\n arr.push(value);\n};\n\nconst medianAndIqr = (arr: number[]) => {\n if (arr.length === 0) return { median: 0, iqr: 0 };\n for (let i = 0; i < arr.length; i++) {\n OUTLIER_SCRATCH[i] = arr[i];\n }\n const view = OUTLIER_SCRATCH.subarray(0, arr.length);\n view.sort();\n const mid = Math.floor(view.length / 2);\n const median = view.length % 2 === 0 ? (view[mid - 1] + view[mid]) / 2 : view[mid];\n const q1Idx = Math.floor(view.length * 0.25);\n const q3Idx = Math.floor(view.length * 0.75);\n const q1 = view[q1Idx];\n const q3 = view[q3Idx];\n return { median, iqr: q3 - q1 };\n};\n\nconst windowCv = (arr: number[]) => {\n if (arr.length < 2) return Number.POSITIVE_INFINITY;\n const mean = arr.reduce((a, v) => a + v, 0) / arr.length;\n const variance = arr.reduce((a, v) => a + (v - mean) * (v - mean), 0) / (arr.length - 1);\n const stddev = Math.sqrt(variance);\n return mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n};\n\nexport const benchmark = async <TContext, TInput>({\n setup,\n teardown,\n pre,\n run: runRaw,\n post,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n gcObserver = false,\n\n durationsSAB,\n controlSAB,\n}: Required<Options<TContext, TInput>>) => {\n const durations = new BigUint64Array(durationsSAB);\n const control = new Int32Array(controlSAB);\n\n control[Control.INDEX] = 0;\n control[Control.PROGRESS] = 0;\n control[Control.COMPLETE] = 255;\n\n const context = (await setup?.()) as TContext;\n const input = data as TInput;\n const maxCycles = durations.length;\n const gcWatcher = gcObserver ? new GCWatcher() : null;\n const gcTracker = gcObserver ? createGCTracker() : null;\n\n try {\n // classify sync/async and capture initial duration\n let preIsAsync = false;\n if (pre) {\n const preResult = pre(context, input);\n preIsAsync = isThenable(preResult);\n if (preIsAsync) {\n await preResult;\n }\n }\n\n const probeStart = hr();\n const probeResult = runRaw(context, input);\n const runIsAsync = isThenable(probeResult);\n if (runIsAsync) {\n const resolved = await probeResult;\n consume(resolved);\n } else {\n consume(probeResult);\n }\n const durationProbeRaw = hr() - probeStart;\n\n let postIsAsync = false;\n if (post) {\n const postResult = post(context, input);\n postIsAsync = isThenable(postResult);\n if (postIsAsync) {\n await postResult;\n }\n }\n\n const timerOverhead = runIsAsync ? 0n : measureTimerOverhead();\n let durationProbe = runIsAsync ? durationProbeRaw : durationProbeRaw > timerOverhead ? durationProbeRaw - timerOverhead : 0n;\n\n const shouldPerturbInput = process.env.OVERTAKE_PERTURB_INPUT === '1';\n let nonce = 0;\n const nextNonce = shouldPerturbInput\n ? () => {\n nonce = (nonce + 1) | 0;\n return nonce;\n }\n : null;\n\n if (!runIsAsync && !pre && !post) {\n const batchProbeSize = 10_000;\n const batchProbeStart = hr();\n if (nextNonce) {\n for (let i = 0; i < batchProbeSize; i++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let i = 0; i < batchProbeSize; i++) {\n consume(runRaw(context, input));\n }\n }\n durationProbe = (hr() - batchProbeStart) / BigInt(batchProbeSize);\n }\n\n const runTimedSync = runIsAsync ? null : runSync(runRaw, timerOverhead);\n const runTimedAsync = runIsAsync ? runAsync(runRaw) : null;\n const run = runIsAsync ? runTimedAsync! : runTimedSync!;\n\n const runOnceSync: RunTimedSync<TContext, TInput> | null = runIsAsync ? null : nextNonce ? (ctx, dataValue) => runTimedSync!(ctx, dataValue, nextNonce()) : runTimedSync!;\n const runOnceAsync: RunTimedAsync<TContext, TInput> | null = runIsAsync ? (nextNonce ? (ctx, dataValue) => runTimedAsync!(ctx, dataValue, nextNonce()) : runTimedAsync!) : null;\n\n const preSync = preIsAsync ? null : pre;\n const preAsync = preIsAsync ? pre : null;\n const postSync = postIsAsync ? null : post;\n const postAsync = postIsAsync ? post : null;\n\n // choose batch size to amortize timer overhead\n const durationPerRun = durationProbe === 0n ? 1n : durationProbe;\n const suggestedBatch = Number(TARGET_SAMPLE_NS / durationPerRun);\n const minBatchForFastOps = durationProbe < 100n ? 100_000 : 1;\n const initialBatchSize = Math.min(MAX_BATCH, Math.max(minBatchForFastOps, suggestedBatch));\n\n // auto-tune based on warmup samples\n const tuned = await tuneParameters({\n initialBatch: initialBatchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data: input,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n });\n let batchSize = tuned.batchSize;\n minCycles = tuned.minCycles;\n relThreshold = tuned.relThreshold;\n\n // warmup: run until requested cycles, adapt if unstable\n const warmupStart = performance.now();\n let warmupRemaining = warmupCycles;\n const warmupWindow: number[] = [];\n const warmupCap = Math.max(warmupCycles, Math.min(maxCycles, warmupCycles * 4 || 1000));\n const canBatchTime = !runIsAsync && !preSync && !preAsync && !postSync && !postAsync;\n\n const runWarmup = async () => {\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n\n return duration;\n };\n\n while (performance.now() - warmupStart < 1_000 && warmupRemaining > 0) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupRemaining--;\n }\n let warmupDone = 0;\n while (warmupDone < warmupRemaining) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupDone++;\n if (global.gc && warmupDone % GC_STRIDE === 0) {\n global.gc();\n }\n }\n while (warmupWindow.length >= 8 && warmupWindow.length < warmupCap) {\n const cv = windowCv(warmupWindow);\n if (cv <= relThreshold * 2) {\n break;\n }\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n }\n\n let i = 0;\n let mean = 0n;\n let m2 = 0n;\n const outlierWindow: number[] = [];\n let skipped = 0;\n const maxSkipped = maxCycles * 10;\n let disableFiltering = false;\n\n while (true) {\n if (i >= maxCycles) break;\n if (!disableFiltering && skipped >= maxSkipped) {\n console.error(`Warning: ${skipped} samples skipped due to noise/outlier detection. ` + `Disabling filtering for remaining samples. Results may have higher variance.`);\n disableFiltering = true;\n }\n\n if (global.gc && i > 0 && i % GC_STRIDE === 0) {\n global.gc();\n }\n\n const gcMarker = gcWatcher?.start();\n const sampleStart = performance.now();\n let sampleDuration = 0n;\n\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n const batchDuration = hr() - batchStart;\n sampleDuration = (batchDuration * DURATION_SCALE) / BigInt(batchSize);\n } else {\n for (let b = 0; b < batchSize; b++) {\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n sampleDuration += duration;\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n }\n sampleDuration = (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n }\n\n const sampleEnd = performance.now();\n if (!disableFiltering) {\n const gcNoise = (gcMarker ? gcWatcher!.seen(gcMarker) : false) || (gcTracker?.overlaps(sampleStart, sampleEnd) ?? false);\n if (gcNoise) {\n skipped++;\n continue;\n }\n }\n\n const durationNumber = Number(sampleDuration);\n pushWindow(outlierWindow, durationNumber, OUTLIER_WINDOW);\n if (!disableFiltering) {\n const { median, iqr } = medianAndIqr(outlierWindow);\n const maxAllowed = median + OUTLIER_IQR_MULTIPLIER * iqr || Number.POSITIVE_INFINITY;\n if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD_NS) {\n skipped++;\n continue;\n }\n\n const meanNumber = Number(mean);\n if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD_NS) {\n skipped++;\n continue;\n }\n }\n\n durations[i++] = sampleDuration;\n const delta = sampleDuration - mean;\n mean += delta / BigInt(i);\n m2 += delta * (sampleDuration - mean);\n\n const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;\n if (i % PROGRESS_STRIDE === 0) {\n control[Control.PROGRESS] = progress;\n }\n\n if (i >= minCycles) {\n const variance = Number(m2) / (i - 1);\n const stddev = Math.sqrt(variance);\n if (stddev <= Number(absThreshold)) {\n break;\n }\n\n const meanNum = Number(mean);\n const cov = stddev / (meanNum || 1);\n if (cov <= relThreshold) {\n break;\n }\n }\n }\n\n control[Control.INDEX] = i;\n control[Control.COMPLETE] = 0;\n } catch (e) {\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n control[Control.COMPLETE] = 1;\n } finally {\n gcTracker?.dispose?.();\n try {\n await teardown?.(context);\n } catch (e) {\n control[Control.COMPLETE] = 2;\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n }\n }\n\n return control[Control.COMPLETE];\n};\n"],"names":["benchmark","COMPLETE_VALUE","hr","process","hrtime","bigint","bind","sink","Int32Array","SharedArrayBuffer","BYTES_PER_ELEMENT","consume","value","payload","Number","isFinite","Math","trunc","length","Atomics","xor","runSync","run","overhead","args","start","result","duration","runAsync","isThenable","then","TARGET_SAMPLE_NS","MAX_BATCH","PROGRESS_STRIDE","GC_STRIDE","OUTLIER_MULTIPLIER","OUTLIER_IQR_MULTIPLIER","OUTLIER_WINDOW","OUTLIER_ABS_THRESHOLD_NS","BASELINE_SAMPLES","OUTLIER_SCRATCH","Float64Array","measureTimerOverhead","total","i","BigInt","collectSample","batchSize","runRaw","runIsAsync","pre","preIsAsync","post","postIsAsync","context","data","nextNonce","canBatchTime","batchStart","b","DURATION_SCALE","sampleDuration","runAsyncFn","runSyncFn","tuneParameters","initialBatch","minCycles","relThreshold","maxCycles","bestCv","POSITIVE_INFINITY","bestBatch","attempt","samples","sampleCount","min","s","push","mean","reduce","acc","v","variance","max","stddev","sqrt","cv","tunedRel","tunedMin","ceil","createGCTracker","env","OVERTAKE_GC_OBSERVER","PerformanceObserver","events","observer","list","entry","getEntries","startTime","end","observe","entryTypes","overlaps","noisy","event","splice","dispose","disconnect","pushWindow","arr","cap","shift","medianAndIqr","median","iqr","view","subarray","sort","mid","floor","q1Idx","q3Idx","q1","q3","windowCv","a","setup","teardown","warmupCycles","absThreshold","gcObserver","durationsSAB","controlSAB","durations","BigUint64Array","control","Control","INDEX","PROGRESS","COMPLETE","input","gcWatcher","GCWatcher","gcTracker","preResult","probeStart","probeResult","resolved","durationProbeRaw","postResult","timerOverhead","durationProbe","shouldPerturbInput","OVERTAKE_PERTURB_INPUT","nonce","batchProbeSize","batchProbeStart","runTimedSync","runTimedAsync","runOnceSync","ctx","dataValue","runOnceAsync","preSync","preAsync","postSync","postAsync","durationPerRun","suggestedBatch","minBatchForFastOps","initialBatchSize","tuned","warmupStart","performance","now","warmupRemaining","warmupWindow","warmupCap","runWarmup","warmupDone","global","gc","m2","outlierWindow","skipped","maxSkipped","disableFiltering","console","error","gcMarker","sampleStart","batchDuration","sampleEnd","gcNoise","seen","durationNumber","maxAllowed","meanNumber","delta","progress","meanNum","cov","e","stack"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/runner.ts"],"sourcesContent":["import { performance, PerformanceObserver } from 'node:perf_hooks';\nimport { Options, Control, DURATION_SCALE } from './types.js';\nimport { GCWatcher } from './gc-watcher.js';\nimport { StepFn } from './types.js';\n\nconst COMPLETE_VALUE = 100_00;\n\nconst hr = process.hrtime.bigint.bind(process.hrtime);\n\nconst sink = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));\nconst consume = (value: unknown) => {\n let payload = 0;\n switch (typeof value) {\n case 'number':\n payload = Number.isFinite(value) ? Math.trunc(value) : 0;\n break;\n case 'bigint':\n payload = Number(value & 0xffff_ffffn);\n break;\n case 'string':\n payload = value.length;\n break;\n case 'boolean':\n payload = value ? 1 : 0;\n break;\n case 'object':\n payload = value === null ? 0 : 1;\n break;\n case 'function':\n payload = 1;\n break;\n default:\n payload = -1;\n }\n Atomics.xor(sink, 0, payload);\n};\n\nconst runSync = (run: Function, overhead: bigint) => {\n return (...args: unknown[]) => {\n const start = hr();\n const result = run(...args);\n consume(result);\n const duration = hr() - start;\n return duration > overhead ? duration - overhead : 0n;\n };\n};\n\nconst runAsync = (run: Function) => {\n return async (...args: unknown[]) => {\n const start = hr();\n const result = await run(...args);\n consume(result);\n return hr() - start;\n };\n};\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> => {\n return value !== null && (typeof value === 'object' || typeof value === 'function') && typeof (value as PromiseLike<unknown>).then === 'function';\n};\n\nconst TARGET_SAMPLE_NS = 1_000_000n; // aim for ~1ms per measured sample\nconst MAX_BATCH = 1_048_576;\nconst PROGRESS_STRIDE = 16;\nconst GC_STRIDE = 32;\nconst OUTLIER_MULTIPLIER = 4;\nconst OUTLIER_IQR_MULTIPLIER = 3;\nconst OUTLIER_WINDOW = 64;\nconst OUTLIER_ABS_THRESHOLD = 10_000_000;\nconst BASELINE_SAMPLES = 16;\nconst OUTLIER_SCRATCH = new Float64Array(OUTLIER_WINDOW);\n\ntype GCEvent = { start: number; end: number };\ntype RunTimedSync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => bigint;\ntype RunTimedAsync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => Promise<bigint>;\n\nconst measureTimerOverhead = () => {\n let total = 0n;\n for (let i = 0; i < BASELINE_SAMPLES; i++) {\n const start = hr();\n consume(0);\n total += hr() - start;\n }\n return total / BigInt(BASELINE_SAMPLES);\n};\n\nconst collectSample = async <TContext, TInput>({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n}: {\n batchSize: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre: StepFn<TContext, TInput> | undefined;\n preIsAsync: boolean;\n post: StepFn<TContext, TInput> | undefined;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n nextNonce: (() => number) | null;\n}) => {\n const canBatchTime = !runIsAsync && !pre && !post;\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, data, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, data));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n let sampleDuration = 0n;\n for (let b = 0; b < batchSize; b++) {\n if (pre) {\n if (preIsAsync) {\n await pre(context, data);\n } else {\n pre(context, data);\n }\n }\n\n if (runIsAsync) {\n const runAsyncFn = run as RunTimedAsync<TContext, TInput>;\n const duration = nextNonce ? await runAsyncFn(context, data, nextNonce()) : await runAsyncFn(context, data);\n sampleDuration += duration;\n } else {\n const runSyncFn = run as RunTimedSync<TContext, TInput>;\n const duration = nextNonce ? runSyncFn(context, data, nextNonce()) : runSyncFn(context, data);\n sampleDuration += duration;\n }\n\n if (post) {\n if (postIsAsync) {\n await post(context, data);\n } else {\n post(context, data);\n }\n }\n }\n return (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n};\n\nconst tuneParameters = async <TContext, TInput>({\n initialBatch,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n}: {\n initialBatch: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre?: StepFn<TContext, TInput>;\n preIsAsync: boolean;\n post?: StepFn<TContext, TInput>;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n minCycles: number;\n relThreshold: number;\n maxCycles: number;\n nextNonce: (() => number) | null;\n}) => {\n let batchSize = initialBatch;\n let bestCv = Number.POSITIVE_INFINITY;\n let bestBatch = batchSize;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const samples: number[] = [];\n const sampleCount = Math.min(8, maxCycles);\n for (let s = 0; s < sampleCount; s++) {\n const duration = await collectSample({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n });\n samples.push(Number(duration));\n }\n const mean = samples.reduce((acc, v) => acc + v, 0) / samples.length;\n const variance = samples.reduce((acc, v) => acc + (v - mean) * (v - mean), 0) / Math.max(1, samples.length - 1);\n const stddev = Math.sqrt(variance);\n const cv = mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n\n if (cv < bestCv) {\n bestCv = cv;\n bestBatch = batchSize;\n }\n\n if (cv <= relThreshold || batchSize >= MAX_BATCH) {\n break;\n }\n batchSize = Math.min(MAX_BATCH, batchSize * 2);\n }\n\n const tunedRel = bestCv < relThreshold ? Math.max(bestCv * 1.5, relThreshold * 0.5) : relThreshold;\n const tunedMin = Math.min(maxCycles, Math.max(minCycles, Math.ceil(minCycles * Math.max(1, bestCv / (relThreshold || 1e-6)))));\n\n return { batchSize: bestBatch, relThreshold: tunedRel, minCycles: tunedMin };\n};\n\nconst createGCTracker = () => {\n if (process.env.OVERTAKE_GC_OBSERVER !== '1') {\n return null;\n }\n if (typeof PerformanceObserver === 'undefined') {\n return null;\n }\n\n const events: GCEvent[] = [];\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n events.push({ start: entry.startTime, end: entry.startTime + entry.duration });\n }\n });\n\n try {\n observer.observe({ entryTypes: ['gc'] });\n } catch {\n return null;\n }\n\n const overlaps = (start: number, end: number) => {\n let noisy = false;\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (event.end < start - 5_000) {\n events.splice(i, 1);\n continue;\n }\n if (event.start <= end && event.end >= start) {\n noisy = true;\n }\n }\n return noisy;\n };\n\n const dispose = () => observer.disconnect();\n\n return { overlaps, dispose };\n};\n\nconst pushWindow = (arr: number[], value: number, cap: number) => {\n if (arr.length === cap) {\n arr.shift();\n }\n arr.push(value);\n};\n\nconst medianAndIqr = (arr: number[]) => {\n if (arr.length === 0) return { median: 0, iqr: 0 };\n for (let i = 0; i < arr.length; i++) {\n OUTLIER_SCRATCH[i] = arr[i];\n }\n const view = OUTLIER_SCRATCH.subarray(0, arr.length);\n view.sort();\n const mid = Math.floor(view.length / 2);\n const median = view.length % 2 === 0 ? (view[mid - 1] + view[mid]) / 2 : view[mid];\n const q1Idx = Math.floor(view.length * 0.25);\n const q3Idx = Math.floor(view.length * 0.75);\n const q1 = view[q1Idx];\n const q3 = view[q3Idx];\n return { median, iqr: q3 - q1 };\n};\n\nconst windowCv = (arr: number[]) => {\n if (arr.length < 2) return Number.POSITIVE_INFINITY;\n const mean = arr.reduce((a, v) => a + v, 0) / arr.length;\n const variance = arr.reduce((a, v) => a + (v - mean) * (v - mean), 0) / (arr.length - 1);\n const stddev = Math.sqrt(variance);\n return mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n};\n\nexport const benchmark = async <TContext, TInput>({\n setup,\n teardown,\n pre,\n run: runRaw,\n post,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n gcObserver = false,\n\n durationsSAB,\n controlSAB,\n}: Required<Options<TContext, TInput>>) => {\n const durations = new BigUint64Array(durationsSAB);\n const control = new Int32Array(controlSAB);\n\n control[Control.INDEX] = 0;\n control[Control.PROGRESS] = 0;\n control[Control.COMPLETE] = 255;\n\n const context = (await setup?.()) as TContext;\n const input = data as TInput;\n const maxCycles = durations.length;\n const gcWatcher = gcObserver ? new GCWatcher() : null;\n const gcTracker = gcObserver ? createGCTracker() : null;\n\n try {\n // classify sync/async and capture initial duration\n let preIsAsync = false;\n if (pre) {\n const preResult = pre(context, input);\n preIsAsync = isThenable(preResult);\n if (preIsAsync) {\n await preResult;\n }\n }\n\n const probeStart = hr();\n const probeResult = runRaw(context, input);\n const runIsAsync = isThenable(probeResult);\n if (runIsAsync) {\n const resolved = await probeResult;\n consume(resolved);\n } else {\n consume(probeResult);\n }\n const durationProbeRaw = hr() - probeStart;\n\n let postIsAsync = false;\n if (post) {\n const postResult = post(context, input);\n postIsAsync = isThenable(postResult);\n if (postIsAsync) {\n await postResult;\n }\n }\n\n const timerOverhead = runIsAsync ? 0n : measureTimerOverhead();\n let durationProbe = runIsAsync ? durationProbeRaw : durationProbeRaw > timerOverhead ? durationProbeRaw - timerOverhead : 0n;\n\n const shouldPerturbInput = process.env.OVERTAKE_PERTURB_INPUT === '1';\n let nonce = 0;\n const nextNonce = shouldPerturbInput\n ? () => {\n nonce = (nonce + 1) | 0;\n return nonce;\n }\n : null;\n\n if (!runIsAsync && !pre && !post) {\n const batchProbeSize = 10_000;\n const batchProbeStart = hr();\n if (nextNonce) {\n for (let i = 0; i < batchProbeSize; i++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let i = 0; i < batchProbeSize; i++) {\n consume(runRaw(context, input));\n }\n }\n durationProbe = (hr() - batchProbeStart) / BigInt(batchProbeSize);\n }\n\n const runTimedSync = runIsAsync ? null : runSync(runRaw, timerOverhead);\n const runTimedAsync = runIsAsync ? runAsync(runRaw) : null;\n const run = runIsAsync ? runTimedAsync! : runTimedSync!;\n\n const runOnceSync: RunTimedSync<TContext, TInput> | null = runIsAsync ? null : nextNonce ? (ctx, dataValue) => runTimedSync!(ctx, dataValue, nextNonce()) : runTimedSync!;\n const runOnceAsync: RunTimedAsync<TContext, TInput> | null = runIsAsync ? (nextNonce ? (ctx, dataValue) => runTimedAsync!(ctx, dataValue, nextNonce()) : runTimedAsync!) : null;\n\n const preSync = preIsAsync ? null : pre;\n const preAsync = preIsAsync ? pre : null;\n const postSync = postIsAsync ? null : post;\n const postAsync = postIsAsync ? post : null;\n\n // choose batch size to amortize timer overhead\n const durationPerRun = durationProbe === 0n ? 1n : durationProbe;\n const suggestedBatch = Number(TARGET_SAMPLE_NS / durationPerRun);\n const minBatchForFastOps = durationProbe < 100n ? 100_000 : 1;\n const initialBatchSize = Math.min(MAX_BATCH, Math.max(minBatchForFastOps, suggestedBatch));\n\n // auto-tune based on warmup samples\n const tuned = await tuneParameters({\n initialBatch: initialBatchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data: input,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n });\n let batchSize = tuned.batchSize;\n minCycles = tuned.minCycles;\n relThreshold = tuned.relThreshold;\n\n // warmup: run until requested cycles, adapt if unstable\n const warmupStart = performance.now();\n let warmupRemaining = warmupCycles;\n const warmupWindow: number[] = [];\n const warmupCap = Math.max(warmupCycles, Math.min(maxCycles, warmupCycles * 4 || 1000));\n const canBatchTime = !runIsAsync && !preSync && !preAsync && !postSync && !postAsync;\n\n const runWarmup = async () => {\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n\n return duration * DURATION_SCALE;\n };\n\n while (performance.now() - warmupStart < 1_000 && warmupRemaining > 0) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupRemaining--;\n }\n let warmupDone = 0;\n while (warmupDone < warmupRemaining) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupDone++;\n if (global.gc && warmupDone % GC_STRIDE === 0) {\n global.gc();\n }\n }\n while (warmupWindow.length >= 8 && warmupWindow.length < warmupCap) {\n const cv = windowCv(warmupWindow);\n if (cv <= relThreshold * 2) {\n break;\n }\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n }\n\n let i = 0;\n let mean = 0n;\n let m2 = 0n;\n const outlierWindow: number[] = [];\n let skipped = 0;\n const maxSkipped = maxCycles * 10;\n let disableFiltering = false;\n\n while (true) {\n if (i >= maxCycles) break;\n if (!disableFiltering && skipped >= maxSkipped) {\n console.error(`Warning: ${skipped} samples skipped due to noise/outlier detection. ` + `Disabling filtering for remaining samples. Results may have higher variance.`);\n disableFiltering = true;\n }\n\n if (global.gc && i > 0 && i % GC_STRIDE === 0) {\n global.gc();\n }\n\n const gcMarker = gcWatcher?.start();\n const sampleStart = performance.now();\n let sampleDuration = 0n;\n\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n const batchDuration = hr() - batchStart;\n sampleDuration = (batchDuration * DURATION_SCALE) / BigInt(batchSize);\n } else {\n for (let b = 0; b < batchSize; b++) {\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n sampleDuration += duration;\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n }\n sampleDuration = (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n }\n\n const sampleEnd = performance.now();\n if (!disableFiltering) {\n const gcNoise = (gcMarker ? gcWatcher!.seen(gcMarker) : false) || (gcTracker?.overlaps(sampleStart, sampleEnd) ?? false);\n if (gcNoise) {\n skipped++;\n continue;\n }\n }\n\n const durationNumber = Number(sampleDuration);\n pushWindow(outlierWindow, durationNumber, OUTLIER_WINDOW);\n if (!disableFiltering) {\n const { median, iqr } = medianAndIqr(outlierWindow);\n const maxAllowed = median + OUTLIER_IQR_MULTIPLIER * iqr || Number.POSITIVE_INFINITY;\n if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD) {\n skipped++;\n continue;\n }\n\n const meanNumber = Number(mean);\n if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD) {\n skipped++;\n continue;\n }\n }\n\n durations[i++] = sampleDuration;\n const delta = sampleDuration - mean;\n mean += delta / BigInt(i);\n m2 += delta * (sampleDuration - mean);\n\n const progress = (i / maxCycles) * COMPLETE_VALUE;\n if (i % PROGRESS_STRIDE === 0) {\n control[Control.PROGRESS] = progress;\n }\n\n if (i >= minCycles) {\n const variance = Number(m2) / (i - 1);\n const stddev = Math.sqrt(variance);\n if (stddev <= Number(absThreshold)) {\n break;\n }\n\n const meanNum = Number(mean);\n const cov = stddev / (meanNum || 1);\n if (cov <= relThreshold) {\n break;\n }\n }\n }\n\n control[Control.INDEX] = i;\n control[Control.COMPLETE] = 0;\n } catch (e) {\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n control[Control.COMPLETE] = 1;\n } finally {\n gcTracker?.dispose?.();\n try {\n await teardown?.(context);\n } catch (e) {\n control[Control.COMPLETE] = 2;\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n }\n }\n\n return control[Control.COMPLETE];\n};\n"],"names":["benchmark","COMPLETE_VALUE","hr","process","hrtime","bigint","bind","sink","Int32Array","SharedArrayBuffer","BYTES_PER_ELEMENT","consume","value","payload","Number","isFinite","Math","trunc","length","Atomics","xor","runSync","run","overhead","args","start","result","duration","runAsync","isThenable","then","TARGET_SAMPLE_NS","MAX_BATCH","PROGRESS_STRIDE","GC_STRIDE","OUTLIER_MULTIPLIER","OUTLIER_IQR_MULTIPLIER","OUTLIER_WINDOW","OUTLIER_ABS_THRESHOLD","BASELINE_SAMPLES","OUTLIER_SCRATCH","Float64Array","measureTimerOverhead","total","i","BigInt","collectSample","batchSize","runRaw","runIsAsync","pre","preIsAsync","post","postIsAsync","context","data","nextNonce","canBatchTime","batchStart","b","DURATION_SCALE","sampleDuration","runAsyncFn","runSyncFn","tuneParameters","initialBatch","minCycles","relThreshold","maxCycles","bestCv","POSITIVE_INFINITY","bestBatch","attempt","samples","sampleCount","min","s","push","mean","reduce","acc","v","variance","max","stddev","sqrt","cv","tunedRel","tunedMin","ceil","createGCTracker","env","OVERTAKE_GC_OBSERVER","PerformanceObserver","events","observer","list","entry","getEntries","startTime","end","observe","entryTypes","overlaps","noisy","event","splice","dispose","disconnect","pushWindow","arr","cap","shift","medianAndIqr","median","iqr","view","subarray","sort","mid","floor","q1Idx","q3Idx","q1","q3","windowCv","a","setup","teardown","warmupCycles","absThreshold","gcObserver","durationsSAB","controlSAB","durations","BigUint64Array","control","Control","INDEX","PROGRESS","COMPLETE","input","gcWatcher","GCWatcher","gcTracker","preResult","probeStart","probeResult","resolved","durationProbeRaw","postResult","timerOverhead","durationProbe","shouldPerturbInput","OVERTAKE_PERTURB_INPUT","nonce","batchProbeSize","batchProbeStart","runTimedSync","runTimedAsync","runOnceSync","ctx","dataValue","runOnceAsync","preSync","preAsync","postSync","postAsync","durationPerRun","suggestedBatch","minBatchForFastOps","initialBatchSize","tuned","warmupStart","performance","now","warmupRemaining","warmupWindow","warmupCap","runWarmup","warmupDone","global","gc","m2","outlierWindow","skipped","maxSkipped","disableFiltering","console","error","gcMarker","sampleStart","batchDuration","sampleEnd","gcNoise","seen","durationNumber","maxAllowed","meanNumber","delta","progress","meanNum","cov","e","stack"],"mappings":";;;;+BAgTaA;;;eAAAA;;;gCAhToC;0BACA;8BACvB;AAG1B,MAAMC,iBAAiB;AAEvB,MAAMC,KAAKC,QAAQC,MAAM,CAACC,MAAM,CAACC,IAAI,CAACH,QAAQC,MAAM;AAEpD,MAAMG,OAAO,IAAIC,WAAW,IAAIC,kBAAkBD,WAAWE,iBAAiB;AAC9E,MAAMC,UAAU,CAACC;IACf,IAAIC,UAAU;IACd,OAAQ,OAAOD;QACb,KAAK;YACHC,UAAUC,OAAOC,QAAQ,CAACH,SAASI,KAAKC,KAAK,CAACL,SAAS;YACvD;QACF,KAAK;YACHC,UAAUC,OAAOF,QAAQ,YAAY;YACrC;QACF,KAAK;YACHC,UAAUD,MAAMM,MAAM;YACtB;QACF,KAAK;YACHL,UAAUD,QAAQ,IAAI;YACtB;QACF,KAAK;YACHC,UAAUD,UAAU,OAAO,IAAI;YAC/B;QACF,KAAK;YACHC,UAAU;YACV;QACF;YACEA,UAAU,CAAC;IACf;IACAM,QAAQC,GAAG,CAACb,MAAM,GAAGM;AACvB;AAEA,MAAMQ,UAAU,CAACC,KAAeC;IAC9B,OAAO,CAAC,GAAGC;QACT,MAAMC,QAAQvB;QACd,MAAMwB,SAASJ,OAAOE;QACtBb,QAAQe;QACR,MAAMC,WAAWzB,OAAOuB;QACxB,OAAOE,WAAWJ,WAAWI,WAAWJ,WAAW,EAAE;IACvD;AACF;AAEA,MAAMK,WAAW,CAACN;IAChB,OAAO,OAAO,GAAGE;QACf,MAAMC,QAAQvB;QACd,MAAMwB,SAAS,MAAMJ,OAAOE;QAC5Bb,QAAQe;QACR,OAAOxB,OAAOuB;IAChB;AACF;AAEA,MAAMI,aAAa,CAACjB;IAClB,OAAOA,UAAU,QAAS,CAAA,OAAOA,UAAU,YAAY,OAAOA,UAAU,UAAS,KAAM,OAAO,AAACA,MAA+BkB,IAAI,KAAK;AACzI;AAEA,MAAMC,mBAAmB,UAAU;AACnC,MAAMC,YAAY;AAClB,MAAMC,kBAAkB;AACxB,MAAMC,YAAY;AAClB,MAAMC,qBAAqB;AAC3B,MAAMC,yBAAyB;AAC/B,MAAMC,iBAAiB;AACvB,MAAMC,wBAAwB;AAC9B,MAAMC,mBAAmB;AACzB,MAAMC,kBAAkB,IAAIC,aAAaJ;AAMzC,MAAMK,uBAAuB;IAC3B,IAAIC,QAAQ,EAAE;IACd,IAAK,IAAIC,IAAI,GAAGA,IAAIL,kBAAkBK,IAAK;QACzC,MAAMnB,QAAQvB;QACdS,QAAQ;QACRgC,SAASzC,OAAOuB;IAClB;IACA,OAAOkB,QAAQE,OAAON;AACxB;AAEA,MAAMO,gBAAgB,OAAyB,EAC7CC,SAAS,EACTzB,GAAG,EACH0B,MAAM,EACNC,UAAU,EACVC,GAAG,EACHC,UAAU,EACVC,IAAI,EACJC,WAAW,EACXC,OAAO,EACPC,IAAI,EACJC,SAAS,EAaV;IACC,MAAMC,eAAe,CAACR,cAAc,CAACC,OAAO,CAACE;IAC7C,IAAIK,cAAc;QAChB,MAAMC,aAAaxD;QACnB,IAAIsD,WAAW;YACb,IAAK,IAAIG,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;gBAClChD,QAAQ,AAACqC,OAAoBM,SAASC,MAAMC;YAC9C;QACF,OAAO;YACL,IAAK,IAAIG,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;gBAClChD,QAAQqC,OAAOM,SAASC;YAC1B;QACF;QACA,OAAO,AAAErD,CAAAA,OAAOwD,UAAS,IAAKE,wBAAc,GAAIf,OAAOE;IACzD;IAEA,IAAIc,iBAAiB,EAAE;IACvB,IAAK,IAAIF,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;QAClC,IAAIT,KAAK;YACP,IAAIC,YAAY;gBACd,MAAMD,IAAII,SAASC;YACrB,OAAO;gBACLL,IAAII,SAASC;YACf;QACF;QAEA,IAAIN,YAAY;YACd,MAAMa,aAAaxC;YACnB,MAAMK,WAAW6B,YAAY,MAAMM,WAAWR,SAASC,MAAMC,eAAe,MAAMM,WAAWR,SAASC;YACtGM,kBAAkBlC;QACpB,OAAO;YACL,MAAMoC,YAAYzC;YAClB,MAAMK,WAAW6B,YAAYO,UAAUT,SAASC,MAAMC,eAAeO,UAAUT,SAASC;YACxFM,kBAAkBlC;QACpB;QAEA,IAAIyB,MAAM;YACR,IAAIC,aAAa;gBACf,MAAMD,KAAKE,SAASC;YACtB,OAAO;gBACLH,KAAKE,SAASC;YAChB;QACF;IACF;IACA,OAAO,AAACM,iBAAiBD,wBAAc,GAAIf,OAAOE;AACpD;AAEA,MAAMiB,iBAAiB,OAAyB,EAC9CC,YAAY,EACZ3C,GAAG,EACH0B,MAAM,EACNC,UAAU,EACVC,GAAG,EACHC,UAAU,EACVC,IAAI,EACJC,WAAW,EACXC,OAAO,EACPC,IAAI,EACJW,SAAS,EACTC,YAAY,EACZC,SAAS,EACTZ,SAAS,EAgBV;IACC,IAAIT,YAAYkB;IAChB,IAAII,SAASvD,OAAOwD,iBAAiB;IACrC,IAAIC,YAAYxB;IAEhB,IAAK,IAAIyB,UAAU,GAAGA,UAAU,GAAGA,UAAW;QAC5C,MAAMC,UAAoB,EAAE;QAC5B,MAAMC,cAAc1D,KAAK2D,GAAG,CAAC,GAAGP;QAChC,IAAK,IAAIQ,IAAI,GAAGA,IAAIF,aAAaE,IAAK;YACpC,MAAMjD,WAAW,MAAMmB,cAAc;gBACnCC;gBACAzB;gBACA0B;gBACAC;gBACAC;gBACAC;gBACAC;gBACAC;gBACAC;gBACAC;gBACAC;YACF;YACAiB,QAAQI,IAAI,CAAC/D,OAAOa;QACtB;QACA,MAAMmD,OAAOL,QAAQM,MAAM,CAAC,CAACC,KAAKC,IAAMD,MAAMC,GAAG,KAAKR,QAAQvD,MAAM;QACpE,MAAMgE,WAAWT,QAAQM,MAAM,CAAC,CAACC,KAAKC,IAAMD,MAAM,AAACC,CAAAA,IAAIH,IAAG,IAAMG,CAAAA,IAAIH,IAAG,GAAI,KAAK9D,KAAKmE,GAAG,CAAC,GAAGV,QAAQvD,MAAM,GAAG;QAC7G,MAAMkE,SAASpE,KAAKqE,IAAI,CAACH;QACzB,MAAMI,KAAKR,SAAS,IAAIhE,OAAOwD,iBAAiB,GAAGc,SAASN;QAE5D,IAAIQ,KAAKjB,QAAQ;YACfA,SAASiB;YACTf,YAAYxB;QACd;QAEA,IAAIuC,MAAMnB,gBAAgBpB,aAAaf,WAAW;YAChD;QACF;QACAe,YAAY/B,KAAK2D,GAAG,CAAC3C,WAAWe,YAAY;IAC9C;IAEA,MAAMwC,WAAWlB,SAASF,eAAenD,KAAKmE,GAAG,CAACd,SAAS,KAAKF,eAAe,OAAOA;IACtF,MAAMqB,WAAWxE,KAAK2D,GAAG,CAACP,WAAWpD,KAAKmE,GAAG,CAACjB,WAAWlD,KAAKyE,IAAI,CAACvB,YAAYlD,KAAKmE,GAAG,CAAC,GAAGd,SAAUF,CAAAA,gBAAgB,IAAG;IAExH,OAAO;QAAEpB,WAAWwB;QAAWJ,cAAcoB;QAAUrB,WAAWsB;IAAS;AAC7E;AAEA,MAAME,kBAAkB;IACtB,IAAIvF,QAAQwF,GAAG,CAACC,oBAAoB,KAAK,KAAK;QAC5C,OAAO;IACT;IACA,IAAI,OAAOC,mCAAmB,KAAK,aAAa;QAC9C,OAAO;IACT;IAEA,MAAMC,SAAoB,EAAE;IAC5B,MAAMC,WAAW,IAAIF,mCAAmB,CAAC,CAACG;QACxC,KAAK,MAAMC,SAASD,KAAKE,UAAU,GAAI;YACrCJ,OAAOjB,IAAI,CAAC;gBAAEpD,OAAOwE,MAAME,SAAS;gBAAEC,KAAKH,MAAME,SAAS,GAAGF,MAAMtE,QAAQ;YAAC;QAC9E;IACF;IAEA,IAAI;QACFoE,SAASM,OAAO,CAAC;YAAEC,YAAY;gBAAC;aAAK;QAAC;IACxC,EAAE,OAAM;QACN,OAAO;IACT;IAEA,MAAMC,WAAW,CAAC9E,OAAe2E;QAC/B,IAAII,QAAQ;QACZ,IAAK,IAAI5D,IAAIkD,OAAO5E,MAAM,GAAG,GAAG0B,KAAK,GAAGA,IAAK;YAC3C,MAAM6D,QAAQX,MAAM,CAAClD,EAAE;YACvB,IAAI6D,MAAML,GAAG,GAAG3E,QAAQ,OAAO;gBAC7BqE,OAAOY,MAAM,CAAC9D,GAAG;gBACjB;YACF;YACA,IAAI6D,MAAMhF,KAAK,IAAI2E,OAAOK,MAAML,GAAG,IAAI3E,OAAO;gBAC5C+E,QAAQ;YACV;QACF;QACA,OAAOA;IACT;IAEA,MAAMG,UAAU,IAAMZ,SAASa,UAAU;IAEzC,OAAO;QAAEL;QAAUI;IAAQ;AAC7B;AAEA,MAAME,aAAa,CAACC,KAAelG,OAAemG;IAChD,IAAID,IAAI5F,MAAM,KAAK6F,KAAK;QACtBD,IAAIE,KAAK;IACX;IACAF,IAAIjC,IAAI,CAACjE;AACX;AAEA,MAAMqG,eAAe,CAACH;IACpB,IAAIA,IAAI5F,MAAM,KAAK,GAAG,OAAO;QAAEgG,QAAQ;QAAGC,KAAK;IAAE;IACjD,IAAK,IAAIvE,IAAI,GAAGA,IAAIkE,IAAI5F,MAAM,EAAE0B,IAAK;QACnCJ,eAAe,CAACI,EAAE,GAAGkE,GAAG,CAAClE,EAAE;IAC7B;IACA,MAAMwE,OAAO5E,gBAAgB6E,QAAQ,CAAC,GAAGP,IAAI5F,MAAM;IACnDkG,KAAKE,IAAI;IACT,MAAMC,MAAMvG,KAAKwG,KAAK,CAACJ,KAAKlG,MAAM,GAAG;IACrC,MAAMgG,SAASE,KAAKlG,MAAM,GAAG,MAAM,IAAI,AAACkG,CAAAA,IAAI,CAACG,MAAM,EAAE,GAAGH,IAAI,CAACG,IAAI,AAAD,IAAK,IAAIH,IAAI,CAACG,IAAI;IAClF,MAAME,QAAQzG,KAAKwG,KAAK,CAACJ,KAAKlG,MAAM,GAAG;IACvC,MAAMwG,QAAQ1G,KAAKwG,KAAK,CAACJ,KAAKlG,MAAM,GAAG;IACvC,MAAMyG,KAAKP,IAAI,CAACK,MAAM;IACtB,MAAMG,KAAKR,IAAI,CAACM,MAAM;IACtB,OAAO;QAAER;QAAQC,KAAKS,KAAKD;IAAG;AAChC;AAEA,MAAME,WAAW,CAACf;IAChB,IAAIA,IAAI5F,MAAM,GAAG,GAAG,OAAOJ,OAAOwD,iBAAiB;IACnD,MAAMQ,OAAOgC,IAAI/B,MAAM,CAAC,CAAC+C,GAAG7C,IAAM6C,IAAI7C,GAAG,KAAK6B,IAAI5F,MAAM;IACxD,MAAMgE,WAAW4B,IAAI/B,MAAM,CAAC,CAAC+C,GAAG7C,IAAM6C,IAAI,AAAC7C,CAAAA,IAAIH,IAAG,IAAMG,CAAAA,IAAIH,IAAG,GAAI,KAAMgC,CAAAA,IAAI5F,MAAM,GAAG,CAAA;IACtF,MAAMkE,SAASpE,KAAKqE,IAAI,CAACH;IACzB,OAAOJ,SAAS,IAAIhE,OAAOwD,iBAAiB,GAAGc,SAASN;AAC1D;AAEO,MAAM9E,YAAY,OAAyB,EAChD+H,KAAK,EACLC,QAAQ,EACR9E,GAAG,EACH5B,KAAK0B,MAAM,EACXI,IAAI,EACJG,IAAI,EAEJ0E,YAAY,EACZ/D,SAAS,EACTgE,YAAY,EACZ/D,YAAY,EACZgE,aAAa,KAAK,EAElBC,YAAY,EACZC,UAAU,EAC0B;IACpC,MAAMC,YAAY,IAAIC,eAAeH;IACrC,MAAMI,UAAU,IAAIhI,WAAW6H;IAE/BG,OAAO,CAACC,iBAAO,CAACC,KAAK,CAAC,GAAG;IACzBF,OAAO,CAACC,iBAAO,CAACE,QAAQ,CAAC,GAAG;IAC5BH,OAAO,CAACC,iBAAO,CAACG,QAAQ,CAAC,GAAG;IAE5B,MAAMtF,UAAW,MAAMyE;IACvB,MAAMc,QAAQtF;IACd,MAAMa,YAAYkE,UAAUpH,MAAM;IAClC,MAAM4H,YAAYX,aAAa,IAAIY,uBAAS,KAAK;IACjD,MAAMC,YAAYb,aAAazC,oBAAoB;IAEnD,IAAI;QAEF,IAAIvC,aAAa;QACjB,IAAID,KAAK;YACP,MAAM+F,YAAY/F,IAAII,SAASuF;YAC/B1F,aAAatB,WAAWoH;YACxB,IAAI9F,YAAY;gBACd,MAAM8F;YACR;QACF;QAEA,MAAMC,aAAahJ;QACnB,MAAMiJ,cAAcnG,OAAOM,SAASuF;QACpC,MAAM5F,aAAapB,WAAWsH;QAC9B,IAAIlG,YAAY;YACd,MAAMmG,WAAW,MAAMD;YACvBxI,QAAQyI;QACV,OAAO;YACLzI,QAAQwI;QACV;QACA,MAAME,mBAAmBnJ,OAAOgJ;QAEhC,IAAI7F,cAAc;QAClB,IAAID,MAAM;YACR,MAAMkG,aAAalG,KAAKE,SAASuF;YACjCxF,cAAcxB,WAAWyH;YACzB,IAAIjG,aAAa;gBACf,MAAMiG;YACR;QACF;QAEA,MAAMC,gBAAgBtG,aAAa,EAAE,GAAGP;QACxC,IAAI8G,gBAAgBvG,aAAaoG,mBAAmBA,mBAAmBE,gBAAgBF,mBAAmBE,gBAAgB,EAAE;QAE5H,MAAME,qBAAqBtJ,QAAQwF,GAAG,CAAC+D,sBAAsB,KAAK;QAClE,IAAIC,QAAQ;QACZ,MAAMnG,YAAYiG,qBACd;YACEE,QAAQ,AAACA,QAAQ,IAAK;YACtB,OAAOA;QACT,IACA;QAEJ,IAAI,CAAC1G,cAAc,CAACC,OAAO,CAACE,MAAM;YAChC,MAAMwG,iBAAiB;YACvB,MAAMC,kBAAkB3J;YACxB,IAAIsD,WAAW;gBACb,IAAK,IAAIZ,IAAI,GAAGA,IAAIgH,gBAAgBhH,IAAK;oBACvCjC,QAAQ,AAACqC,OAAoBM,SAASuF,OAAOrF;gBAC/C;YACF,OAAO;gBACL,IAAK,IAAIZ,IAAI,GAAGA,IAAIgH,gBAAgBhH,IAAK;oBACvCjC,QAAQqC,OAAOM,SAASuF;gBAC1B;YACF;YACAW,gBAAgB,AAACtJ,CAAAA,OAAO2J,eAAc,IAAKhH,OAAO+G;QACpD;QAEA,MAAME,eAAe7G,aAAa,OAAO5B,QAAQ2B,QAAQuG;QACzD,MAAMQ,gBAAgB9G,aAAarB,SAASoB,UAAU;QACtD,MAAM1B,MAAM2B,aAAa8G,gBAAiBD;QAE1C,MAAME,cAAqD/G,aAAa,OAAOO,YAAY,CAACyG,KAAKC,YAAcJ,aAAcG,KAAKC,WAAW1G,eAAesG;QAC5J,MAAMK,eAAuDlH,aAAcO,YAAY,CAACyG,KAAKC,YAAcH,cAAeE,KAAKC,WAAW1G,eAAeuG,gBAAkB;QAE3K,MAAMK,UAAUjH,aAAa,OAAOD;QACpC,MAAMmH,WAAWlH,aAAaD,MAAM;QACpC,MAAMoH,WAAWjH,cAAc,OAAOD;QACtC,MAAMmH,YAAYlH,cAAcD,OAAO;QAGvC,MAAMoH,iBAAiBhB,kBAAkB,EAAE,GAAG,EAAE,GAAGA;QACnD,MAAMiB,iBAAiB3J,OAAOiB,mBAAmByI;QACjD,MAAME,qBAAqBlB,gBAAgB,IAAI,GAAG,UAAU;QAC5D,MAAMmB,mBAAmB3J,KAAK2D,GAAG,CAAC3C,WAAWhB,KAAKmE,GAAG,CAACuF,oBAAoBD;QAG1E,MAAMG,QAAQ,MAAM5G,eAAe;YACjCC,cAAc0G;YACdrJ;YACA0B;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC,MAAMsF;YACN3E;YACAC;YACAC;YACAZ;QACF;QACA,IAAIT,YAAY6H,MAAM7H,SAAS;QAC/BmB,YAAY0G,MAAM1G,SAAS;QAC3BC,eAAeyG,MAAMzG,YAAY;QAGjC,MAAM0G,cAAcC,2BAAW,CAACC,GAAG;QACnC,IAAIC,kBAAkB/C;QACtB,MAAMgD,eAAyB,EAAE;QACjC,MAAMC,YAAYlK,KAAKmE,GAAG,CAAC8C,cAAcjH,KAAK2D,GAAG,CAACP,WAAW6D,eAAe,KAAK;QACjF,MAAMxE,eAAe,CAACR,cAAc,CAACmH,WAAW,CAACC,YAAY,CAACC,YAAY,CAACC;QAE3E,MAAMY,YAAY;YAChB,IAAI1H,cAAc;gBAChB,MAAMC,aAAaxD;gBACnB,IAAIsD,WAAW;oBACb,IAAK,IAAIG,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;wBAClChD,QAAQ,AAACqC,OAAoBM,SAASuF,OAAOrF;oBAC/C;gBACF,OAAO;oBACL,IAAK,IAAIG,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;wBAClChD,QAAQqC,OAAOM,SAASuF;oBAC1B;gBACF;gBACA,OAAO,AAAE3I,CAAAA,OAAOwD,UAAS,IAAKE,wBAAc,GAAIf,OAAOE;YACzD;YAEA,IAAIqH,SAAS;gBACXA,QAAQ9G,SAASuF;YACnB,OAAO,IAAIwB,UAAU;gBACnB,MAAMA,SAAS/G,SAASuF;YAC1B;YAEA,MAAMlH,WAAWsB,aAAa,MAAMkH,aAAc7G,SAASuF,SAASmB,YAAa1G,SAASuF;YAE1F,IAAIyB,UAAU;gBACZA,SAAShH,SAASuF;YACpB,OAAO,IAAI0B,WAAW;gBACpB,MAAMA,UAAUjH,SAASuF;YAC3B;YAEA,OAAOlH,WAAWiC,wBAAc;QAClC;QAEA,MAAOkH,2BAAW,CAACC,GAAG,KAAKF,cAAc,SAASG,kBAAkB,EAAG;YACrE,MAAMrJ,WAAW,MAAMwJ;YACvBtE,WAAWoE,cAAcnK,OAAOa,WAAWuJ;YAC3CF;QACF;QACA,IAAII,aAAa;QACjB,MAAOA,aAAaJ,gBAAiB;YACnC,MAAMrJ,WAAW,MAAMwJ;YACvBtE,WAAWoE,cAAcnK,OAAOa,WAAWuJ;YAC3CE;YACA,IAAIC,OAAOC,EAAE,IAAIF,aAAalJ,cAAc,GAAG;gBAC7CmJ,OAAOC,EAAE;YACX;QACF;QACA,MAAOL,aAAa/J,MAAM,IAAI,KAAK+J,aAAa/J,MAAM,GAAGgK,UAAW;YAClE,MAAM5F,KAAKuC,SAASoD;YACpB,IAAI3F,MAAMnB,eAAe,GAAG;gBAC1B;YACF;YACA,MAAMxC,WAAW,MAAMwJ;YACvBtE,WAAWoE,cAAcnK,OAAOa,WAAWuJ;QAC7C;QAEA,IAAItI,IAAI;QACR,IAAIkC,OAAO,EAAE;QACb,IAAIyG,KAAK,EAAE;QACX,MAAMC,gBAA0B,EAAE;QAClC,IAAIC,UAAU;QACd,MAAMC,aAAatH,YAAY;QAC/B,IAAIuH,mBAAmB;QAEvB,MAAO,KAAM;YACX,IAAI/I,KAAKwB,WAAW;YACpB,IAAI,CAACuH,oBAAoBF,WAAWC,YAAY;gBAC9CE,QAAQC,KAAK,CAAC,CAAC,SAAS,EAAEJ,QAAQ,iDAAiD,CAAC,GAAG,CAAC,4EAA4E,CAAC;gBACrKE,mBAAmB;YACrB;YAEA,IAAIN,OAAOC,EAAE,IAAI1I,IAAI,KAAKA,IAAIV,cAAc,GAAG;gBAC7CmJ,OAAOC,EAAE;YACX;YAEA,MAAMQ,WAAWhD,WAAWrH;YAC5B,MAAMsK,cAAcjB,2BAAW,CAACC,GAAG;YACnC,IAAIlH,iBAAiB,EAAE;YAEvB,IAAIJ,cAAc;gBAChB,MAAMC,aAAaxD;gBACnB,IAAIsD,WAAW;oBACb,IAAK,IAAIG,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;wBAClChD,QAAQ,AAACqC,OAAoBM,SAASuF,OAAOrF;oBAC/C;gBACF,OAAO;oBACL,IAAK,IAAIG,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;wBAClChD,QAAQqC,OAAOM,SAASuF;oBAC1B;gBACF;gBACA,MAAMmD,gBAAgB9L,OAAOwD;gBAC7BG,iBAAiB,AAACmI,gBAAgBpI,wBAAc,GAAIf,OAAOE;YAC7D,OAAO;gBACL,IAAK,IAAIY,IAAI,GAAGA,IAAIZ,WAAWY,IAAK;oBAClC,IAAIyG,SAAS;wBACXA,QAAQ9G,SAASuF;oBACnB,OAAO,IAAIwB,UAAU;wBACnB,MAAMA,SAAS/G,SAASuF;oBAC1B;oBAEA,MAAMlH,WAAWsB,aAAa,MAAMkH,aAAc7G,SAASuF,SAASmB,YAAa1G,SAASuF;oBAC1FhF,kBAAkBlC;oBAElB,IAAI2I,UAAU;wBACZA,SAAShH,SAASuF;oBACpB,OAAO,IAAI0B,WAAW;wBACpB,MAAMA,UAAUjH,SAASuF;oBAC3B;gBACF;gBACAhF,iBAAiB,AAACA,iBAAiBD,wBAAc,GAAIf,OAAOE;YAC9D;YAEA,MAAMkJ,YAAYnB,2BAAW,CAACC,GAAG;YACjC,IAAI,CAACY,kBAAkB;gBACrB,MAAMO,UAAU,AAACJ,CAAAA,WAAWhD,UAAWqD,IAAI,CAACL,YAAY,KAAI,KAAO9C,CAAAA,WAAWzC,SAASwF,aAAaE,cAAc,KAAI;gBACtH,IAAIC,SAAS;oBACXT;oBACA;gBACF;YACF;YAEA,MAAMW,iBAAiBtL,OAAO+C;YAC9BgD,WAAW2E,eAAeY,gBAAgB/J;YAC1C,IAAI,CAACsJ,kBAAkB;gBACrB,MAAM,EAAEzE,MAAM,EAAEC,GAAG,EAAE,GAAGF,aAAauE;gBACrC,MAAMa,aAAanF,SAAS9E,yBAAyB+E,OAAOrG,OAAOwD,iBAAiB;gBACpF,IAAIkH,cAActK,MAAM,IAAI,KAAKkL,iBAAiBC,cAAcD,iBAAiBlF,SAAS5E,uBAAuB;oBAC/GmJ;oBACA;gBACF;gBAEA,MAAMa,aAAaxL,OAAOgE;gBAC1B,IAAIlC,KAAK,KAAK0J,aAAa,KAAKF,iBAAiBjK,qBAAqBmK,cAAcF,iBAAiBE,aAAahK,uBAAuB;oBACvImJ;oBACA;gBACF;YACF;YAEAnD,SAAS,CAAC1F,IAAI,GAAGiB;YACjB,MAAM0I,QAAQ1I,iBAAiBiB;YAC/BA,QAAQyH,QAAQ1J,OAAOD;YACvB2I,MAAMgB,QAAS1I,CAAAA,iBAAiBiB,IAAG;YAEnC,MAAM0H,WAAW,AAAC5J,IAAIwB,YAAanE;YACnC,IAAI2C,IAAIX,oBAAoB,GAAG;gBAC7BuG,OAAO,CAACC,iBAAO,CAACE,QAAQ,CAAC,GAAG6D;YAC9B;YAEA,IAAI5J,KAAKsB,WAAW;gBAClB,MAAMgB,WAAWpE,OAAOyK,MAAO3I,CAAAA,IAAI,CAAA;gBACnC,MAAMwC,SAASpE,KAAKqE,IAAI,CAACH;gBACzB,IAAIE,UAAUtE,OAAOoH,eAAe;oBAClC;gBACF;gBAEA,MAAMuE,UAAU3L,OAAOgE;gBACvB,MAAM4H,MAAMtH,SAAUqH,CAAAA,WAAW,CAAA;gBACjC,IAAIC,OAAOvI,cAAc;oBACvB;gBACF;YACF;QACF;QAEAqE,OAAO,CAACC,iBAAO,CAACC,KAAK,CAAC,GAAG9F;QACzB4F,OAAO,CAACC,iBAAO,CAACG,QAAQ,CAAC,GAAG;IAC9B,EAAE,OAAO+D,GAAG;QACVf,QAAQC,KAAK,CAACc,KAAK,OAAOA,MAAM,YAAY,WAAWA,IAAIA,EAAEC,KAAK,GAAGD;QACrEnE,OAAO,CAACC,iBAAO,CAACG,QAAQ,CAAC,GAAG;IAC9B,SAAU;QACRI,WAAWrC;QACX,IAAI;YACF,MAAMqB,WAAW1E;QACnB,EAAE,OAAOqJ,GAAG;YACVnE,OAAO,CAACC,iBAAO,CAACG,QAAQ,CAAC,GAAG;YAC5BgD,QAAQC,KAAK,CAACc,KAAK,OAAOA,MAAM,YAAY,WAAWA,IAAIA,EAAEC,KAAK,GAAGD;QACvE;IACF;IAEA,OAAOnE,OAAO,CAACC,iBAAO,CAACG,QAAQ,CAAC;AAClC"}
package/build/runner.js CHANGED
@@ -57,7 +57,7 @@ const GC_STRIDE = 32;
57
57
  const OUTLIER_MULTIPLIER = 4;
58
58
  const OUTLIER_IQR_MULTIPLIER = 3;
59
59
  const OUTLIER_WINDOW = 64;
60
- const OUTLIER_ABS_THRESHOLD_NS = 10_000;
60
+ const OUTLIER_ABS_THRESHOLD = 10_000_000;
61
61
  const BASELINE_SAMPLES = 16;
62
62
  const OUTLIER_SCRATCH = new Float64Array(OUTLIER_WINDOW);
63
63
  const measureTimerOverhead = ()=>{
@@ -357,7 +357,7 @@ export const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data,
357
357
  } else if (postAsync) {
358
358
  await postAsync(context, input);
359
359
  }
360
- return duration;
360
+ return duration * DURATION_SCALE;
361
361
  };
362
362
  while(performance.now() - warmupStart < 1_000 && warmupRemaining > 0){
363
363
  const duration = await runWarmup();
@@ -443,12 +443,12 @@ export const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data,
443
443
  if (!disableFiltering) {
444
444
  const { median, iqr } = medianAndIqr(outlierWindow);
445
445
  const maxAllowed = median + OUTLIER_IQR_MULTIPLIER * iqr || Number.POSITIVE_INFINITY;
446
- if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD_NS) {
446
+ if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD) {
447
447
  skipped++;
448
448
  continue;
449
449
  }
450
450
  const meanNumber = Number(mean);
451
- if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD_NS) {
451
+ if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD) {
452
452
  skipped++;
453
453
  continue;
454
454
  }
@@ -457,7 +457,7 @@ export const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data,
457
457
  const delta = sampleDuration - mean;
458
458
  mean += delta / BigInt(i);
459
459
  m2 += delta * (sampleDuration - mean);
460
- const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;
460
+ const progress = i / maxCycles * COMPLETE_VALUE;
461
461
  if (i % PROGRESS_STRIDE === 0) {
462
462
  control[Control.PROGRESS] = progress;
463
463
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runner.ts"],"sourcesContent":["import { performance, PerformanceObserver } from 'node:perf_hooks';\nimport { Options, Control, DURATION_SCALE } from './types.js';\nimport { GCWatcher } from './gc-watcher.js';\nimport { StepFn } from './types.js';\n\nconst COMPLETE_VALUE = 100_00;\n\nconst hr = process.hrtime.bigint.bind(process.hrtime);\n\nconst sink = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));\nconst consume = (value: unknown) => {\n let payload = 0;\n switch (typeof value) {\n case 'number':\n payload = Number.isFinite(value) ? Math.trunc(value) : 0;\n break;\n case 'bigint':\n payload = Number(value & 0xffff_ffffn);\n break;\n case 'string':\n payload = value.length;\n break;\n case 'boolean':\n payload = value ? 1 : 0;\n break;\n case 'object':\n payload = value === null ? 0 : 1;\n break;\n case 'function':\n payload = 1;\n break;\n default:\n payload = -1;\n }\n Atomics.xor(sink, 0, payload);\n};\n\nconst runSync = (run: Function, overhead: bigint) => {\n return (...args: unknown[]) => {\n const start = hr();\n const result = run(...args);\n consume(result);\n const duration = hr() - start;\n return duration > overhead ? duration - overhead : 0n;\n };\n};\n\nconst runAsync = (run: Function) => {\n return async (...args: unknown[]) => {\n const start = hr();\n const result = await run(...args);\n consume(result);\n return hr() - start;\n };\n};\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> => {\n return value !== null && (typeof value === 'object' || typeof value === 'function') && typeof (value as PromiseLike<unknown>).then === 'function';\n};\n\nconst TARGET_SAMPLE_NS = 1_000_000n; // aim for ~1ms per measured sample\nconst MAX_BATCH = 1_048_576;\nconst PROGRESS_STRIDE = 16;\nconst GC_STRIDE = 32;\nconst OUTLIER_MULTIPLIER = 4;\nconst OUTLIER_IQR_MULTIPLIER = 3;\nconst OUTLIER_WINDOW = 64;\nconst OUTLIER_ABS_THRESHOLD_NS = 10_000;\nconst BASELINE_SAMPLES = 16;\nconst OUTLIER_SCRATCH = new Float64Array(OUTLIER_WINDOW);\n\ntype GCEvent = { start: number; end: number };\ntype RunTimedSync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => bigint;\ntype RunTimedAsync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => Promise<bigint>;\n\nconst measureTimerOverhead = () => {\n let total = 0n;\n for (let i = 0; i < BASELINE_SAMPLES; i++) {\n const start = hr();\n consume(0);\n total += hr() - start;\n }\n return total / BigInt(BASELINE_SAMPLES);\n};\n\nconst collectSample = async <TContext, TInput>({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n}: {\n batchSize: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre: StepFn<TContext, TInput> | undefined;\n preIsAsync: boolean;\n post: StepFn<TContext, TInput> | undefined;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n nextNonce: (() => number) | null;\n}) => {\n const canBatchTime = !runIsAsync && !pre && !post;\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, data, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, data));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n let sampleDuration = 0n;\n for (let b = 0; b < batchSize; b++) {\n if (pre) {\n if (preIsAsync) {\n await pre(context, data);\n } else {\n pre(context, data);\n }\n }\n\n if (runIsAsync) {\n const runAsyncFn = run as RunTimedAsync<TContext, TInput>;\n const duration = nextNonce ? await runAsyncFn(context, data, nextNonce()) : await runAsyncFn(context, data);\n sampleDuration += duration;\n } else {\n const runSyncFn = run as RunTimedSync<TContext, TInput>;\n const duration = nextNonce ? runSyncFn(context, data, nextNonce()) : runSyncFn(context, data);\n sampleDuration += duration;\n }\n\n if (post) {\n if (postIsAsync) {\n await post(context, data);\n } else {\n post(context, data);\n }\n }\n }\n return (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n};\n\nconst tuneParameters = async <TContext, TInput>({\n initialBatch,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n}: {\n initialBatch: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre?: StepFn<TContext, TInput>;\n preIsAsync: boolean;\n post?: StepFn<TContext, TInput>;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n minCycles: number;\n relThreshold: number;\n maxCycles: number;\n nextNonce: (() => number) | null;\n}) => {\n let batchSize = initialBatch;\n let bestCv = Number.POSITIVE_INFINITY;\n let bestBatch = batchSize;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const samples: number[] = [];\n const sampleCount = Math.min(8, maxCycles);\n for (let s = 0; s < sampleCount; s++) {\n const duration = await collectSample({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n });\n samples.push(Number(duration));\n }\n const mean = samples.reduce((acc, v) => acc + v, 0) / samples.length;\n const variance = samples.reduce((acc, v) => acc + (v - mean) * (v - mean), 0) / Math.max(1, samples.length - 1);\n const stddev = Math.sqrt(variance);\n const cv = mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n\n if (cv < bestCv) {\n bestCv = cv;\n bestBatch = batchSize;\n }\n\n if (cv <= relThreshold || batchSize >= MAX_BATCH) {\n break;\n }\n batchSize = Math.min(MAX_BATCH, batchSize * 2);\n }\n\n const tunedRel = bestCv < relThreshold ? Math.max(bestCv * 1.5, relThreshold * 0.5) : relThreshold;\n const tunedMin = Math.min(maxCycles, Math.max(minCycles, Math.ceil(minCycles * Math.max(1, bestCv / (relThreshold || 1e-6)))));\n\n return { batchSize: bestBatch, relThreshold: tunedRel, minCycles: tunedMin };\n};\n\nconst createGCTracker = () => {\n if (process.env.OVERTAKE_GC_OBSERVER !== '1') {\n return null;\n }\n if (typeof PerformanceObserver === 'undefined') {\n return null;\n }\n\n const events: GCEvent[] = [];\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n events.push({ start: entry.startTime, end: entry.startTime + entry.duration });\n }\n });\n\n try {\n observer.observe({ entryTypes: ['gc'] });\n } catch {\n return null;\n }\n\n const overlaps = (start: number, end: number) => {\n let noisy = false;\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (event.end < start - 5_000) {\n events.splice(i, 1);\n continue;\n }\n if (event.start <= end && event.end >= start) {\n noisy = true;\n }\n }\n return noisy;\n };\n\n const dispose = () => observer.disconnect();\n\n return { overlaps, dispose };\n};\n\nconst pushWindow = (arr: number[], value: number, cap: number) => {\n if (arr.length === cap) {\n arr.shift();\n }\n arr.push(value);\n};\n\nconst medianAndIqr = (arr: number[]) => {\n if (arr.length === 0) return { median: 0, iqr: 0 };\n for (let i = 0; i < arr.length; i++) {\n OUTLIER_SCRATCH[i] = arr[i];\n }\n const view = OUTLIER_SCRATCH.subarray(0, arr.length);\n view.sort();\n const mid = Math.floor(view.length / 2);\n const median = view.length % 2 === 0 ? (view[mid - 1] + view[mid]) / 2 : view[mid];\n const q1Idx = Math.floor(view.length * 0.25);\n const q3Idx = Math.floor(view.length * 0.75);\n const q1 = view[q1Idx];\n const q3 = view[q3Idx];\n return { median, iqr: q3 - q1 };\n};\n\nconst windowCv = (arr: number[]) => {\n if (arr.length < 2) return Number.POSITIVE_INFINITY;\n const mean = arr.reduce((a, v) => a + v, 0) / arr.length;\n const variance = arr.reduce((a, v) => a + (v - mean) * (v - mean), 0) / (arr.length - 1);\n const stddev = Math.sqrt(variance);\n return mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n};\n\nexport const benchmark = async <TContext, TInput>({\n setup,\n teardown,\n pre,\n run: runRaw,\n post,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n gcObserver = false,\n\n durationsSAB,\n controlSAB,\n}: Required<Options<TContext, TInput>>) => {\n const durations = new BigUint64Array(durationsSAB);\n const control = new Int32Array(controlSAB);\n\n control[Control.INDEX] = 0;\n control[Control.PROGRESS] = 0;\n control[Control.COMPLETE] = 255;\n\n const context = (await setup?.()) as TContext;\n const input = data as TInput;\n const maxCycles = durations.length;\n const gcWatcher = gcObserver ? new GCWatcher() : null;\n const gcTracker = gcObserver ? createGCTracker() : null;\n\n try {\n // classify sync/async and capture initial duration\n let preIsAsync = false;\n if (pre) {\n const preResult = pre(context, input);\n preIsAsync = isThenable(preResult);\n if (preIsAsync) {\n await preResult;\n }\n }\n\n const probeStart = hr();\n const probeResult = runRaw(context, input);\n const runIsAsync = isThenable(probeResult);\n if (runIsAsync) {\n const resolved = await probeResult;\n consume(resolved);\n } else {\n consume(probeResult);\n }\n const durationProbeRaw = hr() - probeStart;\n\n let postIsAsync = false;\n if (post) {\n const postResult = post(context, input);\n postIsAsync = isThenable(postResult);\n if (postIsAsync) {\n await postResult;\n }\n }\n\n const timerOverhead = runIsAsync ? 0n : measureTimerOverhead();\n let durationProbe = runIsAsync ? durationProbeRaw : durationProbeRaw > timerOverhead ? durationProbeRaw - timerOverhead : 0n;\n\n const shouldPerturbInput = process.env.OVERTAKE_PERTURB_INPUT === '1';\n let nonce = 0;\n const nextNonce = shouldPerturbInput\n ? () => {\n nonce = (nonce + 1) | 0;\n return nonce;\n }\n : null;\n\n if (!runIsAsync && !pre && !post) {\n const batchProbeSize = 10_000;\n const batchProbeStart = hr();\n if (nextNonce) {\n for (let i = 0; i < batchProbeSize; i++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let i = 0; i < batchProbeSize; i++) {\n consume(runRaw(context, input));\n }\n }\n durationProbe = (hr() - batchProbeStart) / BigInt(batchProbeSize);\n }\n\n const runTimedSync = runIsAsync ? null : runSync(runRaw, timerOverhead);\n const runTimedAsync = runIsAsync ? runAsync(runRaw) : null;\n const run = runIsAsync ? runTimedAsync! : runTimedSync!;\n\n const runOnceSync: RunTimedSync<TContext, TInput> | null = runIsAsync ? null : nextNonce ? (ctx, dataValue) => runTimedSync!(ctx, dataValue, nextNonce()) : runTimedSync!;\n const runOnceAsync: RunTimedAsync<TContext, TInput> | null = runIsAsync ? (nextNonce ? (ctx, dataValue) => runTimedAsync!(ctx, dataValue, nextNonce()) : runTimedAsync!) : null;\n\n const preSync = preIsAsync ? null : pre;\n const preAsync = preIsAsync ? pre : null;\n const postSync = postIsAsync ? null : post;\n const postAsync = postIsAsync ? post : null;\n\n // choose batch size to amortize timer overhead\n const durationPerRun = durationProbe === 0n ? 1n : durationProbe;\n const suggestedBatch = Number(TARGET_SAMPLE_NS / durationPerRun);\n const minBatchForFastOps = durationProbe < 100n ? 100_000 : 1;\n const initialBatchSize = Math.min(MAX_BATCH, Math.max(minBatchForFastOps, suggestedBatch));\n\n // auto-tune based on warmup samples\n const tuned = await tuneParameters({\n initialBatch: initialBatchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data: input,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n });\n let batchSize = tuned.batchSize;\n minCycles = tuned.minCycles;\n relThreshold = tuned.relThreshold;\n\n // warmup: run until requested cycles, adapt if unstable\n const warmupStart = performance.now();\n let warmupRemaining = warmupCycles;\n const warmupWindow: number[] = [];\n const warmupCap = Math.max(warmupCycles, Math.min(maxCycles, warmupCycles * 4 || 1000));\n const canBatchTime = !runIsAsync && !preSync && !preAsync && !postSync && !postAsync;\n\n const runWarmup = async () => {\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n\n return duration;\n };\n\n while (performance.now() - warmupStart < 1_000 && warmupRemaining > 0) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupRemaining--;\n }\n let warmupDone = 0;\n while (warmupDone < warmupRemaining) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupDone++;\n if (global.gc && warmupDone % GC_STRIDE === 0) {\n global.gc();\n }\n }\n while (warmupWindow.length >= 8 && warmupWindow.length < warmupCap) {\n const cv = windowCv(warmupWindow);\n if (cv <= relThreshold * 2) {\n break;\n }\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n }\n\n let i = 0;\n let mean = 0n;\n let m2 = 0n;\n const outlierWindow: number[] = [];\n let skipped = 0;\n const maxSkipped = maxCycles * 10;\n let disableFiltering = false;\n\n while (true) {\n if (i >= maxCycles) break;\n if (!disableFiltering && skipped >= maxSkipped) {\n console.error(`Warning: ${skipped} samples skipped due to noise/outlier detection. ` + `Disabling filtering for remaining samples. Results may have higher variance.`);\n disableFiltering = true;\n }\n\n if (global.gc && i > 0 && i % GC_STRIDE === 0) {\n global.gc();\n }\n\n const gcMarker = gcWatcher?.start();\n const sampleStart = performance.now();\n let sampleDuration = 0n;\n\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n const batchDuration = hr() - batchStart;\n sampleDuration = (batchDuration * DURATION_SCALE) / BigInt(batchSize);\n } else {\n for (let b = 0; b < batchSize; b++) {\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n sampleDuration += duration;\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n }\n sampleDuration = (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n }\n\n const sampleEnd = performance.now();\n if (!disableFiltering) {\n const gcNoise = (gcMarker ? gcWatcher!.seen(gcMarker) : false) || (gcTracker?.overlaps(sampleStart, sampleEnd) ?? false);\n if (gcNoise) {\n skipped++;\n continue;\n }\n }\n\n const durationNumber = Number(sampleDuration);\n pushWindow(outlierWindow, durationNumber, OUTLIER_WINDOW);\n if (!disableFiltering) {\n const { median, iqr } = medianAndIqr(outlierWindow);\n const maxAllowed = median + OUTLIER_IQR_MULTIPLIER * iqr || Number.POSITIVE_INFINITY;\n if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD_NS) {\n skipped++;\n continue;\n }\n\n const meanNumber = Number(mean);\n if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD_NS) {\n skipped++;\n continue;\n }\n }\n\n durations[i++] = sampleDuration;\n const delta = sampleDuration - mean;\n mean += delta / BigInt(i);\n m2 += delta * (sampleDuration - mean);\n\n const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;\n if (i % PROGRESS_STRIDE === 0) {\n control[Control.PROGRESS] = progress;\n }\n\n if (i >= minCycles) {\n const variance = Number(m2) / (i - 1);\n const stddev = Math.sqrt(variance);\n if (stddev <= Number(absThreshold)) {\n break;\n }\n\n const meanNum = Number(mean);\n const cov = stddev / (meanNum || 1);\n if (cov <= relThreshold) {\n break;\n }\n }\n }\n\n control[Control.INDEX] = i;\n control[Control.COMPLETE] = 0;\n } catch (e) {\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n control[Control.COMPLETE] = 1;\n } finally {\n gcTracker?.dispose?.();\n try {\n await teardown?.(context);\n } catch (e) {\n control[Control.COMPLETE] = 2;\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n }\n }\n\n return control[Control.COMPLETE];\n};\n"],"names":["performance","PerformanceObserver","Control","DURATION_SCALE","GCWatcher","COMPLETE_VALUE","hr","process","hrtime","bigint","bind","sink","Int32Array","SharedArrayBuffer","BYTES_PER_ELEMENT","consume","value","payload","Number","isFinite","Math","trunc","length","Atomics","xor","runSync","run","overhead","args","start","result","duration","runAsync","isThenable","then","TARGET_SAMPLE_NS","MAX_BATCH","PROGRESS_STRIDE","GC_STRIDE","OUTLIER_MULTIPLIER","OUTLIER_IQR_MULTIPLIER","OUTLIER_WINDOW","OUTLIER_ABS_THRESHOLD_NS","BASELINE_SAMPLES","OUTLIER_SCRATCH","Float64Array","measureTimerOverhead","total","i","BigInt","collectSample","batchSize","runRaw","runIsAsync","pre","preIsAsync","post","postIsAsync","context","data","nextNonce","canBatchTime","batchStart","b","sampleDuration","runAsyncFn","runSyncFn","tuneParameters","initialBatch","minCycles","relThreshold","maxCycles","bestCv","POSITIVE_INFINITY","bestBatch","attempt","samples","sampleCount","min","s","push","mean","reduce","acc","v","variance","max","stddev","sqrt","cv","tunedRel","tunedMin","ceil","createGCTracker","env","OVERTAKE_GC_OBSERVER","events","observer","list","entry","getEntries","startTime","end","observe","entryTypes","overlaps","noisy","event","splice","dispose","disconnect","pushWindow","arr","cap","shift","medianAndIqr","median","iqr","view","subarray","sort","mid","floor","q1Idx","q3Idx","q1","q3","windowCv","a","benchmark","setup","teardown","warmupCycles","absThreshold","gcObserver","durationsSAB","controlSAB","durations","BigUint64Array","control","INDEX","PROGRESS","COMPLETE","input","gcWatcher","gcTracker","preResult","probeStart","probeResult","resolved","durationProbeRaw","postResult","timerOverhead","durationProbe","shouldPerturbInput","OVERTAKE_PERTURB_INPUT","nonce","batchProbeSize","batchProbeStart","runTimedSync","runTimedAsync","runOnceSync","ctx","dataValue","runOnceAsync","preSync","preAsync","postSync","postAsync","durationPerRun","suggestedBatch","minBatchForFastOps","initialBatchSize","tuned","warmupStart","now","warmupRemaining","warmupWindow","warmupCap","runWarmup","warmupDone","global","gc","m2","outlierWindow","skipped","maxSkipped","disableFiltering","console","error","gcMarker","sampleStart","batchDuration","sampleEnd","gcNoise","seen","durationNumber","maxAllowed","meanNumber","delta","progress","meanNum","cov","e","stack"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/runner.ts"],"sourcesContent":["import { performance, PerformanceObserver } from 'node:perf_hooks';\nimport { Options, Control, DURATION_SCALE } from './types.js';\nimport { GCWatcher } from './gc-watcher.js';\nimport { StepFn } from './types.js';\n\nconst COMPLETE_VALUE = 100_00;\n\nconst hr = process.hrtime.bigint.bind(process.hrtime);\n\nconst sink = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));\nconst consume = (value: unknown) => {\n let payload = 0;\n switch (typeof value) {\n case 'number':\n payload = Number.isFinite(value) ? Math.trunc(value) : 0;\n break;\n case 'bigint':\n payload = Number(value & 0xffff_ffffn);\n break;\n case 'string':\n payload = value.length;\n break;\n case 'boolean':\n payload = value ? 1 : 0;\n break;\n case 'object':\n payload = value === null ? 0 : 1;\n break;\n case 'function':\n payload = 1;\n break;\n default:\n payload = -1;\n }\n Atomics.xor(sink, 0, payload);\n};\n\nconst runSync = (run: Function, overhead: bigint) => {\n return (...args: unknown[]) => {\n const start = hr();\n const result = run(...args);\n consume(result);\n const duration = hr() - start;\n return duration > overhead ? duration - overhead : 0n;\n };\n};\n\nconst runAsync = (run: Function) => {\n return async (...args: unknown[]) => {\n const start = hr();\n const result = await run(...args);\n consume(result);\n return hr() - start;\n };\n};\n\nconst isThenable = (value: unknown): value is PromiseLike<unknown> => {\n return value !== null && (typeof value === 'object' || typeof value === 'function') && typeof (value as PromiseLike<unknown>).then === 'function';\n};\n\nconst TARGET_SAMPLE_NS = 1_000_000n; // aim for ~1ms per measured sample\nconst MAX_BATCH = 1_048_576;\nconst PROGRESS_STRIDE = 16;\nconst GC_STRIDE = 32;\nconst OUTLIER_MULTIPLIER = 4;\nconst OUTLIER_IQR_MULTIPLIER = 3;\nconst OUTLIER_WINDOW = 64;\nconst OUTLIER_ABS_THRESHOLD = 10_000_000;\nconst BASELINE_SAMPLES = 16;\nconst OUTLIER_SCRATCH = new Float64Array(OUTLIER_WINDOW);\n\ntype GCEvent = { start: number; end: number };\ntype RunTimedSync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => bigint;\ntype RunTimedAsync<TContext, TInput> = (ctx: TContext, data: TInput, nonce?: number) => Promise<bigint>;\n\nconst measureTimerOverhead = () => {\n let total = 0n;\n for (let i = 0; i < BASELINE_SAMPLES; i++) {\n const start = hr();\n consume(0);\n total += hr() - start;\n }\n return total / BigInt(BASELINE_SAMPLES);\n};\n\nconst collectSample = async <TContext, TInput>({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n}: {\n batchSize: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre: StepFn<TContext, TInput> | undefined;\n preIsAsync: boolean;\n post: StepFn<TContext, TInput> | undefined;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n nextNonce: (() => number) | null;\n}) => {\n const canBatchTime = !runIsAsync && !pre && !post;\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, data, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, data));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n let sampleDuration = 0n;\n for (let b = 0; b < batchSize; b++) {\n if (pre) {\n if (preIsAsync) {\n await pre(context, data);\n } else {\n pre(context, data);\n }\n }\n\n if (runIsAsync) {\n const runAsyncFn = run as RunTimedAsync<TContext, TInput>;\n const duration = nextNonce ? await runAsyncFn(context, data, nextNonce()) : await runAsyncFn(context, data);\n sampleDuration += duration;\n } else {\n const runSyncFn = run as RunTimedSync<TContext, TInput>;\n const duration = nextNonce ? runSyncFn(context, data, nextNonce()) : runSyncFn(context, data);\n sampleDuration += duration;\n }\n\n if (post) {\n if (postIsAsync) {\n await post(context, data);\n } else {\n post(context, data);\n }\n }\n }\n return (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n};\n\nconst tuneParameters = async <TContext, TInput>({\n initialBatch,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n}: {\n initialBatch: number;\n run: RunTimedSync<TContext, TInput> | RunTimedAsync<TContext, TInput>;\n runRaw: StepFn<TContext, TInput>;\n runIsAsync: boolean;\n pre?: StepFn<TContext, TInput>;\n preIsAsync: boolean;\n post?: StepFn<TContext, TInput>;\n postIsAsync: boolean;\n context: TContext;\n data: TInput;\n minCycles: number;\n relThreshold: number;\n maxCycles: number;\n nextNonce: (() => number) | null;\n}) => {\n let batchSize = initialBatch;\n let bestCv = Number.POSITIVE_INFINITY;\n let bestBatch = batchSize;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const samples: number[] = [];\n const sampleCount = Math.min(8, maxCycles);\n for (let s = 0; s < sampleCount; s++) {\n const duration = await collectSample({\n batchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data,\n nextNonce,\n });\n samples.push(Number(duration));\n }\n const mean = samples.reduce((acc, v) => acc + v, 0) / samples.length;\n const variance = samples.reduce((acc, v) => acc + (v - mean) * (v - mean), 0) / Math.max(1, samples.length - 1);\n const stddev = Math.sqrt(variance);\n const cv = mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n\n if (cv < bestCv) {\n bestCv = cv;\n bestBatch = batchSize;\n }\n\n if (cv <= relThreshold || batchSize >= MAX_BATCH) {\n break;\n }\n batchSize = Math.min(MAX_BATCH, batchSize * 2);\n }\n\n const tunedRel = bestCv < relThreshold ? Math.max(bestCv * 1.5, relThreshold * 0.5) : relThreshold;\n const tunedMin = Math.min(maxCycles, Math.max(minCycles, Math.ceil(minCycles * Math.max(1, bestCv / (relThreshold || 1e-6)))));\n\n return { batchSize: bestBatch, relThreshold: tunedRel, minCycles: tunedMin };\n};\n\nconst createGCTracker = () => {\n if (process.env.OVERTAKE_GC_OBSERVER !== '1') {\n return null;\n }\n if (typeof PerformanceObserver === 'undefined') {\n return null;\n }\n\n const events: GCEvent[] = [];\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n events.push({ start: entry.startTime, end: entry.startTime + entry.duration });\n }\n });\n\n try {\n observer.observe({ entryTypes: ['gc'] });\n } catch {\n return null;\n }\n\n const overlaps = (start: number, end: number) => {\n let noisy = false;\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (event.end < start - 5_000) {\n events.splice(i, 1);\n continue;\n }\n if (event.start <= end && event.end >= start) {\n noisy = true;\n }\n }\n return noisy;\n };\n\n const dispose = () => observer.disconnect();\n\n return { overlaps, dispose };\n};\n\nconst pushWindow = (arr: number[], value: number, cap: number) => {\n if (arr.length === cap) {\n arr.shift();\n }\n arr.push(value);\n};\n\nconst medianAndIqr = (arr: number[]) => {\n if (arr.length === 0) return { median: 0, iqr: 0 };\n for (let i = 0; i < arr.length; i++) {\n OUTLIER_SCRATCH[i] = arr[i];\n }\n const view = OUTLIER_SCRATCH.subarray(0, arr.length);\n view.sort();\n const mid = Math.floor(view.length / 2);\n const median = view.length % 2 === 0 ? (view[mid - 1] + view[mid]) / 2 : view[mid];\n const q1Idx = Math.floor(view.length * 0.25);\n const q3Idx = Math.floor(view.length * 0.75);\n const q1 = view[q1Idx];\n const q3 = view[q3Idx];\n return { median, iqr: q3 - q1 };\n};\n\nconst windowCv = (arr: number[]) => {\n if (arr.length < 2) return Number.POSITIVE_INFINITY;\n const mean = arr.reduce((a, v) => a + v, 0) / arr.length;\n const variance = arr.reduce((a, v) => a + (v - mean) * (v - mean), 0) / (arr.length - 1);\n const stddev = Math.sqrt(variance);\n return mean === 0 ? Number.POSITIVE_INFINITY : stddev / mean;\n};\n\nexport const benchmark = async <TContext, TInput>({\n setup,\n teardown,\n pre,\n run: runRaw,\n post,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n gcObserver = false,\n\n durationsSAB,\n controlSAB,\n}: Required<Options<TContext, TInput>>) => {\n const durations = new BigUint64Array(durationsSAB);\n const control = new Int32Array(controlSAB);\n\n control[Control.INDEX] = 0;\n control[Control.PROGRESS] = 0;\n control[Control.COMPLETE] = 255;\n\n const context = (await setup?.()) as TContext;\n const input = data as TInput;\n const maxCycles = durations.length;\n const gcWatcher = gcObserver ? new GCWatcher() : null;\n const gcTracker = gcObserver ? createGCTracker() : null;\n\n try {\n // classify sync/async and capture initial duration\n let preIsAsync = false;\n if (pre) {\n const preResult = pre(context, input);\n preIsAsync = isThenable(preResult);\n if (preIsAsync) {\n await preResult;\n }\n }\n\n const probeStart = hr();\n const probeResult = runRaw(context, input);\n const runIsAsync = isThenable(probeResult);\n if (runIsAsync) {\n const resolved = await probeResult;\n consume(resolved);\n } else {\n consume(probeResult);\n }\n const durationProbeRaw = hr() - probeStart;\n\n let postIsAsync = false;\n if (post) {\n const postResult = post(context, input);\n postIsAsync = isThenable(postResult);\n if (postIsAsync) {\n await postResult;\n }\n }\n\n const timerOverhead = runIsAsync ? 0n : measureTimerOverhead();\n let durationProbe = runIsAsync ? durationProbeRaw : durationProbeRaw > timerOverhead ? durationProbeRaw - timerOverhead : 0n;\n\n const shouldPerturbInput = process.env.OVERTAKE_PERTURB_INPUT === '1';\n let nonce = 0;\n const nextNonce = shouldPerturbInput\n ? () => {\n nonce = (nonce + 1) | 0;\n return nonce;\n }\n : null;\n\n if (!runIsAsync && !pre && !post) {\n const batchProbeSize = 10_000;\n const batchProbeStart = hr();\n if (nextNonce) {\n for (let i = 0; i < batchProbeSize; i++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let i = 0; i < batchProbeSize; i++) {\n consume(runRaw(context, input));\n }\n }\n durationProbe = (hr() - batchProbeStart) / BigInt(batchProbeSize);\n }\n\n const runTimedSync = runIsAsync ? null : runSync(runRaw, timerOverhead);\n const runTimedAsync = runIsAsync ? runAsync(runRaw) : null;\n const run = runIsAsync ? runTimedAsync! : runTimedSync!;\n\n const runOnceSync: RunTimedSync<TContext, TInput> | null = runIsAsync ? null : nextNonce ? (ctx, dataValue) => runTimedSync!(ctx, dataValue, nextNonce()) : runTimedSync!;\n const runOnceAsync: RunTimedAsync<TContext, TInput> | null = runIsAsync ? (nextNonce ? (ctx, dataValue) => runTimedAsync!(ctx, dataValue, nextNonce()) : runTimedAsync!) : null;\n\n const preSync = preIsAsync ? null : pre;\n const preAsync = preIsAsync ? pre : null;\n const postSync = postIsAsync ? null : post;\n const postAsync = postIsAsync ? post : null;\n\n // choose batch size to amortize timer overhead\n const durationPerRun = durationProbe === 0n ? 1n : durationProbe;\n const suggestedBatch = Number(TARGET_SAMPLE_NS / durationPerRun);\n const minBatchForFastOps = durationProbe < 100n ? 100_000 : 1;\n const initialBatchSize = Math.min(MAX_BATCH, Math.max(minBatchForFastOps, suggestedBatch));\n\n // auto-tune based on warmup samples\n const tuned = await tuneParameters({\n initialBatch: initialBatchSize,\n run,\n runRaw,\n runIsAsync,\n pre,\n preIsAsync,\n post,\n postIsAsync,\n context,\n data: input,\n minCycles,\n relThreshold,\n maxCycles,\n nextNonce,\n });\n let batchSize = tuned.batchSize;\n minCycles = tuned.minCycles;\n relThreshold = tuned.relThreshold;\n\n // warmup: run until requested cycles, adapt if unstable\n const warmupStart = performance.now();\n let warmupRemaining = warmupCycles;\n const warmupWindow: number[] = [];\n const warmupCap = Math.max(warmupCycles, Math.min(maxCycles, warmupCycles * 4 || 1000));\n const canBatchTime = !runIsAsync && !preSync && !preAsync && !postSync && !postAsync;\n\n const runWarmup = async () => {\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n return ((hr() - batchStart) * DURATION_SCALE) / BigInt(batchSize);\n }\n\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n\n return duration * DURATION_SCALE;\n };\n\n while (performance.now() - warmupStart < 1_000 && warmupRemaining > 0) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupRemaining--;\n }\n let warmupDone = 0;\n while (warmupDone < warmupRemaining) {\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n warmupDone++;\n if (global.gc && warmupDone % GC_STRIDE === 0) {\n global.gc();\n }\n }\n while (warmupWindow.length >= 8 && warmupWindow.length < warmupCap) {\n const cv = windowCv(warmupWindow);\n if (cv <= relThreshold * 2) {\n break;\n }\n const duration = await runWarmup();\n pushWindow(warmupWindow, Number(duration), warmupCap);\n }\n\n let i = 0;\n let mean = 0n;\n let m2 = 0n;\n const outlierWindow: number[] = [];\n let skipped = 0;\n const maxSkipped = maxCycles * 10;\n let disableFiltering = false;\n\n while (true) {\n if (i >= maxCycles) break;\n if (!disableFiltering && skipped >= maxSkipped) {\n console.error(`Warning: ${skipped} samples skipped due to noise/outlier detection. ` + `Disabling filtering for remaining samples. Results may have higher variance.`);\n disableFiltering = true;\n }\n\n if (global.gc && i > 0 && i % GC_STRIDE === 0) {\n global.gc();\n }\n\n const gcMarker = gcWatcher?.start();\n const sampleStart = performance.now();\n let sampleDuration = 0n;\n\n if (canBatchTime) {\n const batchStart = hr();\n if (nextNonce) {\n for (let b = 0; b < batchSize; b++) {\n consume((runRaw as Function)(context, input, nextNonce()));\n }\n } else {\n for (let b = 0; b < batchSize; b++) {\n consume(runRaw(context, input));\n }\n }\n const batchDuration = hr() - batchStart;\n sampleDuration = (batchDuration * DURATION_SCALE) / BigInt(batchSize);\n } else {\n for (let b = 0; b < batchSize; b++) {\n if (preSync) {\n preSync(context, input);\n } else if (preAsync) {\n await preAsync(context, input);\n }\n\n const duration = runIsAsync ? await runOnceAsync!(context, input) : runOnceSync!(context, input);\n sampleDuration += duration;\n\n if (postSync) {\n postSync(context, input);\n } else if (postAsync) {\n await postAsync(context, input);\n }\n }\n sampleDuration = (sampleDuration * DURATION_SCALE) / BigInt(batchSize);\n }\n\n const sampleEnd = performance.now();\n if (!disableFiltering) {\n const gcNoise = (gcMarker ? gcWatcher!.seen(gcMarker) : false) || (gcTracker?.overlaps(sampleStart, sampleEnd) ?? false);\n if (gcNoise) {\n skipped++;\n continue;\n }\n }\n\n const durationNumber = Number(sampleDuration);\n pushWindow(outlierWindow, durationNumber, OUTLIER_WINDOW);\n if (!disableFiltering) {\n const { median, iqr } = medianAndIqr(outlierWindow);\n const maxAllowed = median + OUTLIER_IQR_MULTIPLIER * iqr || Number.POSITIVE_INFINITY;\n if (outlierWindow.length >= 8 && durationNumber > maxAllowed && durationNumber - median > OUTLIER_ABS_THRESHOLD) {\n skipped++;\n continue;\n }\n\n const meanNumber = Number(mean);\n if (i >= 8 && meanNumber > 0 && durationNumber > OUTLIER_MULTIPLIER * meanNumber && durationNumber - meanNumber > OUTLIER_ABS_THRESHOLD) {\n skipped++;\n continue;\n }\n }\n\n durations[i++] = sampleDuration;\n const delta = sampleDuration - mean;\n mean += delta / BigInt(i);\n m2 += delta * (sampleDuration - mean);\n\n const progress = (i / maxCycles) * COMPLETE_VALUE;\n if (i % PROGRESS_STRIDE === 0) {\n control[Control.PROGRESS] = progress;\n }\n\n if (i >= minCycles) {\n const variance = Number(m2) / (i - 1);\n const stddev = Math.sqrt(variance);\n if (stddev <= Number(absThreshold)) {\n break;\n }\n\n const meanNum = Number(mean);\n const cov = stddev / (meanNum || 1);\n if (cov <= relThreshold) {\n break;\n }\n }\n }\n\n control[Control.INDEX] = i;\n control[Control.COMPLETE] = 0;\n } catch (e) {\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n control[Control.COMPLETE] = 1;\n } finally {\n gcTracker?.dispose?.();\n try {\n await teardown?.(context);\n } catch (e) {\n control[Control.COMPLETE] = 2;\n console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);\n }\n }\n\n return control[Control.COMPLETE];\n};\n"],"names":["performance","PerformanceObserver","Control","DURATION_SCALE","GCWatcher","COMPLETE_VALUE","hr","process","hrtime","bigint","bind","sink","Int32Array","SharedArrayBuffer","BYTES_PER_ELEMENT","consume","value","payload","Number","isFinite","Math","trunc","length","Atomics","xor","runSync","run","overhead","args","start","result","duration","runAsync","isThenable","then","TARGET_SAMPLE_NS","MAX_BATCH","PROGRESS_STRIDE","GC_STRIDE","OUTLIER_MULTIPLIER","OUTLIER_IQR_MULTIPLIER","OUTLIER_WINDOW","OUTLIER_ABS_THRESHOLD","BASELINE_SAMPLES","OUTLIER_SCRATCH","Float64Array","measureTimerOverhead","total","i","BigInt","collectSample","batchSize","runRaw","runIsAsync","pre","preIsAsync","post","postIsAsync","context","data","nextNonce","canBatchTime","batchStart","b","sampleDuration","runAsyncFn","runSyncFn","tuneParameters","initialBatch","minCycles","relThreshold","maxCycles","bestCv","POSITIVE_INFINITY","bestBatch","attempt","samples","sampleCount","min","s","push","mean","reduce","acc","v","variance","max","stddev","sqrt","cv","tunedRel","tunedMin","ceil","createGCTracker","env","OVERTAKE_GC_OBSERVER","events","observer","list","entry","getEntries","startTime","end","observe","entryTypes","overlaps","noisy","event","splice","dispose","disconnect","pushWindow","arr","cap","shift","medianAndIqr","median","iqr","view","subarray","sort","mid","floor","q1Idx","q3Idx","q1","q3","windowCv","a","benchmark","setup","teardown","warmupCycles","absThreshold","gcObserver","durationsSAB","controlSAB","durations","BigUint64Array","control","INDEX","PROGRESS","COMPLETE","input","gcWatcher","gcTracker","preResult","probeStart","probeResult","resolved","durationProbeRaw","postResult","timerOverhead","durationProbe","shouldPerturbInput","OVERTAKE_PERTURB_INPUT","nonce","batchProbeSize","batchProbeStart","runTimedSync","runTimedAsync","runOnceSync","ctx","dataValue","runOnceAsync","preSync","preAsync","postSync","postAsync","durationPerRun","suggestedBatch","minBatchForFastOps","initialBatchSize","tuned","warmupStart","now","warmupRemaining","warmupWindow","warmupCap","runWarmup","warmupDone","global","gc","m2","outlierWindow","skipped","maxSkipped","disableFiltering","console","error","gcMarker","sampleStart","batchDuration","sampleEnd","gcNoise","seen","durationNumber","maxAllowed","meanNumber","delta","progress","meanNum","cov","e","stack"],"mappings":"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"}
package/build/types.cjs CHANGED
@@ -9,6 +9,9 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
+ get COMPLETE_VALUE () {
13
+ return COMPLETE_VALUE;
14
+ },
12
15
  get CONTROL_SLOTS () {
13
16
  return CONTROL_SLOTS;
14
17
  },
@@ -48,5 +51,6 @@ const CONTROL_SLOTS = Object.values(Control).length / 2;
48
51
  const DEFAULT_CYCLES = 1_000;
49
52
  const Z95 = 1.96;
50
53
  const DURATION_SCALE = 1000n;
54
+ const COMPLETE_VALUE = 100_00;
51
55
 
52
56
  //# sourceMappingURL=types.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface SetupFn<TContext> {\n (): MaybePromise<TContext>;\n}\n\nexport interface TeardownFn<TContext> {\n (ctx: TContext): MaybePromise<void>;\n}\n\nexport interface StepFn<TContext, TInput> {\n (ctx: TContext, input: TInput): MaybePromise<unknown>;\n}\n\nexport interface FeedFn<TInput> {\n (): MaybePromise<TInput>;\n}\n\ntype _Sequence<To extends number, R extends unknown[]> = R['length'] extends To ? R[number] : _Sequence<To, [R['length'], ...R]>;\nexport type Sequence<To extends number> = number extends To ? number : _Sequence<To, []>;\nexport type Between<From extends number, To extends number> = Exclude<Sequence<To>, Sequence<From>>;\n\nexport type ReportType = 'ops' | 'min' | 'max' | 'mean' | 'median' | 'mode' | `p${Between<1, 100>}`;\nexport type ReportTypeList = readonly ReportType[];\nexport const REPORT_TYPES: ReportTypeList = Array.from({ length: 99 }, (_, idx) => `p${idx + 1}` as ReportType).concat(['ops', 'mean', 'min', 'max', 'median', 'mode']);\n\nexport interface ReportOptions<R extends ReportTypeList> {\n reportTypes: R;\n}\n\nexport interface BenchmarkOptions {\n warmupCycles?: number;\n minCycles?: number;\n absThreshold?: number; // ns\n relThreshold?: number; // %\n gcObserver?: boolean;\n}\n\nexport interface RunOptions<TContext, TInput> {\n setup?: SetupFn<TContext>;\n teardown?: TeardownFn<TContext>;\n pre?: StepFn<TContext, TInput>;\n run: StepFn<TContext, TInput>;\n post?: StepFn<TContext, TInput>;\n data?: TInput;\n}\n\nexport interface WorkerOptions extends Required<BenchmarkOptions> {\n benchmarkUrl?: string;\n setupCode?: string;\n teardownCode?: string;\n preCode?: string;\n runCode: string;\n postCode?: string;\n data?: unknown;\n\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport interface Options<TContext, TInput> extends RunOptions<TContext, TInput>, BenchmarkOptions {\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport enum Control {\n INDEX,\n PROGRESS,\n COMPLETE,\n}\n\nexport const CONTROL_SLOTS = Object.values(Control).length / 2;\nexport const DEFAULT_CYCLES = 1_000;\nexport const Z95 = 1.96;\nexport const DURATION_SCALE = 1000n;\n"],"names":["CONTROL_SLOTS","Control","DEFAULT_CYCLES","DURATION_SCALE","REPORT_TYPES","Z95","Array","from","length","_","idx","concat","Object","values"],"mappings":";;;;;;;;;;;QAuEaA;eAAAA;;QANDC;eAAAA;;QAOCC;eAAAA;;QAEAC;eAAAA;;QAlDAC;eAAAA;;QAiDAC;eAAAA;;;AAjDN,MAAMD,eAA+BE,MAAMC,IAAI,CAAC;IAAEC,QAAQ;AAAG,GAAG,CAACC,GAAGC,MAAQ,CAAC,CAAC,EAAEA,MAAM,GAAG,EAAgBC,MAAM,CAAC;IAAC;IAAO;IAAQ;IAAO;IAAO;IAAU;CAAO;AAyC/J,IAAA,AAAKV,iCAAAA;;;;WAAAA;;AAML,MAAMD,gBAAgBY,OAAOC,MAAM,CAACZ,SAASO,MAAM,GAAG;AACtD,MAAMN,iBAAiB;AACvB,MAAMG,MAAM;AACZ,MAAMF,iBAAiB,KAAK"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface SetupFn<TContext> {\n (): MaybePromise<TContext>;\n}\n\nexport interface TeardownFn<TContext> {\n (ctx: TContext): MaybePromise<void>;\n}\n\nexport interface StepFn<TContext, TInput> {\n (ctx: TContext, input: TInput): MaybePromise<unknown>;\n}\n\nexport interface FeedFn<TInput> {\n (): MaybePromise<TInput>;\n}\n\ntype _Sequence<To extends number, R extends unknown[]> = R['length'] extends To ? R[number] : _Sequence<To, [R['length'], ...R]>;\nexport type Sequence<To extends number> = number extends To ? number : _Sequence<To, []>;\nexport type Between<From extends number, To extends number> = Exclude<Sequence<To>, Sequence<From>>;\n\nexport type ReportType = 'ops' | 'min' | 'max' | 'mean' | 'median' | 'mode' | `p${Between<1, 100>}`;\nexport type ReportTypeList = readonly ReportType[];\nexport const REPORT_TYPES: ReportTypeList = Array.from({ length: 99 }, (_, idx) => `p${idx + 1}` as ReportType).concat(['ops', 'mean', 'min', 'max', 'median', 'mode']);\n\nexport interface ReportOptions<R extends ReportTypeList> {\n reportTypes: R;\n}\n\nexport interface BenchmarkOptions {\n warmupCycles?: number;\n minCycles?: number;\n absThreshold?: number; // ns\n relThreshold?: number; // %\n gcObserver?: boolean;\n}\n\nexport interface RunOptions<TContext, TInput> {\n setup?: SetupFn<TContext>;\n teardown?: TeardownFn<TContext>;\n pre?: StepFn<TContext, TInput>;\n run: StepFn<TContext, TInput>;\n post?: StepFn<TContext, TInput>;\n data?: TInput;\n}\n\nexport interface ExecutorRunOptions<TContext, TInput> extends RunOptions<TContext, TInput> {\n id?: string;\n}\n\nexport interface WorkerOptions extends Required<BenchmarkOptions> {\n benchmarkUrl?: string;\n setupCode?: string;\n teardownCode?: string;\n preCode?: string;\n runCode: string;\n postCode?: string;\n data?: unknown;\n\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport interface Options<TContext, TInput> extends RunOptions<TContext, TInput>, BenchmarkOptions {\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport enum Control {\n INDEX,\n PROGRESS,\n COMPLETE,\n}\n\nexport const CONTROL_SLOTS = Object.values(Control).length / 2;\nexport const DEFAULT_CYCLES = 1_000;\nexport const Z95 = 1.96;\nexport const DURATION_SCALE = 1000n;\nexport const COMPLETE_VALUE = 100_00;\n\nexport interface ProgressInfo {\n id: string;\n progress: number;\n}\n\nexport type ProgressCallback = (info: ProgressInfo) => void;\n"],"names":["COMPLETE_VALUE","CONTROL_SLOTS","Control","DEFAULT_CYCLES","DURATION_SCALE","REPORT_TYPES","Z95","Array","from","length","_","idx","concat","Object","values"],"mappings":";;;;;;;;;;;QA+EaA;eAAAA;;QAJAC;eAAAA;;QANDC;eAAAA;;QAOCC;eAAAA;;QAEAC;eAAAA;;QAtDAC;eAAAA;;QAqDAC;eAAAA;;;AArDN,MAAMD,eAA+BE,MAAMC,IAAI,CAAC;IAAEC,QAAQ;AAAG,GAAG,CAACC,GAAGC,MAAQ,CAAC,CAAC,EAAEA,MAAM,GAAG,EAAgBC,MAAM,CAAC;IAAC;IAAO;IAAQ;IAAO;IAAO;IAAU;CAAO;AA6C/J,IAAA,AAAKV,iCAAAA;;;;WAAAA;;AAML,MAAMD,gBAAgBY,OAAOC,MAAM,CAACZ,SAASO,MAAM,GAAG;AACtD,MAAMN,iBAAiB;AACvB,MAAMG,MAAM;AACZ,MAAMF,iBAAiB,KAAK;AAC5B,MAAMJ,iBAAiB"}
package/build/types.d.ts CHANGED
@@ -35,6 +35,9 @@ export interface RunOptions<TContext, TInput> {
35
35
  post?: StepFn<TContext, TInput>;
36
36
  data?: TInput;
37
37
  }
38
+ export interface ExecutorRunOptions<TContext, TInput> extends RunOptions<TContext, TInput> {
39
+ id?: string;
40
+ }
38
41
  export interface WorkerOptions extends Required<BenchmarkOptions> {
39
42
  benchmarkUrl?: string;
40
43
  setupCode?: string;
@@ -59,4 +62,10 @@ export declare const CONTROL_SLOTS: number;
59
62
  export declare const DEFAULT_CYCLES = 1000;
60
63
  export declare const Z95 = 1.96;
61
64
  export declare const DURATION_SCALE = 1000n;
65
+ export declare const COMPLETE_VALUE = 10000;
66
+ export interface ProgressInfo {
67
+ id: string;
68
+ progress: number;
69
+ }
70
+ export type ProgressCallback = (info: ProgressInfo) => void;
62
71
  export {};
package/build/types.js CHANGED
@@ -18,5 +18,6 @@ export const CONTROL_SLOTS = Object.values(Control).length / 2;
18
18
  export const DEFAULT_CYCLES = 1_000;
19
19
  export const Z95 = 1.96;
20
20
  export const DURATION_SCALE = 1000n;
21
+ export const COMPLETE_VALUE = 100_00;
21
22
 
22
23
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface SetupFn<TContext> {\n (): MaybePromise<TContext>;\n}\n\nexport interface TeardownFn<TContext> {\n (ctx: TContext): MaybePromise<void>;\n}\n\nexport interface StepFn<TContext, TInput> {\n (ctx: TContext, input: TInput): MaybePromise<unknown>;\n}\n\nexport interface FeedFn<TInput> {\n (): MaybePromise<TInput>;\n}\n\ntype _Sequence<To extends number, R extends unknown[]> = R['length'] extends To ? R[number] : _Sequence<To, [R['length'], ...R]>;\nexport type Sequence<To extends number> = number extends To ? number : _Sequence<To, []>;\nexport type Between<From extends number, To extends number> = Exclude<Sequence<To>, Sequence<From>>;\n\nexport type ReportType = 'ops' | 'min' | 'max' | 'mean' | 'median' | 'mode' | `p${Between<1, 100>}`;\nexport type ReportTypeList = readonly ReportType[];\nexport const REPORT_TYPES: ReportTypeList = Array.from({ length: 99 }, (_, idx) => `p${idx + 1}` as ReportType).concat(['ops', 'mean', 'min', 'max', 'median', 'mode']);\n\nexport interface ReportOptions<R extends ReportTypeList> {\n reportTypes: R;\n}\n\nexport interface BenchmarkOptions {\n warmupCycles?: number;\n minCycles?: number;\n absThreshold?: number; // ns\n relThreshold?: number; // %\n gcObserver?: boolean;\n}\n\nexport interface RunOptions<TContext, TInput> {\n setup?: SetupFn<TContext>;\n teardown?: TeardownFn<TContext>;\n pre?: StepFn<TContext, TInput>;\n run: StepFn<TContext, TInput>;\n post?: StepFn<TContext, TInput>;\n data?: TInput;\n}\n\nexport interface WorkerOptions extends Required<BenchmarkOptions> {\n benchmarkUrl?: string;\n setupCode?: string;\n teardownCode?: string;\n preCode?: string;\n runCode: string;\n postCode?: string;\n data?: unknown;\n\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport interface Options<TContext, TInput> extends RunOptions<TContext, TInput>, BenchmarkOptions {\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport enum Control {\n INDEX,\n PROGRESS,\n COMPLETE,\n}\n\nexport const CONTROL_SLOTS = Object.values(Control).length / 2;\nexport const DEFAULT_CYCLES = 1_000;\nexport const Z95 = 1.96;\nexport const DURATION_SCALE = 1000n;\n"],"names":["REPORT_TYPES","Array","from","length","_","idx","concat","Control","CONTROL_SLOTS","Object","values","DEFAULT_CYCLES","Z95","DURATION_SCALE"],"mappings":"AAwBA,OAAO,MAAMA,eAA+BC,MAAMC,IAAI,CAAC;IAAEC,QAAQ;AAAG,GAAG,CAACC,GAAGC,MAAQ,CAAC,CAAC,EAAEA,MAAM,GAAG,EAAgBC,MAAM,CAAC;IAAC;IAAO;IAAQ;IAAO;IAAO;IAAU;CAAO,EAAE;AAyCxK,OAAO,IAAA,AAAKC,iCAAAA;;;;WAAAA;MAIX;AAED,OAAO,MAAMC,gBAAgBC,OAAOC,MAAM,CAACH,SAASJ,MAAM,GAAG,EAAE;AAC/D,OAAO,MAAMQ,iBAAiB,MAAM;AACpC,OAAO,MAAMC,MAAM,KAAK;AACxB,OAAO,MAAMC,iBAAiB,KAAK,CAAC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface SetupFn<TContext> {\n (): MaybePromise<TContext>;\n}\n\nexport interface TeardownFn<TContext> {\n (ctx: TContext): MaybePromise<void>;\n}\n\nexport interface StepFn<TContext, TInput> {\n (ctx: TContext, input: TInput): MaybePromise<unknown>;\n}\n\nexport interface FeedFn<TInput> {\n (): MaybePromise<TInput>;\n}\n\ntype _Sequence<To extends number, R extends unknown[]> = R['length'] extends To ? R[number] : _Sequence<To, [R['length'], ...R]>;\nexport type Sequence<To extends number> = number extends To ? number : _Sequence<To, []>;\nexport type Between<From extends number, To extends number> = Exclude<Sequence<To>, Sequence<From>>;\n\nexport type ReportType = 'ops' | 'min' | 'max' | 'mean' | 'median' | 'mode' | `p${Between<1, 100>}`;\nexport type ReportTypeList = readonly ReportType[];\nexport const REPORT_TYPES: ReportTypeList = Array.from({ length: 99 }, (_, idx) => `p${idx + 1}` as ReportType).concat(['ops', 'mean', 'min', 'max', 'median', 'mode']);\n\nexport interface ReportOptions<R extends ReportTypeList> {\n reportTypes: R;\n}\n\nexport interface BenchmarkOptions {\n warmupCycles?: number;\n minCycles?: number;\n absThreshold?: number; // ns\n relThreshold?: number; // %\n gcObserver?: boolean;\n}\n\nexport interface RunOptions<TContext, TInput> {\n setup?: SetupFn<TContext>;\n teardown?: TeardownFn<TContext>;\n pre?: StepFn<TContext, TInput>;\n run: StepFn<TContext, TInput>;\n post?: StepFn<TContext, TInput>;\n data?: TInput;\n}\n\nexport interface ExecutorRunOptions<TContext, TInput> extends RunOptions<TContext, TInput> {\n id?: string;\n}\n\nexport interface WorkerOptions extends Required<BenchmarkOptions> {\n benchmarkUrl?: string;\n setupCode?: string;\n teardownCode?: string;\n preCode?: string;\n runCode: string;\n postCode?: string;\n data?: unknown;\n\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport interface Options<TContext, TInput> extends RunOptions<TContext, TInput>, BenchmarkOptions {\n durationsSAB: SharedArrayBuffer;\n controlSAB: SharedArrayBuffer;\n}\n\nexport enum Control {\n INDEX,\n PROGRESS,\n COMPLETE,\n}\n\nexport const CONTROL_SLOTS = Object.values(Control).length / 2;\nexport const DEFAULT_CYCLES = 1_000;\nexport const Z95 = 1.96;\nexport const DURATION_SCALE = 1000n;\nexport const COMPLETE_VALUE = 100_00;\n\nexport interface ProgressInfo {\n id: string;\n progress: number;\n}\n\nexport type ProgressCallback = (info: ProgressInfo) => void;\n"],"names":["REPORT_TYPES","Array","from","length","_","idx","concat","Control","CONTROL_SLOTS","Object","values","DEFAULT_CYCLES","Z95","DURATION_SCALE","COMPLETE_VALUE"],"mappings":"AAwBA,OAAO,MAAMA,eAA+BC,MAAMC,IAAI,CAAC;IAAEC,QAAQ;AAAG,GAAG,CAACC,GAAGC,MAAQ,CAAC,CAAC,EAAEA,MAAM,GAAG,EAAgBC,MAAM,CAAC;IAAC;IAAO;IAAQ;IAAO;IAAO;IAAU;CAAO,EAAE;AA6CxK,OAAO,IAAA,AAAKC,iCAAAA;;;;WAAAA;MAIX;AAED,OAAO,MAAMC,gBAAgBC,OAAOC,MAAM,CAACH,SAASJ,MAAM,GAAG,EAAE;AAC/D,OAAO,MAAMQ,iBAAiB,MAAM;AACpC,OAAO,MAAMC,MAAM,KAAK;AACxB,OAAO,MAAMC,iBAAiB,KAAK,CAAC;AACpC,OAAO,MAAMC,iBAAiB,OAAO"}