@10up/block-renderer-benchmark 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/comparison.d.ts +29 -0
- package/dist/analysis/comparison.d.ts.map +1 -0
- package/dist/analysis/comparison.js +94 -0
- package/dist/analysis/comparison.js.map +1 -0
- package/dist/analysis/index.d.ts +6 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +6 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/regression.d.ts +34 -0
- package/dist/analysis/regression.d.ts.map +1 -0
- package/dist/analysis/regression.js +63 -0
- package/dist/analysis/regression.js.map +1 -0
- package/dist/cli/commands/compare.d.ts +9 -0
- package/dist/cli/commands/compare.d.ts.map +1 -0
- package/dist/cli/commands/compare.js +142 -0
- package/dist/cli/commands/compare.js.map +1 -0
- package/dist/cli/commands/report.d.ts +9 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +158 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +107 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +165 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/console-reporter.d.ts +47 -0
- package/dist/reporters/console-reporter.d.ts.map +1 -0
- package/dist/reporters/console-reporter.js +191 -0
- package/dist/reporters/console-reporter.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +6 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/markdown-reporter.d.ts +32 -0
- package/dist/reporters/markdown-reporter.d.ts.map +1 -0
- package/dist/reporters/markdown-reporter.js +133 -0
- package/dist/reporters/markdown-reporter.js.map +1 -0
- package/dist/runner/benchmark-runner.d.ts +37 -0
- package/dist/runner/benchmark-runner.d.ts.map +1 -0
- package/dist/runner/benchmark-runner.js +133 -0
- package/dist/runner/benchmark-runner.js.map +1 -0
- package/dist/runner/index.d.ts +6 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +6 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/timing.d.ts +43 -0
- package/dist/runner/timing.d.ts.map +1 -0
- package/dist/runner/timing.js +115 -0
- package/dist/runner/timing.js.map +1 -0
- package/dist/runner/vitest-reporter.d.ts +38 -0
- package/dist/runner/vitest-reporter.d.ts.map +1 -0
- package/dist/runner/vitest-reporter.js +134 -0
- package/dist/runner/vitest-reporter.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/json-storage.d.ts +59 -0
- package/dist/storage/json-storage.d.ts.map +1 -0
- package/dist/storage/json-storage.js +142 -0
- package/dist/storage/json-storage.js.map +1 -0
- package/dist/storage/sqlite-storage.d.ts +72 -0
- package/dist/storage/sqlite-storage.d.ts.map +1 -0
- package/dist/storage/sqlite-storage.js +305 -0
- package/dist/storage/sqlite-storage.js.map +1 -0
- package/dist/types.d.ts +253 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run benchmarks command
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import { DEFAULT_BASELINE_PATH } from '../../storage/json-storage.js';
|
|
8
|
+
/**
|
|
9
|
+
* Find the project root (where package.json with workspaces is)
|
|
10
|
+
*/
|
|
11
|
+
function findProjectRoot() {
|
|
12
|
+
let dir = process.cwd();
|
|
13
|
+
while (dir !== path.dirname(dir)) {
|
|
14
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
15
|
+
if (fs.existsSync(pkgPath)) {
|
|
16
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
17
|
+
if (pkg.workspaces || fs.existsSync(path.join(dir, 'pnpm-workspace.yaml'))) {
|
|
18
|
+
return dir;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
dir = path.dirname(dir);
|
|
22
|
+
}
|
|
23
|
+
return process.cwd();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Run the benchmark command
|
|
27
|
+
*/
|
|
28
|
+
export async function runCommand(options) {
|
|
29
|
+
const projectRoot = findProjectRoot();
|
|
30
|
+
const benchmarkPackages = ['renderer', 'block-schemas', 'theme-json'];
|
|
31
|
+
// Filter packages if specified
|
|
32
|
+
const packages = options.package
|
|
33
|
+
? benchmarkPackages.filter((p) => p === options.package)
|
|
34
|
+
: benchmarkPackages;
|
|
35
|
+
if (packages.length === 0) {
|
|
36
|
+
console.error(`Unknown package: ${options.package}`);
|
|
37
|
+
console.error(`Available packages: ${benchmarkPackages.join(', ')}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
console.log('Running benchmarks...\n');
|
|
41
|
+
// Run vitest bench for each package
|
|
42
|
+
for (const pkg of packages) {
|
|
43
|
+
console.log(`\n=== ${pkg} ===\n`);
|
|
44
|
+
const pkgDir = path.join(projectRoot, 'packages', pkg);
|
|
45
|
+
const benchDir = path.join(pkgDir, 'src', '__benchmarks__');
|
|
46
|
+
if (!fs.existsSync(benchDir)) {
|
|
47
|
+
console.log(`No benchmarks found for ${pkg}`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Build args for vitest bench
|
|
51
|
+
const vitestArgs = ['vitest', 'bench', '--run'];
|
|
52
|
+
if (options.filter) {
|
|
53
|
+
vitestArgs.push('--testNamePattern', options.filter);
|
|
54
|
+
}
|
|
55
|
+
// Run vitest bench
|
|
56
|
+
await runVitest(pkgDir, vitestArgs, options.verbose || false);
|
|
57
|
+
}
|
|
58
|
+
console.log('\nBenchmarks complete!');
|
|
59
|
+
// Note about baseline update
|
|
60
|
+
if (options.baseline) {
|
|
61
|
+
console.log('\nTo update baseline, run the benchmarks and manually copy results.');
|
|
62
|
+
console.log(`Baseline path: ${path.join(projectRoot, DEFAULT_BASELINE_PATH)}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Run vitest in a package directory
|
|
67
|
+
*/
|
|
68
|
+
function runVitest(cwd, args, verbose) {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
const proc = spawn('npx', args, {
|
|
71
|
+
cwd,
|
|
72
|
+
stdio: verbose ? 'inherit' : ['pipe', 'pipe', 'pipe'],
|
|
73
|
+
shell: true,
|
|
74
|
+
});
|
|
75
|
+
let stdout = '';
|
|
76
|
+
let stderr = '';
|
|
77
|
+
if (!verbose) {
|
|
78
|
+
proc.stdout?.on('data', (data) => {
|
|
79
|
+
stdout += data.toString();
|
|
80
|
+
});
|
|
81
|
+
proc.stderr?.on('data', (data) => {
|
|
82
|
+
stderr += data.toString();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
proc.on('close', (code) => {
|
|
86
|
+
if (!verbose && stdout) {
|
|
87
|
+
console.log(stdout);
|
|
88
|
+
}
|
|
89
|
+
if (code === 0) {
|
|
90
|
+
resolve();
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
if (!verbose && stderr) {
|
|
94
|
+
console.error(stderr);
|
|
95
|
+
}
|
|
96
|
+
// Don't reject on non-zero exit, just resolve
|
|
97
|
+
// Benchmarks might not have all dependencies yet
|
|
98
|
+
resolve();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
proc.on('error', (err) => {
|
|
102
|
+
console.error(`Failed to run vitest: ${err.message}`);
|
|
103
|
+
resolve();
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC;gBAC3E,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB;IAClD,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IAEtE,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;QAC9B,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;QACxD,CAAC,CAAC,iBAAiB,CAAC;IAEtB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,oCAAoC;IACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,6BAA6B;IAC7B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,IAAc,EAAE,OAAgB;IAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC9B,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YACrD,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC;gBACD,8CAA8C;gBAC9C,iDAAiD;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Benchmark CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for running benchmarks and comparing results.
|
|
6
|
+
*/
|
|
7
|
+
import { runCommand } from './commands/run.js';
|
|
8
|
+
import { compareCommand } from './commands/compare.js';
|
|
9
|
+
import { reportCommand } from './commands/report.js';
|
|
10
|
+
function parseArgs() {
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const result = { command: 'help' };
|
|
13
|
+
if (args.length === 0) {
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
const command = args[0];
|
|
17
|
+
if (['run', 'compare', 'report', 'help'].includes(command)) {
|
|
18
|
+
result.command = command;
|
|
19
|
+
}
|
|
20
|
+
else if (command === '--help' || command === '-h') {
|
|
21
|
+
result.command = 'help';
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
for (let i = 1; i < args.length; i++) {
|
|
25
|
+
const arg = args[i];
|
|
26
|
+
switch (arg) {
|
|
27
|
+
case '--package':
|
|
28
|
+
case '-p':
|
|
29
|
+
result.package = args[++i];
|
|
30
|
+
break;
|
|
31
|
+
case '--filter':
|
|
32
|
+
case '-f':
|
|
33
|
+
result.filter = args[++i];
|
|
34
|
+
break;
|
|
35
|
+
case '--baseline':
|
|
36
|
+
case '-b':
|
|
37
|
+
result.baseline = args[++i];
|
|
38
|
+
break;
|
|
39
|
+
case '--current':
|
|
40
|
+
case '-c':
|
|
41
|
+
result.current = args[++i];
|
|
42
|
+
break;
|
|
43
|
+
case '--threshold':
|
|
44
|
+
case '-t':
|
|
45
|
+
result.threshold = parseFloat(args[++i]);
|
|
46
|
+
break;
|
|
47
|
+
case '--format':
|
|
48
|
+
result.format = args[++i];
|
|
49
|
+
break;
|
|
50
|
+
case '--output':
|
|
51
|
+
case '-o':
|
|
52
|
+
result.output = args[++i];
|
|
53
|
+
break;
|
|
54
|
+
case '--update-baseline':
|
|
55
|
+
result.updateBaseline = true;
|
|
56
|
+
break;
|
|
57
|
+
case '--json':
|
|
58
|
+
result.json = true;
|
|
59
|
+
break;
|
|
60
|
+
case '--db':
|
|
61
|
+
result.dbPath = args[++i];
|
|
62
|
+
break;
|
|
63
|
+
case '--history':
|
|
64
|
+
result.history = parseInt(args[++i], 10);
|
|
65
|
+
break;
|
|
66
|
+
case '--fail-on-regression':
|
|
67
|
+
result.failOnRegression = true;
|
|
68
|
+
break;
|
|
69
|
+
case '--verbose':
|
|
70
|
+
case '-v':
|
|
71
|
+
result.verbose = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
function printHelp() {
|
|
78
|
+
console.log(`
|
|
79
|
+
benchmark - Performance benchmarking for block-renderer
|
|
80
|
+
|
|
81
|
+
Usage: benchmark <command> [options]
|
|
82
|
+
|
|
83
|
+
Commands:
|
|
84
|
+
run Run benchmarks
|
|
85
|
+
compare Compare benchmark results against baseline
|
|
86
|
+
report Generate a benchmark report
|
|
87
|
+
|
|
88
|
+
Run Options:
|
|
89
|
+
-p, --package <name> Only benchmark specific package
|
|
90
|
+
-f, --filter <pattern> Filter benchmarks by name pattern
|
|
91
|
+
--update-baseline Update baseline JSON after run
|
|
92
|
+
--json Output results as JSON
|
|
93
|
+
--db <path> Path to SQLite database
|
|
94
|
+
-v, --verbose Verbose output
|
|
95
|
+
|
|
96
|
+
Compare Options:
|
|
97
|
+
-b, --baseline <path> Baseline to compare against (file path or 'latest')
|
|
98
|
+
-c, --current <path> Current results to compare (default: latest run)
|
|
99
|
+
-t, --threshold <n> Regression threshold percentage (default: 10)
|
|
100
|
+
--format <fmt> Output format: console, markdown, json
|
|
101
|
+
-o, --output <path> Output file path
|
|
102
|
+
--fail-on-regression Exit with code 1 if regression detected
|
|
103
|
+
|
|
104
|
+
Report Options:
|
|
105
|
+
--history <n> Number of runs to include (default: 10)
|
|
106
|
+
--format <fmt> Output format: console, markdown, json
|
|
107
|
+
-o, --output <path> Output file path
|
|
108
|
+
|
|
109
|
+
Examples:
|
|
110
|
+
# Run all benchmarks
|
|
111
|
+
benchmark run
|
|
112
|
+
|
|
113
|
+
# Run benchmarks for renderer package only
|
|
114
|
+
benchmark run --package renderer
|
|
115
|
+
|
|
116
|
+
# Run and update baseline
|
|
117
|
+
benchmark run --update-baseline
|
|
118
|
+
|
|
119
|
+
# Compare current with baseline
|
|
120
|
+
benchmark compare --baseline benchmarks/baselines/baseline.json
|
|
121
|
+
|
|
122
|
+
# Generate markdown report
|
|
123
|
+
benchmark report --format markdown --output report.md
|
|
124
|
+
`);
|
|
125
|
+
}
|
|
126
|
+
async function main() {
|
|
127
|
+
const args = parseArgs();
|
|
128
|
+
switch (args.command) {
|
|
129
|
+
case 'run':
|
|
130
|
+
await runCommand({
|
|
131
|
+
package: args.package,
|
|
132
|
+
filter: args.filter,
|
|
133
|
+
baseline: args.updateBaseline,
|
|
134
|
+
json: args.json,
|
|
135
|
+
dbPath: args.dbPath,
|
|
136
|
+
verbose: args.verbose,
|
|
137
|
+
});
|
|
138
|
+
break;
|
|
139
|
+
case 'compare':
|
|
140
|
+
await compareCommand({
|
|
141
|
+
baseline: args.baseline || 'benchmarks/baselines/baseline.json',
|
|
142
|
+
current: args.current,
|
|
143
|
+
threshold: args.threshold,
|
|
144
|
+
format: args.format,
|
|
145
|
+
output: args.output,
|
|
146
|
+
failOnRegression: args.failOnRegression,
|
|
147
|
+
});
|
|
148
|
+
break;
|
|
149
|
+
case 'report':
|
|
150
|
+
await reportCommand({
|
|
151
|
+
history: args.history,
|
|
152
|
+
format: args.format,
|
|
153
|
+
output: args.output,
|
|
154
|
+
});
|
|
155
|
+
break;
|
|
156
|
+
case 'help':
|
|
157
|
+
default:
|
|
158
|
+
printHelp();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
main().catch((error) => {
|
|
162
|
+
console.error('Error:', error);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmBrD,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAY,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAE5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,GAAG,OAA6B,CAAC;IACjD,CAAC;SAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,YAAY,CAAC;YAClB,KAAK,IAAI;gBACP,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,aAAa,CAAC;YACnB,KAAK,IAAI;gBACP,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAoC,CAAC;gBAC7D,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,mBAAmB;gBACtB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzC,MAAM;YACR,KAAK,sBAAsB;gBACzB,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC/B,MAAM;YACR,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBACtB,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Cb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,KAAK;YACR,MAAM,UAAU,CAAC;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,cAAc;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,MAAM;QAER,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,oCAAoC;gBAC/D,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC,CAAC;YACH,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,MAAM;QAER,KAAK,MAAM,CAAC;QACZ;YACE,SAAS,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @10up/block-renderer-benchmark
|
|
3
|
+
*
|
|
4
|
+
* Performance benchmarking for block-renderer
|
|
5
|
+
*/
|
|
6
|
+
export type { TimingStats, MemoryStats, BenchmarkMeasurement, EnvironmentInfo, GitInfo, BenchmarkRun, BenchmarkConfig, BaselineEntry, BaselineFile, ComparisonResult, ComparisonSummary, RegressionThresholds, RunOptions, CompareOptions, ReportOptions, } from './types.js';
|
|
7
|
+
export { DEFAULT_BENCHMARK_CONFIG, DEFAULT_REGRESSION_THRESHOLDS, } from './types.js';
|
|
8
|
+
export { runBenchmark, runBenchmarks, collectTimingStats } from './runner/benchmark-runner.js';
|
|
9
|
+
export { calculateStats, percentile } from './runner/timing.js';
|
|
10
|
+
export { JsonStorage } from './storage/json-storage.js';
|
|
11
|
+
export { SqliteStorage } from './storage/sqlite-storage.js';
|
|
12
|
+
export { compareMeasurements, compareBaselines, summarizeComparison } from './analysis/comparison.js';
|
|
13
|
+
export { detectRegression, detectImprovement } from './analysis/regression.js';
|
|
14
|
+
export { ConsoleReporter } from './reporters/console-reporter.js';
|
|
15
|
+
export { MarkdownReporter } from './reporters/markdown-reporter.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG/E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @10up/block-renderer-benchmark
|
|
3
|
+
*
|
|
4
|
+
* Performance benchmarking for block-renderer
|
|
5
|
+
*/
|
|
6
|
+
export { DEFAULT_BENCHMARK_CONFIG, DEFAULT_REGRESSION_THRESHOLDS, } from './types.js';
|
|
7
|
+
// Runner
|
|
8
|
+
export { runBenchmark, runBenchmarks, collectTimingStats } from './runner/benchmark-runner.js';
|
|
9
|
+
export { calculateStats, percentile } from './runner/timing.js';
|
|
10
|
+
// Storage
|
|
11
|
+
export { JsonStorage } from './storage/json-storage.js';
|
|
12
|
+
export { SqliteStorage } from './storage/sqlite-storage.js';
|
|
13
|
+
// Analysis
|
|
14
|
+
export { compareMeasurements, compareBaselines, summarizeComparison } from './analysis/comparison.js';
|
|
15
|
+
export { detectRegression, detectImprovement } from './analysis/regression.js';
|
|
16
|
+
// Reporters
|
|
17
|
+
export { ConsoleReporter } from './reporters/console-reporter.js';
|
|
18
|
+
export { MarkdownReporter } from './reporters/markdown-reporter.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqBH,OAAO,EACL,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhE,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console reporter for benchmark results
|
|
3
|
+
*/
|
|
4
|
+
import type { BenchmarkRun, BenchmarkMeasurement, ComparisonSummary } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Console reporter for benchmark output
|
|
7
|
+
*/
|
|
8
|
+
export declare class ConsoleReporter {
|
|
9
|
+
constructor(_useColors?: boolean);
|
|
10
|
+
/**
|
|
11
|
+
* Report a benchmark run
|
|
12
|
+
*/
|
|
13
|
+
reportRun(run: BenchmarkRun): void;
|
|
14
|
+
/**
|
|
15
|
+
* Report individual measurements
|
|
16
|
+
*/
|
|
17
|
+
reportMeasurements(measurements: BenchmarkMeasurement[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Report a comparison summary
|
|
20
|
+
*/
|
|
21
|
+
reportComparison(summary: ComparisonSummary): void;
|
|
22
|
+
/**
|
|
23
|
+
* Print a header
|
|
24
|
+
*/
|
|
25
|
+
private printHeader;
|
|
26
|
+
/**
|
|
27
|
+
* Print table header for measurements
|
|
28
|
+
*/
|
|
29
|
+
private printTableHeader;
|
|
30
|
+
/**
|
|
31
|
+
* Print table header for comparisons
|
|
32
|
+
*/
|
|
33
|
+
private printComparisonTableHeader;
|
|
34
|
+
/**
|
|
35
|
+
* Print a measurement row
|
|
36
|
+
*/
|
|
37
|
+
private printMeasurement;
|
|
38
|
+
/**
|
|
39
|
+
* Print a comparison result row
|
|
40
|
+
*/
|
|
41
|
+
private printComparisonResult;
|
|
42
|
+
/**
|
|
43
|
+
* Pad columns to fixed widths
|
|
44
|
+
*/
|
|
45
|
+
private padColumns;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=console-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/console-reporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAkCrB;;GAEG;AACH,qBAAa,eAAe;gBACd,UAAU,CAAC,EAAE,OAAO;IAIhC;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAoClC;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAU9D;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IA6ClD;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAMlC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACH,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console reporter for benchmark results
|
|
3
|
+
*/
|
|
4
|
+
import { formatMs, formatChange } from '../runner/timing.js';
|
|
5
|
+
/**
|
|
6
|
+
* ANSI color codes for terminal output
|
|
7
|
+
*/
|
|
8
|
+
const colors = {
|
|
9
|
+
reset: '\x1b[0m',
|
|
10
|
+
bold: '\x1b[1m',
|
|
11
|
+
dim: '\x1b[2m',
|
|
12
|
+
red: '\x1b[31m',
|
|
13
|
+
green: '\x1b[32m',
|
|
14
|
+
yellow: '\x1b[33m',
|
|
15
|
+
blue: '\x1b[34m',
|
|
16
|
+
cyan: '\x1b[36m',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Check if colors are supported
|
|
20
|
+
*/
|
|
21
|
+
function supportsColor() {
|
|
22
|
+
return process.stdout.isTTY && !process.env.NO_COLOR;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Apply color if supported
|
|
26
|
+
*/
|
|
27
|
+
function color(text, colorCode) {
|
|
28
|
+
if (supportsColor()) {
|
|
29
|
+
return `${colorCode}${text}${colors.reset}`;
|
|
30
|
+
}
|
|
31
|
+
return text;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Console reporter for benchmark output
|
|
35
|
+
*/
|
|
36
|
+
export class ConsoleReporter {
|
|
37
|
+
constructor(_useColors) {
|
|
38
|
+
// Colors are determined dynamically by supportsColor()
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Report a benchmark run
|
|
42
|
+
*/
|
|
43
|
+
reportRun(run) {
|
|
44
|
+
this.printHeader('Benchmark Results');
|
|
45
|
+
console.log();
|
|
46
|
+
// Environment info
|
|
47
|
+
console.log(color('Environment:', colors.bold));
|
|
48
|
+
console.log(` Node.js: ${run.environment.nodeVersion}`);
|
|
49
|
+
console.log(` Platform: ${run.environment.platform} (${run.environment.arch})`);
|
|
50
|
+
console.log(` CPUs: ${run.environment.cpuCount}`);
|
|
51
|
+
if (run.git) {
|
|
52
|
+
console.log();
|
|
53
|
+
console.log(color('Git:', colors.bold));
|
|
54
|
+
console.log(` Commit: ${run.git.commitHash.substring(0, 7)}`);
|
|
55
|
+
console.log(` Branch: ${run.git.branch}`);
|
|
56
|
+
if (run.git.isDirty) {
|
|
57
|
+
console.log(color(' (working directory has uncommitted changes)', colors.yellow));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(color('Results:', colors.bold));
|
|
62
|
+
console.log();
|
|
63
|
+
// Table header
|
|
64
|
+
this.printTableHeader();
|
|
65
|
+
// Results
|
|
66
|
+
for (const measurement of run.measurements) {
|
|
67
|
+
this.printMeasurement(measurement);
|
|
68
|
+
}
|
|
69
|
+
console.log();
|
|
70
|
+
console.log(`Total duration: ${formatMs(run.duration)}`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Report individual measurements
|
|
74
|
+
*/
|
|
75
|
+
reportMeasurements(measurements) {
|
|
76
|
+
this.printHeader('Benchmark Results');
|
|
77
|
+
console.log();
|
|
78
|
+
this.printTableHeader();
|
|
79
|
+
for (const measurement of measurements) {
|
|
80
|
+
this.printMeasurement(measurement);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Report a comparison summary
|
|
85
|
+
*/
|
|
86
|
+
reportComparison(summary) {
|
|
87
|
+
this.printHeader('Benchmark Comparison');
|
|
88
|
+
console.log();
|
|
89
|
+
// Summary counts
|
|
90
|
+
console.log(color('Summary:', colors.bold));
|
|
91
|
+
console.log(` Total benchmarks: ${summary.total}`);
|
|
92
|
+
console.log(` ${color('Regressions:', colors.red)} ${summary.regressions}`);
|
|
93
|
+
console.log(` ${color('Improvements:', colors.green)} ${summary.improvements}`);
|
|
94
|
+
console.log(` Unchanged: ${summary.unchanged}`);
|
|
95
|
+
console.log();
|
|
96
|
+
// Regressions
|
|
97
|
+
if (summary.regressions > 0) {
|
|
98
|
+
console.log(color('Regressions:', colors.red + colors.bold));
|
|
99
|
+
console.log();
|
|
100
|
+
this.printComparisonTableHeader();
|
|
101
|
+
for (const result of summary.results.filter((r) => r.isRegression)) {
|
|
102
|
+
this.printComparisonResult(result);
|
|
103
|
+
}
|
|
104
|
+
console.log();
|
|
105
|
+
}
|
|
106
|
+
// Improvements
|
|
107
|
+
if (summary.improvements > 0) {
|
|
108
|
+
console.log(color('Improvements:', colors.green + colors.bold));
|
|
109
|
+
console.log();
|
|
110
|
+
this.printComparisonTableHeader();
|
|
111
|
+
for (const result of summary.results.filter((r) => r.isImprovement)) {
|
|
112
|
+
this.printComparisonResult(result);
|
|
113
|
+
}
|
|
114
|
+
console.log();
|
|
115
|
+
}
|
|
116
|
+
// Unchanged (only show if verbose or no changes)
|
|
117
|
+
if (summary.unchanged > 0 && (summary.regressions === 0 && summary.improvements === 0)) {
|
|
118
|
+
console.log(color('Unchanged:', colors.dim));
|
|
119
|
+
console.log();
|
|
120
|
+
this.printComparisonTableHeader();
|
|
121
|
+
for (const result of summary.results.filter((r) => r.status === 'unchanged')) {
|
|
122
|
+
this.printComparisonResult(result);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Print a header
|
|
128
|
+
*/
|
|
129
|
+
printHeader(text) {
|
|
130
|
+
const line = '='.repeat(text.length + 4);
|
|
131
|
+
console.log(color(line, colors.cyan));
|
|
132
|
+
console.log(color(` ${text} `, colors.cyan + colors.bold));
|
|
133
|
+
console.log(color(line, colors.cyan));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Print table header for measurements
|
|
137
|
+
*/
|
|
138
|
+
printTableHeader() {
|
|
139
|
+
const header = this.padColumns(['Benchmark', 'Mean', 'Median', 'P95', 'Min', 'Max', 'Ops/s']);
|
|
140
|
+
console.log(color(header, colors.dim));
|
|
141
|
+
console.log(color('-'.repeat(100), colors.dim));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Print table header for comparisons
|
|
145
|
+
*/
|
|
146
|
+
printComparisonTableHeader() {
|
|
147
|
+
const header = this.padColumns(['Benchmark', 'Baseline', 'Current', 'Change', 'Status']);
|
|
148
|
+
console.log(color(header, colors.dim));
|
|
149
|
+
console.log(color('-'.repeat(90), colors.dim));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Print a measurement row
|
|
153
|
+
*/
|
|
154
|
+
printMeasurement(m) {
|
|
155
|
+
const opsPerSec = m.opsPerSecond ? `${m.opsPerSecond.toFixed(0)}` : '-';
|
|
156
|
+
const row = this.padColumns([
|
|
157
|
+
m.name,
|
|
158
|
+
formatMs(m.timing.mean),
|
|
159
|
+
formatMs(m.timing.median),
|
|
160
|
+
formatMs(m.timing.p95),
|
|
161
|
+
formatMs(m.timing.min),
|
|
162
|
+
formatMs(m.timing.max),
|
|
163
|
+
opsPerSec,
|
|
164
|
+
]);
|
|
165
|
+
console.log(row);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Print a comparison result row
|
|
169
|
+
*/
|
|
170
|
+
printComparisonResult(r) {
|
|
171
|
+
const changeStr = formatChange(r.meanChange);
|
|
172
|
+
const statusColor = r.isRegression ? colors.red : r.isImprovement ? colors.green : colors.dim;
|
|
173
|
+
const statusIcon = r.isRegression ? 'SLOWER' : r.isImprovement ? 'FASTER' : 'SAME';
|
|
174
|
+
const row = this.padColumns([
|
|
175
|
+
r.name,
|
|
176
|
+
formatMs(r.baseline.mean),
|
|
177
|
+
formatMs(r.current.mean),
|
|
178
|
+
color(changeStr, statusColor),
|
|
179
|
+
color(statusIcon, statusColor),
|
|
180
|
+
]);
|
|
181
|
+
console.log(row);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Pad columns to fixed widths
|
|
185
|
+
*/
|
|
186
|
+
padColumns(columns) {
|
|
187
|
+
const widths = [40, 12, 12, 12, 12, 12, 10];
|
|
188
|
+
return columns.map((col, i) => col.padEnd(widths[i] || 12)).join(' ');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=console-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../src/reporters/console-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown reporter for benchmark results
|
|
3
|
+
*
|
|
4
|
+
* Generates markdown output suitable for GitHub PR comments
|
|
5
|
+
*/
|
|
6
|
+
import type { BenchmarkRun, BenchmarkMeasurement, ComparisonSummary, GitInfo } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Markdown reporter for benchmark output
|
|
9
|
+
*/
|
|
10
|
+
export declare class MarkdownReporter {
|
|
11
|
+
/**
|
|
12
|
+
* Generate a full benchmark report as markdown
|
|
13
|
+
*/
|
|
14
|
+
reportRun(run: BenchmarkRun): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate a comparison report as markdown
|
|
17
|
+
*/
|
|
18
|
+
reportComparison(summary: ComparisonSummary, gitInfo?: GitInfo): string;
|
|
19
|
+
/**
|
|
20
|
+
* Format a comparison row with status emoji
|
|
21
|
+
*/
|
|
22
|
+
private formatComparisonRow;
|
|
23
|
+
/**
|
|
24
|
+
* Generate a simple table of measurements
|
|
25
|
+
*/
|
|
26
|
+
reportMeasurements(measurements: BenchmarkMeasurement[]): string;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a historical trend report
|
|
29
|
+
*/
|
|
30
|
+
reportTrend(history: BenchmarkMeasurement[], benchmarkName: string): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=markdown-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/markdown-reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EAEjB,OAAO,EACR,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;IA8BpC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM;IAiEvE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,oBAAoB,EAAE,GAAG,MAAM;IAchE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;CAkB5E"}
|