overtake 0.1.2 → 1.0.0-rc.2

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.
Files changed (70) hide show
  1. package/README.md +76 -82
  2. package/bin/overtake.js +2 -0
  3. package/build/__tests__/runner.d.ts +1 -0
  4. package/build/benchmark.cjs +237 -0
  5. package/build/benchmark.cjs.map +1 -0
  6. package/build/benchmark.d.ts +64 -0
  7. package/build/benchmark.js +189 -0
  8. package/build/benchmark.js.map +1 -0
  9. package/build/cli.cjs +149 -0
  10. package/build/cli.cjs.map +1 -0
  11. package/build/cli.d.ts +1 -0
  12. package/build/cli.js +104 -0
  13. package/build/cli.js.map +1 -0
  14. package/build/executor.cjs +68 -0
  15. package/build/executor.cjs.map +1 -0
  16. package/build/executor.d.ts +10 -0
  17. package/build/executor.js +58 -0
  18. package/build/executor.js.map +1 -0
  19. package/build/index.cjs +20 -0
  20. package/build/index.cjs.map +1 -0
  21. package/build/index.d.ts +5 -0
  22. package/build/index.js +3 -0
  23. package/build/index.js.map +1 -0
  24. package/build/queue.cjs +48 -0
  25. package/build/queue.cjs.map +1 -0
  26. package/build/queue.d.ts +3 -0
  27. package/build/queue.js +38 -0
  28. package/build/queue.js.map +1 -0
  29. package/build/reporter.cjs +175 -0
  30. package/build/reporter.cjs.map +1 -0
  31. package/build/reporter.d.ts +11 -0
  32. package/build/reporter.js +157 -0
  33. package/build/reporter.js.map +1 -0
  34. package/build/runner.cjs +92 -0
  35. package/build/runner.cjs.map +1 -0
  36. package/build/runner.d.ts +2 -0
  37. package/build/runner.js +82 -0
  38. package/build/runner.js.map +1 -0
  39. package/build/types.cjs +48 -0
  40. package/build/types.cjs.map +1 -0
  41. package/build/types.d.ts +59 -0
  42. package/build/types.js +21 -0
  43. package/build/types.js.map +1 -0
  44. package/build/utils.cjs +100 -0
  45. package/build/utils.cjs.map +1 -0
  46. package/build/utils.d.ts +20 -0
  47. package/build/utils.js +67 -0
  48. package/build/utils.js.map +1 -0
  49. package/build/worker.cjs +29 -0
  50. package/build/worker.cjs.map +1 -0
  51. package/build/worker.d.ts +1 -0
  52. package/build/worker.js +25 -0
  53. package/build/worker.js.map +1 -0
  54. package/package.json +15 -13
  55. package/src/__tests__/runner.ts +34 -0
  56. package/src/benchmark.ts +231 -0
  57. package/src/cli.ts +114 -0
  58. package/src/executor.ts +73 -0
  59. package/src/index.ts +6 -0
  60. package/src/queue.ts +42 -0
  61. package/src/reporter.ts +139 -0
  62. package/src/runner.ts +111 -0
  63. package/src/types.ts +72 -0
  64. package/src/utils.ts +65 -0
  65. package/src/worker.ts +46 -0
  66. package/tsconfig.json +17 -0
  67. package/cli.js +0 -70
  68. package/index.d.ts +0 -56
  69. package/index.js +0 -303
  70. package/runner.js +0 -3
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "benchmark", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return benchmark;
9
+ }
10
+ });
11
+ const _typescjs = require("./types.cjs");
12
+ const COMPLETE_VALUE = 100_00;
13
+ const runSync = (run)=>{
14
+ return (...args)=>{
15
+ const start = process.hrtime.bigint();
16
+ run(...args);
17
+ return process.hrtime.bigint() - start;
18
+ };
19
+ };
20
+ const runAsync = (run)=>{
21
+ return async (...args)=>{
22
+ const start = process.hrtime.bigint();
23
+ await run(...args);
24
+ return process.hrtime.bigint() - start;
25
+ };
26
+ };
27
+ const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data, warmupCycles, minCycles, absThreshold, relThreshold, durationsSAB, controlSAB })=>{
28
+ const durations = new BigUint64Array(durationsSAB);
29
+ const control = new Int32Array(controlSAB);
30
+ control[_typescjs.Control.INDEX] = 0;
31
+ control[_typescjs.Control.PROGRESS] = 0;
32
+ control[_typescjs.Control.COMPLETE] = 255;
33
+ const context = await setup?.();
34
+ const maxCycles = durations.length;
35
+ try {
36
+ await pre?.(context, data);
37
+ const result = runRaw(context, data);
38
+ await post?.(context, data);
39
+ const run = result instanceof Promise ? runAsync(runRaw) : runSync(runRaw);
40
+ const start = Date.now();
41
+ while(Date.now() - start < 1_000){
42
+ Math.sqrt(Math.random());
43
+ }
44
+ for(let i = 0; i < warmupCycles; i++){
45
+ await pre?.(context, data);
46
+ await run(context, data);
47
+ await post?.(context, data);
48
+ }
49
+ let i = 0;
50
+ let mean = 0n;
51
+ let m2 = 0n;
52
+ while(true){
53
+ if (i >= maxCycles) break;
54
+ await pre?.(context, data);
55
+ const duration = await run(context, data);
56
+ await post?.(context, data);
57
+ durations[i++] = duration;
58
+ const delta = duration - mean;
59
+ mean += delta / BigInt(i);
60
+ m2 += delta * (duration - mean);
61
+ const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;
62
+ control[_typescjs.Control.PROGRESS] = progress;
63
+ if (i >= minCycles) {
64
+ const variance = Number(m2) / (i - 1);
65
+ const stddev = Math.sqrt(variance);
66
+ if (stddev <= Number(absThreshold)) {
67
+ break;
68
+ }
69
+ const meanNum = Number(mean);
70
+ const cov = stddev / (meanNum || 1);
71
+ if (cov <= relThreshold) {
72
+ break;
73
+ }
74
+ }
75
+ }
76
+ control[_typescjs.Control.INDEX] = i;
77
+ control[_typescjs.Control.COMPLETE] = 0;
78
+ } catch (e) {
79
+ console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);
80
+ control[_typescjs.Control.COMPLETE] = 1;
81
+ } finally{
82
+ try {
83
+ await teardown?.(context);
84
+ } catch (e) {
85
+ control[_typescjs.Control.COMPLETE] = 2;
86
+ console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);
87
+ }
88
+ }
89
+ return control[_typescjs.Control.COMPLETE];
90
+ };
91
+
92
+ //# sourceMappingURL=runner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runner.ts"],"sourcesContent":["import { Options, Control } from './types.js';\n\nconst COMPLETE_VALUE = 100_00;\n\nconst runSync = (run: Function) => {\n return (...args: unknown[]) => {\n const start = process.hrtime.bigint();\n run(...args);\n return process.hrtime.bigint() - start;\n };\n};\n\nconst runAsync = (run: Function) => {\n return async (...args: unknown[]) => {\n const start = process.hrtime.bigint();\n await run(...args);\n return process.hrtime.bigint() - start;\n };\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\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 maxCycles = durations.length;\n\n try {\n await pre?.(context, data!);\n const result = runRaw(context, data!);\n await post?.(context, data!);\n const run = result instanceof Promise ? runAsync(runRaw) : runSync(runRaw);\n const start = Date.now();\n while (Date.now() - start < 1_000) {\n Math.sqrt(Math.random());\n }\n for (let i = 0; i < warmupCycles; i++) {\n await pre?.(context, data!);\n await run(context, data);\n await post?.(context, data!);\n }\n\n let i = 0;\n let mean = 0n;\n let m2 = 0n;\n\n while (true) {\n if (i >= maxCycles) break;\n\n await pre?.(context, data!);\n const duration = await run(context, data);\n await post?.(context, data!);\n\n durations[i++] = duration;\n const delta = duration - mean;\n mean += delta / BigInt(i);\n m2 += delta * (duration - mean);\n\n const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;\n control[Control.PROGRESS] = progress;\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 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","runSync","run","args","start","process","hrtime","bigint","runAsync","setup","teardown","pre","runRaw","post","data","warmupCycles","minCycles","absThreshold","relThreshold","durationsSAB","controlSAB","durations","BigUint64Array","control","Int32Array","Control","INDEX","PROGRESS","COMPLETE","context","maxCycles","length","result","Promise","Date","now","Math","sqrt","random","i","mean","m2","duration","delta","BigInt","progress","max","variance","Number","stddev","meanNum","cov","e","console","error","stack"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Options } from './types.js';
2
+ export declare const benchmark: <TContext, TInput>({ setup, teardown, pre, run: runRaw, post, data, warmupCycles, minCycles, absThreshold, relThreshold, durationsSAB, controlSAB, }: Required<Options<TContext, TInput>>) => Promise<number>;
@@ -0,0 +1,82 @@
1
+ import { Control } from "./types.js";
2
+ const COMPLETE_VALUE = 100_00;
3
+ const runSync = (run)=>{
4
+ return (...args)=>{
5
+ const start = process.hrtime.bigint();
6
+ run(...args);
7
+ return process.hrtime.bigint() - start;
8
+ };
9
+ };
10
+ const runAsync = (run)=>{
11
+ return async (...args)=>{
12
+ const start = process.hrtime.bigint();
13
+ await run(...args);
14
+ return process.hrtime.bigint() - start;
15
+ };
16
+ };
17
+ export const benchmark = async ({ setup, teardown, pre, run: runRaw, post, data, warmupCycles, minCycles, absThreshold, relThreshold, durationsSAB, controlSAB })=>{
18
+ const durations = new BigUint64Array(durationsSAB);
19
+ const control = new Int32Array(controlSAB);
20
+ control[Control.INDEX] = 0;
21
+ control[Control.PROGRESS] = 0;
22
+ control[Control.COMPLETE] = 255;
23
+ const context = await setup?.();
24
+ const maxCycles = durations.length;
25
+ try {
26
+ await pre?.(context, data);
27
+ const result = runRaw(context, data);
28
+ await post?.(context, data);
29
+ const run = result instanceof Promise ? runAsync(runRaw) : runSync(runRaw);
30
+ const start = Date.now();
31
+ while(Date.now() - start < 1_000){
32
+ Math.sqrt(Math.random());
33
+ }
34
+ for(let i = 0; i < warmupCycles; i++){
35
+ await pre?.(context, data);
36
+ await run(context, data);
37
+ await post?.(context, data);
38
+ }
39
+ let i = 0;
40
+ let mean = 0n;
41
+ let m2 = 0n;
42
+ while(true){
43
+ if (i >= maxCycles) break;
44
+ await pre?.(context, data);
45
+ const duration = await run(context, data);
46
+ await post?.(context, data);
47
+ durations[i++] = duration;
48
+ const delta = duration - mean;
49
+ mean += delta / BigInt(i);
50
+ m2 += delta * (duration - mean);
51
+ const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;
52
+ control[Control.PROGRESS] = progress;
53
+ if (i >= minCycles) {
54
+ const variance = Number(m2) / (i - 1);
55
+ const stddev = Math.sqrt(variance);
56
+ if (stddev <= Number(absThreshold)) {
57
+ break;
58
+ }
59
+ const meanNum = Number(mean);
60
+ const cov = stddev / (meanNum || 1);
61
+ if (cov <= relThreshold) {
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ control[Control.INDEX] = i;
67
+ control[Control.COMPLETE] = 0;
68
+ } catch (e) {
69
+ console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);
70
+ control[Control.COMPLETE] = 1;
71
+ } finally{
72
+ try {
73
+ await teardown?.(context);
74
+ } catch (e) {
75
+ control[Control.COMPLETE] = 2;
76
+ console.error(e && typeof e === 'object' && 'stack' in e ? e.stack : e);
77
+ }
78
+ }
79
+ return control[Control.COMPLETE];
80
+ };
81
+
82
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runner.ts"],"sourcesContent":["import { Options, Control } from './types.js';\n\nconst COMPLETE_VALUE = 100_00;\n\nconst runSync = (run: Function) => {\n return (...args: unknown[]) => {\n const start = process.hrtime.bigint();\n run(...args);\n return process.hrtime.bigint() - start;\n };\n};\n\nconst runAsync = (run: Function) => {\n return async (...args: unknown[]) => {\n const start = process.hrtime.bigint();\n await run(...args);\n return process.hrtime.bigint() - start;\n };\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\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 maxCycles = durations.length;\n\n try {\n await pre?.(context, data!);\n const result = runRaw(context, data!);\n await post?.(context, data!);\n const run = result instanceof Promise ? runAsync(runRaw) : runSync(runRaw);\n const start = Date.now();\n while (Date.now() - start < 1_000) {\n Math.sqrt(Math.random());\n }\n for (let i = 0; i < warmupCycles; i++) {\n await pre?.(context, data!);\n await run(context, data);\n await post?.(context, data!);\n }\n\n let i = 0;\n let mean = 0n;\n let m2 = 0n;\n\n while (true) {\n if (i >= maxCycles) break;\n\n await pre?.(context, data!);\n const duration = await run(context, data);\n await post?.(context, data!);\n\n durations[i++] = duration;\n const delta = duration - mean;\n mean += delta / BigInt(i);\n m2 += delta * (duration - mean);\n\n const progress = Math.max(i / maxCycles) * COMPLETE_VALUE;\n control[Control.PROGRESS] = progress;\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 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":["Control","COMPLETE_VALUE","runSync","run","args","start","process","hrtime","bigint","runAsync","benchmark","setup","teardown","pre","runRaw","post","data","warmupCycles","minCycles","absThreshold","relThreshold","durationsSAB","controlSAB","durations","BigUint64Array","control","Int32Array","INDEX","PROGRESS","COMPLETE","context","maxCycles","length","result","Promise","Date","now","Math","sqrt","random","i","mean","m2","duration","delta","BigInt","progress","max","variance","Number","stddev","meanNum","cov","e","console","error","stack"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ CONTROL_SLOTS: function() {
13
+ return CONTROL_SLOTS;
14
+ },
15
+ Control: function() {
16
+ return Control;
17
+ },
18
+ DEFAULT_CYCLES: function() {
19
+ return DEFAULT_CYCLES;
20
+ },
21
+ REPORT_TYPES: function() {
22
+ return REPORT_TYPES;
23
+ },
24
+ Z95: function() {
25
+ return Z95;
26
+ }
27
+ });
28
+ const REPORT_TYPES = Array.from({
29
+ length: 99
30
+ }, (_, idx)=>`p${idx + 1}`).concat([
31
+ 'ops',
32
+ 'mean',
33
+ 'min',
34
+ 'max',
35
+ 'median',
36
+ 'mode'
37
+ ]);
38
+ var Control = /*#__PURE__*/ function(Control) {
39
+ Control[Control["INDEX"] = 0] = "INDEX";
40
+ Control[Control["PROGRESS"] = 1] = "PROGRESS";
41
+ Control[Control["COMPLETE"] = 2] = "COMPLETE";
42
+ return Control;
43
+ }({});
44
+ const CONTROL_SLOTS = Object.values(Control).length / 2;
45
+ const DEFAULT_CYCLES = 1_000;
46
+ const Z95 = 1.96;
47
+
48
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +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<void>;\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}\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 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;\n"],"names":["CONTROL_SLOTS","Control","DEFAULT_CYCLES","REPORT_TYPES","Z95","Array","from","length","_","idx","concat","Object","values"],"mappings":";;;;;;;;;;;IAqEaA,aAAa;eAAbA;;IANDC,OAAO;eAAPA;;IAOCC,cAAc;eAAdA;;IA9CAC,YAAY;eAAZA;;IA+CAC,GAAG;eAAHA;;;AA/CN,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;AAuC/J,IAAA,AAAKT,iCAAAA;;;;WAAAA;;AAML,MAAMD,gBAAgBW,OAAOC,MAAM,CAACX,SAASM,MAAM,GAAG;AACtD,MAAML,iBAAiB;AACvB,MAAME,MAAM"}
@@ -0,0 +1,59 @@
1
+ export type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;
2
+ export interface SetupFn<TContext> {
3
+ (): MaybePromise<TContext>;
4
+ }
5
+ export interface TeardownFn<TContext> {
6
+ (ctx: TContext): MaybePromise<void>;
7
+ }
8
+ export interface StepFn<TContext, TInput> {
9
+ (ctx: TContext, input: TInput): MaybePromise<void>;
10
+ }
11
+ export interface FeedFn<TInput> {
12
+ (): MaybePromise<TInput>;
13
+ }
14
+ type _Sequence<To extends number, R extends unknown[]> = R['length'] extends To ? R[number] : _Sequence<To, [R['length'], ...R]>;
15
+ export type Sequence<To extends number> = number extends To ? number : _Sequence<To, []>;
16
+ export type Between<From extends number, To extends number> = Exclude<Sequence<To>, Sequence<From>>;
17
+ export type ReportType = 'ops' | 'min' | 'max' | 'mean' | 'median' | 'mode' | `p${Between<1, 100>}`;
18
+ export type ReportTypeList = readonly ReportType[];
19
+ export declare const REPORT_TYPES: ReportTypeList;
20
+ export interface ReportOptions<R extends ReportTypeList> {
21
+ reportTypes: R;
22
+ }
23
+ export interface BenchmarkOptions {
24
+ warmupCycles?: number;
25
+ minCycles?: number;
26
+ absThreshold?: number;
27
+ relThreshold?: number;
28
+ }
29
+ export interface RunOptions<TContext, TInput> {
30
+ setup?: SetupFn<TContext>;
31
+ teardown?: TeardownFn<TContext>;
32
+ pre?: StepFn<TContext, TInput>;
33
+ run: StepFn<TContext, TInput>;
34
+ post?: StepFn<TContext, TInput>;
35
+ data?: TInput;
36
+ }
37
+ export interface WorkerOptions extends Required<BenchmarkOptions> {
38
+ setupCode?: string;
39
+ teardownCode?: string;
40
+ preCode?: string;
41
+ runCode: string;
42
+ postCode?: string;
43
+ data?: unknown;
44
+ durationsSAB: SharedArrayBuffer;
45
+ controlSAB: SharedArrayBuffer;
46
+ }
47
+ export interface Options<TContext, TInput> extends RunOptions<TContext, TInput>, BenchmarkOptions {
48
+ durationsSAB: SharedArrayBuffer;
49
+ controlSAB: SharedArrayBuffer;
50
+ }
51
+ export declare enum Control {
52
+ INDEX = 0,
53
+ PROGRESS = 1,
54
+ COMPLETE = 2
55
+ }
56
+ export declare const CONTROL_SLOTS: number;
57
+ export declare const DEFAULT_CYCLES = 1000;
58
+ export declare const Z95 = 1.96;
59
+ export {};
package/build/types.js ADDED
@@ -0,0 +1,21 @@
1
+ export const REPORT_TYPES = Array.from({
2
+ length: 99
3
+ }, (_, idx)=>`p${idx + 1}`).concat([
4
+ 'ops',
5
+ 'mean',
6
+ 'min',
7
+ 'max',
8
+ 'median',
9
+ 'mode'
10
+ ]);
11
+ export var Control = /*#__PURE__*/ function(Control) {
12
+ Control[Control["INDEX"] = 0] = "INDEX";
13
+ Control[Control["PROGRESS"] = 1] = "PROGRESS";
14
+ Control[Control["COMPLETE"] = 2] = "COMPLETE";
15
+ return Control;
16
+ }({});
17
+ export const CONTROL_SLOTS = Object.values(Control).length / 2;
18
+ export const DEFAULT_CYCLES = 1_000;
19
+ export const Z95 = 1.96;
20
+
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +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<void>;\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}\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 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;\n"],"names":["REPORT_TYPES","Array","from","length","_","idx","concat","Control","CONTROL_SLOTS","Object","values","DEFAULT_CYCLES","Z95"],"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;AAuCxK,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"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ ScaledBigInt: function() {
13
+ return ScaledBigInt;
14
+ },
15
+ abs: function() {
16
+ return abs;
17
+ },
18
+ cmp: function() {
19
+ return cmp;
20
+ },
21
+ div: function() {
22
+ return div;
23
+ },
24
+ divMod: function() {
25
+ return divMod;
26
+ },
27
+ divs: function() {
28
+ return divs;
29
+ },
30
+ max: function() {
31
+ return max;
32
+ }
33
+ });
34
+ const abs = (value)=>{
35
+ if (value < 0n) {
36
+ return -value;
37
+ }
38
+ return value;
39
+ };
40
+ const cmp = (a, b)=>{
41
+ if (a > b) {
42
+ return 1;
43
+ }
44
+ if (a < b) {
45
+ return -1;
46
+ }
47
+ return 0;
48
+ };
49
+ const max = (a, b)=>{
50
+ if (a > b) {
51
+ return a;
52
+ }
53
+ return b;
54
+ };
55
+ const divMod = (a, b)=>{
56
+ return {
57
+ quotient: a / b,
58
+ remainder: a % b
59
+ };
60
+ };
61
+ function div(a, b, decimals = 2) {
62
+ if (b === 0n) throw new RangeError('Division by zero');
63
+ const scale = 10n ** BigInt(decimals);
64
+ const scaled = a * scale / b;
65
+ const intPart = scaled / scale;
66
+ const fracPart = scaled % scale;
67
+ return `${intPart}.${fracPart.toString().padStart(decimals, '0')}`;
68
+ }
69
+ function divs(a, b, scale) {
70
+ if (b === 0n) throw new RangeError('Division by zero');
71
+ return a * scale / b;
72
+ }
73
+ class ScaledBigInt {
74
+ value;
75
+ scale;
76
+ constructor(value, scale){
77
+ this.value = value;
78
+ this.scale = scale;
79
+ }
80
+ add(value) {
81
+ this.value += value * this.scale;
82
+ }
83
+ sub(value) {
84
+ this.value -= value * this.scale;
85
+ }
86
+ div(value) {
87
+ this.value /= value;
88
+ }
89
+ mul(value) {
90
+ this.value *= value;
91
+ }
92
+ unscale() {
93
+ return this.value / this.value;
94
+ }
95
+ number() {
96
+ return Number(div(this.value, this.scale));
97
+ }
98
+ }
99
+
100
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["export const abs = (value: bigint) => {\n if (value < 0n) {\n return -value;\n }\n return value;\n};\nexport const cmp = (a: bigint | number, b: bigint | number): number => {\n if (a > b) {\n return 1;\n }\n if (a < b) {\n return -1;\n }\n return 0;\n};\n\nexport const max = (a: bigint, b: bigint) => {\n if (a > b) {\n return a;\n }\n return b;\n};\n\nexport const divMod = (a: bigint, b: bigint) => {\n return { quotient: a / b, remainder: a % b };\n};\n\nexport function div(a: bigint, b: bigint, decimals: number = 2): string {\n if (b === 0n) throw new RangeError('Division by zero');\n const scale = 10n ** BigInt(decimals);\n const scaled = (a * scale) / b;\n const intPart = scaled / scale;\n const fracPart = scaled % scale;\n return `${intPart}.${fracPart.toString().padStart(decimals, '0')}`;\n}\n\nexport function divs(a: bigint, b: bigint, scale: bigint): bigint {\n if (b === 0n) throw new RangeError('Division by zero');\n return (a * scale) / b;\n}\n\nexport class ScaledBigInt {\n constructor(\n public value: bigint,\n public scale: bigint,\n ) {}\n add(value: bigint) {\n this.value += value * this.scale;\n }\n sub(value: bigint) {\n this.value -= value * this.scale;\n }\n div(value: bigint) {\n this.value /= value;\n }\n mul(value: bigint) {\n this.value *= value;\n }\n unscale() {\n return this.value / this.value;\n }\n number() {\n return Number(div(this.value, this.scale));\n }\n}\n"],"names":["ScaledBigInt","abs","cmp","div","divMod","divs","max","value","a","b","quotient","remainder","decimals","RangeError","scale","BigInt","scaled","intPart","fracPart","toString","padStart","constructor","add","sub","mul","unscale","number","Number"],"mappings":";;;;;;;;;;;IAyCaA,YAAY;eAAZA;;IAzCAC,GAAG;eAAHA;;IAMAC,GAAG;eAAHA;;IAqBGC,GAAG;eAAHA;;IAJHC,MAAM;eAANA;;IAaGC,IAAI;eAAJA;;IApBHC,GAAG;eAAHA;;;AAhBN,MAAML,MAAM,CAACM;IAClB,IAAIA,QAAQ,EAAE,EAAE;QACd,OAAO,CAACA;IACV;IACA,OAAOA;AACT;AACO,MAAML,MAAM,CAACM,GAAoBC;IACtC,IAAID,IAAIC,GAAG;QACT,OAAO;IACT;IACA,IAAID,IAAIC,GAAG;QACT,OAAO,CAAC;IACV;IACA,OAAO;AACT;AAEO,MAAMH,MAAM,CAACE,GAAWC;IAC7B,IAAID,IAAIC,GAAG;QACT,OAAOD;IACT;IACA,OAAOC;AACT;AAEO,MAAML,SAAS,CAACI,GAAWC;IAChC,OAAO;QAAEC,UAAUF,IAAIC;QAAGE,WAAWH,IAAIC;IAAE;AAC7C;AAEO,SAASN,IAAIK,CAAS,EAAEC,CAAS,EAAEG,WAAmB,CAAC;IAC5D,IAAIH,MAAM,EAAE,EAAE,MAAM,IAAII,WAAW;IACnC,MAAMC,QAAQ,GAAG,IAAIC,OAAOH;IAC5B,MAAMI,SAAS,AAACR,IAAIM,QAASL;IAC7B,MAAMQ,UAAUD,SAASF;IACzB,MAAMI,WAAWF,SAASF;IAC1B,OAAO,GAAGG,QAAQ,CAAC,EAAEC,SAASC,QAAQ,GAAGC,QAAQ,CAACR,UAAU,MAAM;AACpE;AAEO,SAASP,KAAKG,CAAS,EAAEC,CAAS,EAAEK,KAAa;IACtD,IAAIL,MAAM,EAAE,EAAE,MAAM,IAAII,WAAW;IACnC,OAAO,AAACL,IAAIM,QAASL;AACvB;AAEO,MAAMT;;;IACXqB,YACE,AAAOd,KAAa,EACpB,AAAOO,KAAa,CACpB;aAFOP,QAAAA;aACAO,QAAAA;IACN;IACHQ,IAAIf,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA,QAAQ,IAAI,CAACO,KAAK;IAClC;IACAS,IAAIhB,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA,QAAQ,IAAI,CAACO,KAAK;IAClC;IACAX,IAAII,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA;IAChB;IACAiB,IAAIjB,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA;IAChB;IACAkB,UAAU;QACR,OAAO,IAAI,CAAClB,KAAK,GAAG,IAAI,CAACA,KAAK;IAChC;IACAmB,SAAS;QACP,OAAOC,OAAOxB,IAAI,IAAI,CAACI,KAAK,EAAE,IAAI,CAACO,KAAK;IAC1C;AACF"}
@@ -0,0 +1,20 @@
1
+ export declare const abs: (value: bigint) => bigint;
2
+ export declare const cmp: (a: bigint | number, b: bigint | number) => number;
3
+ export declare const max: (a: bigint, b: bigint) => bigint;
4
+ export declare const divMod: (a: bigint, b: bigint) => {
5
+ quotient: bigint;
6
+ remainder: bigint;
7
+ };
8
+ export declare function div(a: bigint, b: bigint, decimals?: number): string;
9
+ export declare function divs(a: bigint, b: bigint, scale: bigint): bigint;
10
+ export declare class ScaledBigInt {
11
+ value: bigint;
12
+ scale: bigint;
13
+ constructor(value: bigint, scale: bigint);
14
+ add(value: bigint): void;
15
+ sub(value: bigint): void;
16
+ div(value: bigint): void;
17
+ mul(value: bigint): void;
18
+ unscale(): bigint;
19
+ number(): number;
20
+ }
package/build/utils.js ADDED
@@ -0,0 +1,67 @@
1
+ export const abs = (value)=>{
2
+ if (value < 0n) {
3
+ return -value;
4
+ }
5
+ return value;
6
+ };
7
+ export const cmp = (a, b)=>{
8
+ if (a > b) {
9
+ return 1;
10
+ }
11
+ if (a < b) {
12
+ return -1;
13
+ }
14
+ return 0;
15
+ };
16
+ export const max = (a, b)=>{
17
+ if (a > b) {
18
+ return a;
19
+ }
20
+ return b;
21
+ };
22
+ export const divMod = (a, b)=>{
23
+ return {
24
+ quotient: a / b,
25
+ remainder: a % b
26
+ };
27
+ };
28
+ export function div(a, b, decimals = 2) {
29
+ if (b === 0n) throw new RangeError('Division by zero');
30
+ const scale = 10n ** BigInt(decimals);
31
+ const scaled = a * scale / b;
32
+ const intPart = scaled / scale;
33
+ const fracPart = scaled % scale;
34
+ return `${intPart}.${fracPart.toString().padStart(decimals, '0')}`;
35
+ }
36
+ export function divs(a, b, scale) {
37
+ if (b === 0n) throw new RangeError('Division by zero');
38
+ return a * scale / b;
39
+ }
40
+ export class ScaledBigInt {
41
+ value;
42
+ scale;
43
+ constructor(value, scale){
44
+ this.value = value;
45
+ this.scale = scale;
46
+ }
47
+ add(value) {
48
+ this.value += value * this.scale;
49
+ }
50
+ sub(value) {
51
+ this.value -= value * this.scale;
52
+ }
53
+ div(value) {
54
+ this.value /= value;
55
+ }
56
+ mul(value) {
57
+ this.value *= value;
58
+ }
59
+ unscale() {
60
+ return this.value / this.value;
61
+ }
62
+ number() {
63
+ return Number(div(this.value, this.scale));
64
+ }
65
+ }
66
+
67
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["export const abs = (value: bigint) => {\n if (value < 0n) {\n return -value;\n }\n return value;\n};\nexport const cmp = (a: bigint | number, b: bigint | number): number => {\n if (a > b) {\n return 1;\n }\n if (a < b) {\n return -1;\n }\n return 0;\n};\n\nexport const max = (a: bigint, b: bigint) => {\n if (a > b) {\n return a;\n }\n return b;\n};\n\nexport const divMod = (a: bigint, b: bigint) => {\n return { quotient: a / b, remainder: a % b };\n};\n\nexport function div(a: bigint, b: bigint, decimals: number = 2): string {\n if (b === 0n) throw new RangeError('Division by zero');\n const scale = 10n ** BigInt(decimals);\n const scaled = (a * scale) / b;\n const intPart = scaled / scale;\n const fracPart = scaled % scale;\n return `${intPart}.${fracPart.toString().padStart(decimals, '0')}`;\n}\n\nexport function divs(a: bigint, b: bigint, scale: bigint): bigint {\n if (b === 0n) throw new RangeError('Division by zero');\n return (a * scale) / b;\n}\n\nexport class ScaledBigInt {\n constructor(\n public value: bigint,\n public scale: bigint,\n ) {}\n add(value: bigint) {\n this.value += value * this.scale;\n }\n sub(value: bigint) {\n this.value -= value * this.scale;\n }\n div(value: bigint) {\n this.value /= value;\n }\n mul(value: bigint) {\n this.value *= value;\n }\n unscale() {\n return this.value / this.value;\n }\n number() {\n return Number(div(this.value, this.scale));\n }\n}\n"],"names":["abs","value","cmp","a","b","max","divMod","quotient","remainder","div","decimals","RangeError","scale","BigInt","scaled","intPart","fracPart","toString","padStart","divs","ScaledBigInt","constructor","add","sub","mul","unscale","number","Number"],"mappings":"AAAA,OAAO,MAAMA,MAAM,CAACC;IAClB,IAAIA,QAAQ,EAAE,EAAE;QACd,OAAO,CAACA;IACV;IACA,OAAOA;AACT,EAAE;AACF,OAAO,MAAMC,MAAM,CAACC,GAAoBC;IACtC,IAAID,IAAIC,GAAG;QACT,OAAO;IACT;IACA,IAAID,IAAIC,GAAG;QACT,OAAO,CAAC;IACV;IACA,OAAO;AACT,EAAE;AAEF,OAAO,MAAMC,MAAM,CAACF,GAAWC;IAC7B,IAAID,IAAIC,GAAG;QACT,OAAOD;IACT;IACA,OAAOC;AACT,EAAE;AAEF,OAAO,MAAME,SAAS,CAACH,GAAWC;IAChC,OAAO;QAAEG,UAAUJ,IAAIC;QAAGI,WAAWL,IAAIC;IAAE;AAC7C,EAAE;AAEF,OAAO,SAASK,IAAIN,CAAS,EAAEC,CAAS,EAAEM,WAAmB,CAAC;IAC5D,IAAIN,MAAM,EAAE,EAAE,MAAM,IAAIO,WAAW;IACnC,MAAMC,QAAQ,GAAG,IAAIC,OAAOH;IAC5B,MAAMI,SAAS,AAACX,IAAIS,QAASR;IAC7B,MAAMW,UAAUD,SAASF;IACzB,MAAMI,WAAWF,SAASF;IAC1B,OAAO,GAAGG,QAAQ,CAAC,EAAEC,SAASC,QAAQ,GAAGC,QAAQ,CAACR,UAAU,MAAM;AACpE;AAEA,OAAO,SAASS,KAAKhB,CAAS,EAAEC,CAAS,EAAEQ,KAAa;IACtD,IAAIR,MAAM,EAAE,EAAE,MAAM,IAAIO,WAAW;IACnC,OAAO,AAACR,IAAIS,QAASR;AACvB;AAEA,OAAO,MAAMgB;;;IACXC,YACE,AAAOpB,KAAa,EACpB,AAAOW,KAAa,CACpB;aAFOX,QAAAA;aACAW,QAAAA;IACN;IACHU,IAAIrB,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA,QAAQ,IAAI,CAACW,KAAK;IAClC;IACAW,IAAItB,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA,QAAQ,IAAI,CAACW,KAAK;IAClC;IACAH,IAAIR,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA;IAChB;IACAuB,IAAIvB,KAAa,EAAE;QACjB,IAAI,CAACA,KAAK,IAAIA;IAChB;IACAwB,UAAU;QACR,OAAO,IAAI,CAACxB,KAAK,GAAG,IAAI,CAACA,KAAK;IAChC;IACAyB,SAAS;QACP,OAAOC,OAAOlB,IAAI,IAAI,CAACR,KAAK,EAAE,IAAI,CAACW,KAAK;IAC1C;AACF"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _nodeworker_threads = require("node:worker_threads");
6
+ const _runnercjs = require("./runner.cjs");
7
+ const { setupCode, teardownCode, preCode, runCode, postCode, data, warmupCycles, minCycles, absThreshold, relThreshold, durationsSAB, controlSAB } = _nodeworker_threads.workerData;
8
+ const setup = setupCode && Function(`return ${setupCode};`)();
9
+ const teardown = teardownCode && Function(`return ${teardownCode};`)();
10
+ const pre = preCode && Function(`return ${preCode};`)();
11
+ const run = runCode && Function(`return ${runCode};`)();
12
+ const post = postCode && Function(`return ${postCode};`)();
13
+ const exitCode = await (0, _runnercjs.benchmark)({
14
+ setup,
15
+ teardown,
16
+ pre,
17
+ run,
18
+ post,
19
+ data,
20
+ warmupCycles,
21
+ minCycles,
22
+ absThreshold,
23
+ relThreshold,
24
+ durationsSAB,
25
+ controlSAB
26
+ });
27
+ process.exit(exitCode);
28
+
29
+ //# sourceMappingURL=worker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/worker.ts"],"sourcesContent":["import { workerData } from 'node:worker_threads';\nimport { benchmark } from './runner.js';\nimport { SetupFn, TeardownFn, StepFn, WorkerOptions } from './types.js';\n\nconst {\n setupCode,\n teardownCode,\n preCode,\n runCode,\n postCode,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n\n durationsSAB,\n controlSAB,\n}: WorkerOptions = workerData;\n\nconst setup: SetupFn<unknown> = setupCode && Function(`return ${setupCode};`)();\nconst teardown: TeardownFn<unknown> = teardownCode && Function(`return ${teardownCode};`)();\n\nconst pre: StepFn<unknown, unknown> = preCode && Function(`return ${preCode};`)();\nconst run: StepFn<unknown, unknown> = runCode && Function(`return ${runCode};`)();\nconst post: StepFn<unknown, unknown> = postCode && Function(`return ${postCode};`)();\n\nconst exitCode = await benchmark({\n setup,\n teardown,\n pre,\n run,\n post,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n\n durationsSAB,\n controlSAB,\n});\n\nprocess.exit(exitCode);\n"],"names":["setupCode","teardownCode","preCode","runCode","postCode","data","warmupCycles","minCycles","absThreshold","relThreshold","durationsSAB","controlSAB","workerData","setup","Function","teardown","pre","run","post","exitCode","benchmark","process","exit"],"mappings":";;;;oCAA2B;2BACD;AAG1B,MAAM,EACJA,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,OAAO,EACPC,QAAQ,EACRC,IAAI,EAEJC,YAAY,EACZC,SAAS,EACTC,YAAY,EACZC,YAAY,EAEZC,YAAY,EACZC,UAAU,EACX,GAAkBC,8BAAU;AAE7B,MAAMC,QAA0Bb,aAAac,SAAS,CAAC,OAAO,EAAEd,UAAU,CAAC,CAAC;AAC5E,MAAMe,WAAgCd,gBAAgBa,SAAS,CAAC,OAAO,EAAEb,aAAa,CAAC,CAAC;AAExF,MAAMe,MAAgCd,WAAWY,SAAS,CAAC,OAAO,EAAEZ,QAAQ,CAAC,CAAC;AAC9E,MAAMe,MAAgCd,WAAWW,SAAS,CAAC,OAAO,EAAEX,QAAQ,CAAC,CAAC;AAC9E,MAAMe,OAAiCd,YAAYU,SAAS,CAAC,OAAO,EAAEV,SAAS,CAAC,CAAC;AAEjF,MAAMe,WAAW,MAAMC,IAAAA,oBAAS,EAAC;IAC/BP;IACAE;IACAC;IACAC;IACAC;IACAb;IAEAC;IACAC;IACAC;IACAC;IAEAC;IACAC;AACF;AAEAU,QAAQC,IAAI,CAACH"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { workerData } from 'node:worker_threads';
2
+ import { benchmark } from "./runner.js";
3
+ const { setupCode, teardownCode, preCode, runCode, postCode, data, warmupCycles, minCycles, absThreshold, relThreshold, durationsSAB, controlSAB } = workerData;
4
+ const setup = setupCode && Function(`return ${setupCode};`)();
5
+ const teardown = teardownCode && Function(`return ${teardownCode};`)();
6
+ const pre = preCode && Function(`return ${preCode};`)();
7
+ const run = runCode && Function(`return ${runCode};`)();
8
+ const post = postCode && Function(`return ${postCode};`)();
9
+ const exitCode = await benchmark({
10
+ setup,
11
+ teardown,
12
+ pre,
13
+ run,
14
+ post,
15
+ data,
16
+ warmupCycles,
17
+ minCycles,
18
+ absThreshold,
19
+ relThreshold,
20
+ durationsSAB,
21
+ controlSAB
22
+ });
23
+ process.exit(exitCode);
24
+
25
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/worker.ts"],"sourcesContent":["import { workerData } from 'node:worker_threads';\nimport { benchmark } from './runner.js';\nimport { SetupFn, TeardownFn, StepFn, WorkerOptions } from './types.js';\n\nconst {\n setupCode,\n teardownCode,\n preCode,\n runCode,\n postCode,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n\n durationsSAB,\n controlSAB,\n}: WorkerOptions = workerData;\n\nconst setup: SetupFn<unknown> = setupCode && Function(`return ${setupCode};`)();\nconst teardown: TeardownFn<unknown> = teardownCode && Function(`return ${teardownCode};`)();\n\nconst pre: StepFn<unknown, unknown> = preCode && Function(`return ${preCode};`)();\nconst run: StepFn<unknown, unknown> = runCode && Function(`return ${runCode};`)();\nconst post: StepFn<unknown, unknown> = postCode && Function(`return ${postCode};`)();\n\nconst exitCode = await benchmark({\n setup,\n teardown,\n pre,\n run,\n post,\n data,\n\n warmupCycles,\n minCycles,\n absThreshold,\n relThreshold,\n\n durationsSAB,\n controlSAB,\n});\n\nprocess.exit(exitCode);\n"],"names":["workerData","benchmark","setupCode","teardownCode","preCode","runCode","postCode","data","warmupCycles","minCycles","absThreshold","relThreshold","durationsSAB","controlSAB","setup","Function","teardown","pre","run","post","exitCode","process","exit"],"mappings":"AAAA,SAASA,UAAU,QAAQ,sBAAsB;AACjD,SAASC,SAAS,QAAQ,cAAc;AAGxC,MAAM,EACJC,SAAS,EACTC,YAAY,EACZC,OAAO,EACPC,OAAO,EACPC,QAAQ,EACRC,IAAI,EAEJC,YAAY,EACZC,SAAS,EACTC,YAAY,EACZC,YAAY,EAEZC,YAAY,EACZC,UAAU,EACX,GAAkBb;AAEnB,MAAMc,QAA0BZ,aAAaa,SAAS,CAAC,OAAO,EAAEb,UAAU,CAAC,CAAC;AAC5E,MAAMc,WAAgCb,gBAAgBY,SAAS,CAAC,OAAO,EAAEZ,aAAa,CAAC,CAAC;AAExF,MAAMc,MAAgCb,WAAWW,SAAS,CAAC,OAAO,EAAEX,QAAQ,CAAC,CAAC;AAC9E,MAAMc,MAAgCb,WAAWU,SAAS,CAAC,OAAO,EAAEV,QAAQ,CAAC,CAAC;AAC9E,MAAMc,OAAiCb,YAAYS,SAAS,CAAC,OAAO,EAAET,SAAS,CAAC,CAAC;AAEjF,MAAMc,WAAW,MAAMnB,UAAU;IAC/Ba;IACAE;IACAC;IACAC;IACAC;IACAZ;IAEAC;IACAC;IACAC;IACAC;IAEAC;IACAC;AACF;AAEAQ,QAAQC,IAAI,CAACF"}