overtake 1.3.2 → 2.0.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.
Files changed (56) hide show
  1. package/README.md +12 -15
  2. package/bin/overtake.js +1 -1
  3. package/build/executor.d.ts +8 -3
  4. package/build/index.d.ts +10 -11
  5. package/build/reporter.d.ts +10 -2
  6. package/build/runner.d.ts +1 -1
  7. package/build/types.d.ts +7 -7
  8. package/build/utils.d.ts +3 -17
  9. package/package.json +8 -26
  10. package/src/__tests__/assert-no-closure.ts +135 -0
  11. package/src/__tests__/benchmark-execute.ts +48 -0
  12. package/src/cli.ts +139 -144
  13. package/src/executor.ts +59 -24
  14. package/src/index.ts +135 -68
  15. package/src/reporter.ts +77 -125
  16. package/src/runner.ts +28 -25
  17. package/src/types.ts +9 -9
  18. package/src/utils.ts +62 -46
  19. package/src/worker.ts +13 -12
  20. package/tsconfig.json +3 -1
  21. package/build/cli.cjs +0 -179
  22. package/build/cli.cjs.map +0 -1
  23. package/build/cli.js +0 -134
  24. package/build/cli.js.map +0 -1
  25. package/build/executor.cjs +0 -116
  26. package/build/executor.cjs.map +0 -1
  27. package/build/executor.js +0 -106
  28. package/build/executor.js.map +0 -1
  29. package/build/gc-watcher.cjs +0 -30
  30. package/build/gc-watcher.cjs.map +0 -1
  31. package/build/gc-watcher.js +0 -20
  32. package/build/gc-watcher.js.map +0 -1
  33. package/build/index.cjs +0 -400
  34. package/build/index.cjs.map +0 -1
  35. package/build/index.js +0 -335
  36. package/build/index.js.map +0 -1
  37. package/build/reporter.cjs +0 -364
  38. package/build/reporter.cjs.map +0 -1
  39. package/build/reporter.js +0 -346
  40. package/build/reporter.js.map +0 -1
  41. package/build/runner.cjs +0 -528
  42. package/build/runner.cjs.map +0 -1
  43. package/build/runner.js +0 -518
  44. package/build/runner.js.map +0 -1
  45. package/build/types.cjs +0 -66
  46. package/build/types.cjs.map +0 -1
  47. package/build/types.js +0 -33
  48. package/build/types.js.map +0 -1
  49. package/build/utils.cjs +0 -121
  50. package/build/utils.cjs.map +0 -1
  51. package/build/utils.js +0 -85
  52. package/build/utils.js.map +0 -1
  53. package/build/worker.cjs +0 -158
  54. package/build/worker.cjs.map +0 -1
  55. package/build/worker.js +0 -113
  56. package/build/worker.js.map +0 -1
package/build/index.cjs DELETED
@@ -1,400 +0,0 @@
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: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get AsyncFunction () {
13
- return AsyncFunction;
14
- },
15
- get Benchmark () {
16
- return Benchmark;
17
- },
18
- get DEFAULT_REPORT_TYPES () {
19
- return DEFAULT_REPORT_TYPES;
20
- },
21
- get DEFAULT_WORKERS () {
22
- return DEFAULT_WORKERS;
23
- },
24
- get FeedContext () {
25
- return FeedContext;
26
- },
27
- get Measure () {
28
- return Measure;
29
- },
30
- get MeasureContext () {
31
- return MeasureContext;
32
- },
33
- get Target () {
34
- return Target;
35
- },
36
- get TargetContext () {
37
- return TargetContext;
38
- },
39
- get printComparisonReports () {
40
- return printComparisonReports;
41
- },
42
- get printHistogramReports () {
43
- return printHistogramReports;
44
- },
45
- get printJSONReports () {
46
- return printJSONReports;
47
- },
48
- get printMarkdownReports () {
49
- return printMarkdownReports;
50
- },
51
- get printSimpleReports () {
52
- return printSimpleReports;
53
- },
54
- get printTableReports () {
55
- return printTableReports;
56
- },
57
- get reportsToBaseline () {
58
- return reportsToBaseline;
59
- }
60
- });
61
- const _nodeos = require("node:os");
62
- const _progress = /*#__PURE__*/ _interop_require_default(require("progress"));
63
- const _executorcjs = require("./executor.cjs");
64
- const _typescjs = require("./types.cjs");
65
- function _interop_require_default(obj) {
66
- return obj && obj.__esModule ? obj : {
67
- default: obj
68
- };
69
- }
70
- const DEFAULT_WORKERS = (0, _nodeos.cpus)().length;
71
- const AsyncFunction = (async ()=>{}).constructor;
72
- const BENCHMARK_URL = Symbol.for('overtake.benchmarkUrl');
73
- const DEFAULT_REPORT_TYPES = [
74
- 'ops'
75
- ];
76
- class MeasureContext {
77
- title;
78
- run;
79
- pre;
80
- post;
81
- constructor(title, run){
82
- this.title = title;
83
- this.run = run;
84
- }
85
- }
86
- class Measure {
87
- #ctx;
88
- constructor(ctx){
89
- this.#ctx = ctx;
90
- }
91
- pre(fn) {
92
- this.#ctx.pre = fn;
93
- return this;
94
- }
95
- post(fn) {
96
- this.#ctx.post = fn;
97
- return this;
98
- }
99
- }
100
- class TargetContext {
101
- title;
102
- setup;
103
- teardown;
104
- measures = [];
105
- constructor(title, setup){
106
- this.title = title;
107
- this.setup = setup;
108
- }
109
- }
110
- class Target {
111
- #ctx;
112
- constructor(ctx){
113
- this.#ctx = ctx;
114
- }
115
- teardown(fn) {
116
- this.#ctx.teardown = fn;
117
- return this;
118
- }
119
- measure(title, run) {
120
- const measure = new MeasureContext(title, run);
121
- this.#ctx.measures.push(measure);
122
- return new Measure(measure);
123
- }
124
- }
125
- class FeedContext {
126
- title;
127
- fn;
128
- constructor(title, fn){
129
- this.title = title;
130
- this.fn = fn;
131
- }
132
- }
133
- class Benchmark {
134
- #targets = [];
135
- #feeds = [];
136
- #executed = false;
137
- static create(title, fn) {
138
- if (fn) {
139
- return new Benchmark(title, fn);
140
- } else {
141
- return new Benchmark(title);
142
- }
143
- }
144
- constructor(title, fn){
145
- if (fn) {
146
- this.feed(title, fn);
147
- } else {
148
- this.feed(title);
149
- }
150
- }
151
- feed(title, fn) {
152
- const self = this;
153
- self.#feeds.push(fn ? new FeedContext(title, fn) : new FeedContext(title));
154
- return self;
155
- }
156
- target(title, setup) {
157
- const target = new TargetContext(title, setup);
158
- this.#targets.push(target);
159
- return new Target(target);
160
- }
161
- async execute(options) {
162
- const { workers = DEFAULT_WORKERS, warmupCycles = 20, maxCycles = _typescjs.DEFAULT_CYCLES, minCycles = 50, absThreshold = 1_000, relThreshold = 0.02, gcObserver = true, reportTypes = DEFAULT_REPORT_TYPES, progress = false, progressInterval = 100 } = options;
163
- if (this.#executed) {
164
- throw new Error("Benchmark is executed and can't be reused");
165
- }
166
- this.#executed = true;
167
- const benchmarkUrl = options[BENCHMARK_URL];
168
- const totalBenchmarks = this.#targets.reduce((acc, t)=>acc + t.measures.length * this.#feeds.length, 0);
169
- const progressMap = new Map();
170
- let completedBenchmarks = 0;
171
- let bar = null;
172
- if (progress && totalBenchmarks > 0) {
173
- bar = new _progress.default(' [:bar] :percent :current/:total :label', {
174
- total: totalBenchmarks * 100,
175
- width: 30,
176
- complete: '=',
177
- incomplete: ' '
178
- });
179
- }
180
- const onProgress = progress ? (info)=>{
181
- progressMap.set(info.id, info.progress);
182
- const totalProgress = (completedBenchmarks + [
183
- ...progressMap.values()
184
- ].reduce((a, b)=>a + b, 0)) * 100;
185
- const label = info.id.length > 30 ? info.id.slice(0, 27) + '...' : info.id;
186
- bar?.update(totalProgress / (totalBenchmarks * 100), {
187
- label
188
- });
189
- } : undefined;
190
- const executor = (0, _executorcjs.createExecutor)({
191
- workers,
192
- warmupCycles,
193
- maxCycles,
194
- minCycles,
195
- absThreshold,
196
- relThreshold,
197
- gcObserver,
198
- reportTypes,
199
- onProgress,
200
- progressInterval,
201
- [BENCHMARK_URL]: benchmarkUrl
202
- });
203
- const reports = [];
204
- for (const target of this.#targets){
205
- const targetReport = {
206
- target: target.title,
207
- measures: []
208
- };
209
- for (const measure of target.measures){
210
- const measureReport = {
211
- measure: measure.title,
212
- feeds: []
213
- };
214
- for (const feed of this.#feeds){
215
- const id = `${target.title}/${measure.title}/${feed.title}`;
216
- const data = await feed.fn?.();
217
- executor.push({
218
- id,
219
- setup: target.setup,
220
- teardown: target.teardown,
221
- pre: measure.pre,
222
- run: measure.run,
223
- post: measure.post,
224
- data
225
- }).then((data)=>{
226
- progressMap.delete(id);
227
- completedBenchmarks++;
228
- measureReport.feeds.push({
229
- feed: feed.title,
230
- data
231
- });
232
- });
233
- }
234
- targetReport.measures.push(measureReport);
235
- }
236
- reports.push(targetReport);
237
- }
238
- await executor.drain();
239
- executor.kill();
240
- if (bar) {
241
- bar.update(1, {
242
- label: 'done'
243
- });
244
- bar.terminate();
245
- }
246
- return reports;
247
- }
248
- }
249
- const printSimpleReports = (reports)=>{
250
- for (const report of reports){
251
- for (const { measure, feeds } of report.measures){
252
- console.group('\n', report.target, measure);
253
- for (const { feed, data } of feeds){
254
- const { count, heapUsedKB, dceWarning, ...metrics } = data;
255
- const output = Object.entries(metrics).map(([key, report])=>`${key}: ${report.toString()}`).join('; ');
256
- const extras = [];
257
- if (heapUsedKB) extras.push(`heap: ${heapUsedKB}KB`);
258
- if (dceWarning) extras.push('\x1b[33m[DCE warning]\x1b[0m');
259
- const extrasStr = extras.length > 0 ? ` (${extras.join(', ')})` : '';
260
- console.log(feed, output + extrasStr);
261
- }
262
- console.groupEnd();
263
- }
264
- }
265
- };
266
- const printTableReports = (reports)=>{
267
- for (const report of reports){
268
- for (const { measure, feeds } of report.measures){
269
- console.log('\n', report.target, measure);
270
- const table = {};
271
- for (const { feed, data } of feeds){
272
- table[feed] = Object.fromEntries(Object.entries(data).map(([key, report])=>[
273
- key,
274
- report.toString()
275
- ]));
276
- }
277
- console.table(table);
278
- }
279
- }
280
- };
281
- const printJSONReports = (reports, padding)=>{
282
- const output = {};
283
- for (const report of reports){
284
- for (const { measure, feeds } of report.measures){
285
- const row = {};
286
- for (const { feed, data } of feeds){
287
- row[feed] = Object.fromEntries(Object.entries(data).map(([key, report])=>[
288
- key,
289
- report.toString()
290
- ]));
291
- }
292
- output[`${report.target} ${measure}`] = row;
293
- }
294
- }
295
- console.log(JSON.stringify(output, null, padding));
296
- };
297
- const printMarkdownReports = (reports)=>{
298
- for (const report of reports){
299
- for (const { measure, feeds } of report.measures){
300
- console.log(`\n## ${report.target} - ${measure}\n`);
301
- if (feeds.length === 0) continue;
302
- const keys = Object.keys(feeds[0].data).filter((k)=>k !== 'count');
303
- const header = [
304
- 'Feed',
305
- ...keys
306
- ].join(' | ');
307
- const separator = [
308
- '---',
309
- ...keys.map(()=>'---')
310
- ].join(' | ');
311
- console.log(`| ${header} |`);
312
- console.log(`| ${separator} |`);
313
- for (const { feed, data } of feeds){
314
- const values = keys.map((k)=>data[k]?.toString() ?? '-');
315
- console.log(`| ${[
316
- feed,
317
- ...values
318
- ].join(' | ')} |`);
319
- }
320
- }
321
- }
322
- };
323
- const printHistogramReports = (reports, width = 40)=>{
324
- for (const report of reports){
325
- for (const { measure, feeds } of report.measures){
326
- console.log(`\n${report.target} - ${measure}\n`);
327
- const opsKey = 'ops';
328
- const values = feeds.map((f)=>({
329
- feed: f.feed,
330
- value: f.data[opsKey]?.valueOf() ?? 0
331
- }));
332
- const maxValue = Math.max(...values.map((v)=>v.value));
333
- const maxLabelLen = Math.max(...values.map((v)=>v.feed.length));
334
- for (const { feed, value } of values){
335
- const barLen = maxValue > 0 ? Math.round(value / maxValue * width) : 0;
336
- const bar = '\u2588'.repeat(barLen);
337
- const label = feed.padEnd(maxLabelLen);
338
- const formatted = value.toLocaleString('en-US', {
339
- maximumFractionDigits: 2
340
- });
341
- console.log(` ${label} | ${bar} ${formatted} ops/s`);
342
- }
343
- }
344
- }
345
- };
346
- const reportsToBaseline = (reports)=>{
347
- const results = {};
348
- for (const report of reports){
349
- for (const { measure, feeds } of report.measures){
350
- for (const { feed, data } of feeds){
351
- const key = `${report.target}/${measure}/${feed}`;
352
- results[key] = {};
353
- for (const [metric, value] of Object.entries(data)){
354
- if (metric !== 'count' && typeof value.valueOf === 'function') {
355
- results[key][metric] = value.valueOf();
356
- }
357
- }
358
- }
359
- }
360
- }
361
- return {
362
- version: 1,
363
- timestamp: new Date().toISOString(),
364
- results
365
- };
366
- };
367
- const printComparisonReports = (reports, baseline, threshold = 5)=>{
368
- for (const report of reports){
369
- for (const { measure, feeds } of report.measures){
370
- console.log(`\n${report.target} - ${measure}\n`);
371
- for (const { feed, data } of feeds){
372
- const key = `${report.target}/${measure}/${feed}`;
373
- const baselineData = baseline.results[key];
374
- console.log(` ${feed}:`);
375
- for (const [metric, value] of Object.entries(data)){
376
- if (metric === 'count') continue;
377
- const current = value.valueOf();
378
- const baselineValue = baselineData?.[metric];
379
- if (baselineValue !== undefined && baselineValue !== 0) {
380
- const change = (current - baselineValue) / baselineValue * 100;
381
- const isOps = metric === 'ops';
382
- const improved = isOps ? change > threshold : change < -threshold;
383
- const regressed = isOps ? change < -threshold : change > threshold;
384
- let indicator = ' ';
385
- if (improved) indicator = '\x1b[32m+\x1b[0m';
386
- else if (regressed) indicator = '\x1b[31m!\x1b[0m';
387
- const changeStr = change >= 0 ? `+${change.toFixed(1)}%` : `${change.toFixed(1)}%`;
388
- const coloredChange = regressed ? `\x1b[31m${changeStr}\x1b[0m` : improved ? `\x1b[32m${changeStr}\x1b[0m` : changeStr;
389
- console.log(` ${indicator} ${metric}: ${value.toString()} (${coloredChange})`);
390
- } else {
391
- console.log(` * ${metric}: ${value.toString()} (new)`);
392
- }
393
- }
394
- }
395
- }
396
- }
397
- console.log(`\nBaseline from: ${baseline.timestamp}`);
398
- };
399
-
400
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
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 { count, heapUsedKB, dceWarning, ...metrics } = data as Record<string, unknown>;\n const output = Object.entries(metrics)\n .map(([key, report]) => `${key}: ${(report as { toString(): string }).toString()}`)\n .join('; ');\n const extras: string[] = [];\n if (heapUsedKB) extras.push(`heap: ${heapUsedKB}KB`);\n if (dceWarning) extras.push('\\x1b[33m[DCE warning]\\x1b[0m');\n const extrasStr = extras.length > 0 ? ` (${extras.join(', ')})` : '';\n console.log(feed, output + extrasStr);\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\nexport const printMarkdownReports = <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`);\n if (feeds.length === 0) continue;\n\n const keys = Object.keys(feeds[0].data).filter((k) => k !== 'count');\n const header = ['Feed', ...keys].join(' | ');\n const separator = ['---', ...keys.map(() => '---')].join(' | ');\n\n console.log(`| ${header} |`);\n console.log(`| ${separator} |`);\n\n for (const { feed, data } of feeds) {\n const values = keys.map((k) => (data as Record<string, { toString(): string }>)[k]?.toString() ?? '-');\n console.log(`| ${[feed, ...values].join(' | ')} |`);\n }\n }\n }\n};\n\nexport const printHistogramReports = <R extends ReportTypeList>(reports: TargetReport<R>[], width = 40) => {\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n console.log(`\\n${report.target} - ${measure}\\n`);\n\n const opsKey = 'ops';\n const values = feeds.map((f) => ({\n feed: f.feed,\n value: (f.data as Record<string, { valueOf(): number }>)[opsKey]?.valueOf() ?? 0,\n }));\n\n const maxValue = Math.max(...values.map((v) => v.value));\n const maxLabelLen = Math.max(...values.map((v) => v.feed.length));\n\n for (const { feed, value } of values) {\n const barLen = maxValue > 0 ? Math.round((value / maxValue) * width) : 0;\n const bar = '\\u2588'.repeat(barLen);\n const label = feed.padEnd(maxLabelLen);\n const formatted = value.toLocaleString('en-US', { maximumFractionDigits: 2 });\n console.log(` ${label} | ${bar} ${formatted} ops/s`);\n }\n }\n }\n};\n\nexport interface BaselineData {\n version: number;\n timestamp: string;\n results: Record<string, Record<string, number>>;\n}\n\nexport const reportsToBaseline = <R extends ReportTypeList>(reports: TargetReport<R>[]): BaselineData => {\n const results: Record<string, Record<string, number>> = {};\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n for (const { feed, data } of feeds) {\n const key = `${report.target}/${measure}/${feed}`;\n results[key] = {};\n for (const [metric, value] of Object.entries(data)) {\n if (metric !== 'count' && typeof (value as { valueOf(): number }).valueOf === 'function') {\n results[key][metric] = (value as { valueOf(): number }).valueOf();\n }\n }\n }\n }\n }\n return {\n version: 1,\n timestamp: new Date().toISOString(),\n results,\n };\n};\n\nexport const printComparisonReports = <R extends ReportTypeList>(reports: TargetReport<R>[], baseline: BaselineData, threshold = 5) => {\n for (const report of reports) {\n for (const { measure, feeds } of report.measures) {\n console.log(`\\n${report.target} - ${measure}\\n`);\n\n for (const { feed, data } of feeds) {\n const key = `${report.target}/${measure}/${feed}`;\n const baselineData = baseline.results[key];\n\n console.log(` ${feed}:`);\n\n for (const [metric, value] of Object.entries(data)) {\n if (metric === 'count') continue;\n const current = (value as { valueOf(): number }).valueOf();\n const baselineValue = baselineData?.[metric];\n\n if (baselineValue !== undefined && baselineValue !== 0) {\n const change = ((current - baselineValue) / baselineValue) * 100;\n const isOps = metric === 'ops';\n const improved = isOps ? change > threshold : change < -threshold;\n const regressed = isOps ? change < -threshold : change > threshold;\n\n let indicator = ' ';\n if (improved) indicator = '\\x1b[32m+\\x1b[0m';\n else if (regressed) indicator = '\\x1b[31m!\\x1b[0m';\n\n const changeStr = change >= 0 ? `+${change.toFixed(1)}%` : `${change.toFixed(1)}%`;\n const coloredChange = regressed ? `\\x1b[31m${changeStr}\\x1b[0m` : improved ? `\\x1b[32m${changeStr}\\x1b[0m` : changeStr;\n\n console.log(` ${indicator} ${metric}: ${(value as { toString(): string }).toString()} (${coloredChange})`);\n } else {\n console.log(` * ${metric}: ${(value as { toString(): string }).toString()} (new)`);\n }\n }\n }\n }\n }\n\n console.log(`\\nBaseline from: ${baseline.timestamp}`);\n};\n"],"names":["AsyncFunction","Benchmark","DEFAULT_REPORT_TYPES","DEFAULT_WORKERS","FeedContext","Measure","MeasureContext","Target","TargetContext","printComparisonReports","printHistogramReports","printJSONReports","printMarkdownReports","printSimpleReports","printTableReports","reportsToBaseline","cpus","length","BENCHMARK_URL","Symbol","for","pre","post","title","run","ctx","fn","teardown","measures","setup","measure","push","create","feed","self","target","execute","options","workers","warmupCycles","maxCycles","DEFAULT_CYCLES","minCycles","absThreshold","relThreshold","gcObserver","reportTypes","progress","progressInterval","Error","benchmarkUrl","totalBenchmarks","reduce","acc","t","progressMap","Map","completedBenchmarks","bar","Progress","total","width","complete","incomplete","onProgress","info","set","id","totalProgress","values","a","b","label","slice","update","undefined","executor","createExecutor","reports","targetReport","measureReport","feeds","data","then","delete","drain","kill","terminate","report","console","group","count","heapUsedKB","dceWarning","metrics","output","Object","entries","map","key","toString","join","extras","extrasStr","log","groupEnd","table","fromEntries","padding","row","JSON","stringify","keys","filter","k","header","separator","opsKey","f","value","valueOf","maxValue","Math","max","v","maxLabelLen","barLen","round","repeat","padEnd","formatted","toLocaleString","maximumFractionDigits","results","metric","version","timestamp","Date","toISOString","baseline","threshold","baselineData","current","baselineValue","change","isOps","improved","regressed","indicator","changeStr","toFixed","coloredChange"],"mappings":"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"}