@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,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown reporter for benchmark results
|
|
3
|
+
*
|
|
4
|
+
* Generates markdown output suitable for GitHub PR comments
|
|
5
|
+
*/
|
|
6
|
+
import { formatMs, formatChange, round } from '../runner/timing.js';
|
|
7
|
+
/**
|
|
8
|
+
* Markdown reporter for benchmark output
|
|
9
|
+
*/
|
|
10
|
+
export class MarkdownReporter {
|
|
11
|
+
/**
|
|
12
|
+
* Generate a full benchmark report as markdown
|
|
13
|
+
*/
|
|
14
|
+
reportRun(run) {
|
|
15
|
+
const lines = [];
|
|
16
|
+
lines.push('## Performance Benchmark Results');
|
|
17
|
+
lines.push('');
|
|
18
|
+
// Metadata
|
|
19
|
+
if (run.git) {
|
|
20
|
+
lines.push(`**Commit**: \`${run.git.commitHash.substring(0, 7)}\` | **Branch**: \`${run.git.branch}\` | **Date**: ${new Date(run.startTime).toLocaleDateString()}`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
lines.push(`**Date**: ${new Date(run.startTime).toLocaleDateString()}`);
|
|
24
|
+
}
|
|
25
|
+
lines.push('');
|
|
26
|
+
// Results table
|
|
27
|
+
lines.push('### Results');
|
|
28
|
+
lines.push('');
|
|
29
|
+
lines.push('| Benchmark | Mean | Median | P95 | Iterations |');
|
|
30
|
+
lines.push('|-----------|------|--------|-----|------------|');
|
|
31
|
+
for (const m of run.measurements) {
|
|
32
|
+
lines.push(`| ${m.name} | ${formatMs(m.timing.mean)} | ${formatMs(m.timing.median)} | ${formatMs(m.timing.p95)} | ${m.iterations} |`);
|
|
33
|
+
}
|
|
34
|
+
lines.push('');
|
|
35
|
+
lines.push(`*Total duration: ${formatMs(run.duration)}*`);
|
|
36
|
+
return lines.join('\n');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate a comparison report as markdown
|
|
40
|
+
*/
|
|
41
|
+
reportComparison(summary, gitInfo) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
lines.push('## Performance Benchmark Results');
|
|
44
|
+
lines.push('');
|
|
45
|
+
// Metadata
|
|
46
|
+
if (gitInfo) {
|
|
47
|
+
lines.push(`**Commit**: \`${gitInfo.commitHash.substring(0, 7)}\` | **Branch**: \`${gitInfo.branch}\` | **Date**: ${new Date().toLocaleDateString()}`);
|
|
48
|
+
lines.push('');
|
|
49
|
+
}
|
|
50
|
+
// Summary table
|
|
51
|
+
lines.push('### Summary');
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push('| Status | Count |');
|
|
54
|
+
lines.push('|--------|-------|');
|
|
55
|
+
lines.push(`| :white_check_mark: Passed | ${summary.unchanged} |`);
|
|
56
|
+
lines.push(`| :warning: Regression | ${summary.regressions} |`);
|
|
57
|
+
lines.push(`| :rocket: Improved | ${summary.improvements} |`);
|
|
58
|
+
lines.push('');
|
|
59
|
+
// Regressions
|
|
60
|
+
if (summary.regressions > 0) {
|
|
61
|
+
lines.push('### Regressions Detected');
|
|
62
|
+
lines.push('');
|
|
63
|
+
lines.push('| Benchmark | Baseline | Current | Change | Status |');
|
|
64
|
+
lines.push('|-----------|----------|---------|--------|--------|');
|
|
65
|
+
for (const r of summary.results.filter((r) => r.isRegression)) {
|
|
66
|
+
lines.push(this.formatComparisonRow(r));
|
|
67
|
+
}
|
|
68
|
+
lines.push('');
|
|
69
|
+
}
|
|
70
|
+
// Improvements
|
|
71
|
+
if (summary.improvements > 0) {
|
|
72
|
+
lines.push('### Improvements');
|
|
73
|
+
lines.push('');
|
|
74
|
+
lines.push('| Benchmark | Baseline | Current | Change | Status |');
|
|
75
|
+
lines.push('|-----------|----------|---------|--------|--------|');
|
|
76
|
+
for (const r of summary.results.filter((r) => r.isImprovement)) {
|
|
77
|
+
lines.push(this.formatComparisonRow(r));
|
|
78
|
+
}
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
// Full results in collapsible section
|
|
82
|
+
lines.push('<details>');
|
|
83
|
+
lines.push(`<summary>Full Results (${summary.total} benchmarks)</summary>`);
|
|
84
|
+
lines.push('');
|
|
85
|
+
lines.push('| Benchmark | Baseline | Current | Change |');
|
|
86
|
+
lines.push('|-----------|----------|---------|--------|');
|
|
87
|
+
for (const r of summary.results) {
|
|
88
|
+
lines.push(`| ${r.name} | ${formatMs(r.baseline.mean)} | ${formatMs(r.current.mean)} | ${formatChange(r.meanChange)} |`);
|
|
89
|
+
}
|
|
90
|
+
lines.push('');
|
|
91
|
+
lines.push('</details>');
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format a comparison row with status emoji
|
|
96
|
+
*/
|
|
97
|
+
formatComparisonRow(r) {
|
|
98
|
+
const statusEmoji = r.isRegression ? ':warning:' : r.isImprovement ? ':rocket:' : ':white_check_mark:';
|
|
99
|
+
return `| ${r.name} | ${formatMs(r.baseline.mean)} | ${formatMs(r.current.mean)} | ${formatChange(r.meanChange)} | ${statusEmoji} |`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Generate a simple table of measurements
|
|
103
|
+
*/
|
|
104
|
+
reportMeasurements(measurements) {
|
|
105
|
+
const lines = [];
|
|
106
|
+
lines.push('| Benchmark | Mean | Median | P95 | Ops/s |');
|
|
107
|
+
lines.push('|-----------|------|--------|-----|-------|');
|
|
108
|
+
for (const m of measurements) {
|
|
109
|
+
const opsPerSec = m.opsPerSecond ? round(m.opsPerSecond, 0).toString() : '-';
|
|
110
|
+
lines.push(`| ${m.name} | ${formatMs(m.timing.mean)} | ${formatMs(m.timing.median)} | ${formatMs(m.timing.p95)} | ${opsPerSec} |`);
|
|
111
|
+
}
|
|
112
|
+
return lines.join('\n');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate a historical trend report
|
|
116
|
+
*/
|
|
117
|
+
reportTrend(history, benchmarkName) {
|
|
118
|
+
const lines = [];
|
|
119
|
+
lines.push(`## Historical Trend: ${benchmarkName}`);
|
|
120
|
+
lines.push('');
|
|
121
|
+
lines.push('| Date | Mean | Median | P95 | Commit |');
|
|
122
|
+
lines.push('|------|------|--------|-----|--------|');
|
|
123
|
+
for (const m of history.slice(0, 20)) {
|
|
124
|
+
const date = new Date(m.timestamp).toLocaleDateString();
|
|
125
|
+
const commit = m.metadata?.commitHash
|
|
126
|
+
? `\`${String(m.metadata.commitHash).substring(0, 7)}\``
|
|
127
|
+
: '-';
|
|
128
|
+
lines.push(`| ${date} | ${formatMs(m.timing.mean)} | ${formatMs(m.timing.median)} | ${formatMs(m.timing.p95)} | ${commit} |`);
|
|
129
|
+
}
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=markdown-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-reporter.js","sourceRoot":"","sources":["../../src/reporters/markdown-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core benchmark runner
|
|
3
|
+
*/
|
|
4
|
+
import type { BenchmarkConfig, BenchmarkMeasurement, BenchmarkRun, EnvironmentInfo, GitInfo, TimingStats } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Collect timing statistics by running a function multiple times
|
|
7
|
+
*/
|
|
8
|
+
export declare function collectTimingStats(fn: () => void | Promise<void>, config?: Partial<BenchmarkConfig>): Promise<TimingStats>;
|
|
9
|
+
/**
|
|
10
|
+
* Get environment information
|
|
11
|
+
*/
|
|
12
|
+
export declare function getEnvironmentInfo(): EnvironmentInfo;
|
|
13
|
+
/**
|
|
14
|
+
* Get git information
|
|
15
|
+
*/
|
|
16
|
+
export declare function getGitInfo(): GitInfo | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a unique run ID based on timestamp
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateRunId(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Run a single benchmark using tinybench
|
|
23
|
+
*/
|
|
24
|
+
export declare function runBenchmark(name: string, fn: () => void | Promise<void>, config?: Partial<BenchmarkConfig>): Promise<BenchmarkMeasurement>;
|
|
25
|
+
/**
|
|
26
|
+
* Benchmark definition for batch running
|
|
27
|
+
*/
|
|
28
|
+
export interface BenchmarkDefinition {
|
|
29
|
+
name: string;
|
|
30
|
+
fn: () => void | Promise<void>;
|
|
31
|
+
config?: Partial<BenchmarkConfig>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run multiple benchmarks and return a complete run
|
|
35
|
+
*/
|
|
36
|
+
export declare function runBenchmarks(benchmarks: BenchmarkDefinition[], config?: Partial<BenchmarkConfig>): Promise<BenchmarkRun>;
|
|
37
|
+
//# sourceMappingURL=benchmark-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-runner.d.ts","sourceRoot":"","sources":["../../src/runner/benchmark-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,OAAO,EACP,WAAW,EACZ,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC9B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAQpD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,GAAG,SAAS,CAchD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC9B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,OAAO,CAAC,oBAAoB,CAAC,CA6C/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,mBAAmB,EAAE,EACjC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core benchmark runner
|
|
3
|
+
*/
|
|
4
|
+
import { Bench } from 'tinybench';
|
|
5
|
+
import { DEFAULT_BENCHMARK_CONFIG } from '../types.js';
|
|
6
|
+
import { calculateStats, now } from './timing.js';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
/**
|
|
10
|
+
* Collect timing statistics by running a function multiple times
|
|
11
|
+
*/
|
|
12
|
+
export async function collectTimingStats(fn, config = {}) {
|
|
13
|
+
const { warmupIterations, iterations } = { ...DEFAULT_BENCHMARK_CONFIG, ...config };
|
|
14
|
+
// Warmup phase
|
|
15
|
+
for (let i = 0; i < warmupIterations; i++) {
|
|
16
|
+
await fn();
|
|
17
|
+
}
|
|
18
|
+
// Measurement phase
|
|
19
|
+
const measurements = [];
|
|
20
|
+
for (let i = 0; i < iterations; i++) {
|
|
21
|
+
const start = now();
|
|
22
|
+
await fn();
|
|
23
|
+
const end = now();
|
|
24
|
+
measurements.push(end - start);
|
|
25
|
+
}
|
|
26
|
+
return calculateStats(measurements);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get environment information
|
|
30
|
+
*/
|
|
31
|
+
export function getEnvironmentInfo() {
|
|
32
|
+
return {
|
|
33
|
+
nodeVersion: process.version,
|
|
34
|
+
platform: os.platform(),
|
|
35
|
+
arch: os.arch(),
|
|
36
|
+
cpuCount: os.cpus().length,
|
|
37
|
+
totalMemory: os.totalmem(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get git information
|
|
42
|
+
*/
|
|
43
|
+
export function getGitInfo() {
|
|
44
|
+
try {
|
|
45
|
+
const commitHash = execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim();
|
|
46
|
+
const branch = execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
47
|
+
const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();
|
|
48
|
+
return {
|
|
49
|
+
commitHash,
|
|
50
|
+
branch,
|
|
51
|
+
isDirty: status.length > 0,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a unique run ID based on timestamp
|
|
60
|
+
*/
|
|
61
|
+
export function generateRunId() {
|
|
62
|
+
const now = new Date();
|
|
63
|
+
return now.toISOString().replace(/[:.]/g, '-');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Run a single benchmark using tinybench
|
|
67
|
+
*/
|
|
68
|
+
export async function runBenchmark(name, fn, config = {}) {
|
|
69
|
+
const mergedConfig = { ...DEFAULT_BENCHMARK_CONFIG, ...config };
|
|
70
|
+
const bench = new Bench({
|
|
71
|
+
iterations: mergedConfig.iterations,
|
|
72
|
+
warmupIterations: mergedConfig.warmupIterations,
|
|
73
|
+
time: mergedConfig.minTime,
|
|
74
|
+
});
|
|
75
|
+
bench.add(name, fn);
|
|
76
|
+
await bench.run();
|
|
77
|
+
const result = bench.results[0];
|
|
78
|
+
if (!result) {
|
|
79
|
+
throw new Error(`Benchmark "${name}" did not produce results`);
|
|
80
|
+
}
|
|
81
|
+
const [packageName, functionName] = name.includes('/')
|
|
82
|
+
? name.split('/', 2)
|
|
83
|
+
: ['unknown', name];
|
|
84
|
+
// tinybench uses p50, p75, p99, p995, p999 - calculate p95 from samples if available
|
|
85
|
+
const samples = result.samples ?? [];
|
|
86
|
+
const sortedSamples = [...samples].sort((a, b) => a - b);
|
|
87
|
+
const p95Index = Math.floor(sortedSamples.length * 0.95);
|
|
88
|
+
const p95 = sortedSamples[p95Index] ?? result.p99 ?? 0;
|
|
89
|
+
return {
|
|
90
|
+
runId: generateRunId(),
|
|
91
|
+
name,
|
|
92
|
+
package: packageName,
|
|
93
|
+
function: functionName,
|
|
94
|
+
timing: {
|
|
95
|
+
mean: result.mean ?? 0,
|
|
96
|
+
median: sortedSamples[Math.floor(sortedSamples.length / 2)] ?? result.mean ?? 0,
|
|
97
|
+
min: result.min ?? 0,
|
|
98
|
+
max: result.max ?? 0,
|
|
99
|
+
stdDev: result.sd ?? 0,
|
|
100
|
+
p95,
|
|
101
|
+
p99: result.p99 ?? 0,
|
|
102
|
+
},
|
|
103
|
+
iterations: samples.length || mergedConfig.iterations,
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
opsPerSecond: result.hz,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Run multiple benchmarks and return a complete run
|
|
110
|
+
*/
|
|
111
|
+
export async function runBenchmarks(benchmarks, config = {}) {
|
|
112
|
+
const runId = generateRunId();
|
|
113
|
+
const startTime = new Date().toISOString();
|
|
114
|
+
const start = now();
|
|
115
|
+
const measurements = [];
|
|
116
|
+
for (const benchmark of benchmarks) {
|
|
117
|
+
const measurement = await runBenchmark(benchmark.name, benchmark.fn, { ...config, ...benchmark.config });
|
|
118
|
+
measurement.runId = runId;
|
|
119
|
+
measurements.push(measurement);
|
|
120
|
+
}
|
|
121
|
+
const end = now();
|
|
122
|
+
const endTime = new Date().toISOString();
|
|
123
|
+
return {
|
|
124
|
+
id: runId,
|
|
125
|
+
startTime,
|
|
126
|
+
endTime,
|
|
127
|
+
duration: end - start,
|
|
128
|
+
measurements,
|
|
129
|
+
environment: getEnvironmentInfo(),
|
|
130
|
+
git: getGitInfo(),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=benchmark-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-runner.js","sourceRoot":"","sources":["../../src/runner/benchmark-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner module exports
|
|
3
|
+
*/
|
|
4
|
+
export { runBenchmark, runBenchmarks, collectTimingStats, getEnvironmentInfo, getGitInfo, generateRunId, type BenchmarkDefinition, } from './benchmark-runner.js';
|
|
5
|
+
export { calculateStats, percentile, mean, median, standardDeviation, now, formatMs, formatChange, round, } from './timing.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,cAAc,EACd,UAAU,EACV,IAAI,EACJ,MAAM,EACN,iBAAiB,EACjB,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,KAAK,GACN,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner module exports
|
|
3
|
+
*/
|
|
4
|
+
export { runBenchmark, runBenchmarks, collectTimingStats, getEnvironmentInfo, getGitInfo, generateRunId, } from './benchmark-runner.js';
|
|
5
|
+
export { calculateStats, percentile, mean, median, standardDeviation, now, formatMs, formatChange, round, } from './timing.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,aAAa,GAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,cAAc,EACd,UAAU,EACV,IAAI,EACJ,MAAM,EACN,iBAAiB,EACjB,GAAG,EACH,QAAQ,EACR,YAAY,EACZ,KAAK,GACN,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timing and statistics utilities for benchmarks
|
|
3
|
+
*/
|
|
4
|
+
import type { TimingStats } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Calculate the percentile value from a sorted array
|
|
7
|
+
* @param sorted - Sorted array of numbers
|
|
8
|
+
* @param p - Percentile (0-100)
|
|
9
|
+
*/
|
|
10
|
+
export declare function percentile(sorted: number[], p: number): number;
|
|
11
|
+
/**
|
|
12
|
+
* Calculate the mean of an array of numbers
|
|
13
|
+
*/
|
|
14
|
+
export declare function mean(values: number[]): number;
|
|
15
|
+
/**
|
|
16
|
+
* Calculate the median of an array of numbers
|
|
17
|
+
*/
|
|
18
|
+
export declare function median(values: number[]): number;
|
|
19
|
+
/**
|
|
20
|
+
* Calculate the standard deviation of an array of numbers
|
|
21
|
+
*/
|
|
22
|
+
export declare function standardDeviation(values: number[]): number;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate comprehensive timing statistics from an array of measurements
|
|
25
|
+
*/
|
|
26
|
+
export declare function calculateStats(measurements: number[]): TimingStats;
|
|
27
|
+
/**
|
|
28
|
+
* High-resolution timer using performance.now() or process.hrtime
|
|
29
|
+
*/
|
|
30
|
+
export declare function now(): number;
|
|
31
|
+
/**
|
|
32
|
+
* Format milliseconds to a human-readable string
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatMs(ms: number): string;
|
|
35
|
+
/**
|
|
36
|
+
* Format a percentage change
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatChange(change: number): string;
|
|
39
|
+
/**
|
|
40
|
+
* Round a number to a specified number of decimal places
|
|
41
|
+
*/
|
|
42
|
+
export declare function round(value: number, decimals?: number): number;
|
|
43
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/runner/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG7C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAI/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAK1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,WAAW,CAwBlE;AAED;;GAEG;AACH,wBAAgB,GAAG,IAAI,MAAM,CAM5B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAW3C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAGjE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timing and statistics utilities for benchmarks
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Calculate the percentile value from a sorted array
|
|
6
|
+
* @param sorted - Sorted array of numbers
|
|
7
|
+
* @param p - Percentile (0-100)
|
|
8
|
+
*/
|
|
9
|
+
export function percentile(sorted, p) {
|
|
10
|
+
if (sorted.length === 0)
|
|
11
|
+
return 0;
|
|
12
|
+
if (sorted.length === 1)
|
|
13
|
+
return sorted[0];
|
|
14
|
+
const index = (p / 100) * (sorted.length - 1);
|
|
15
|
+
const lower = Math.floor(index);
|
|
16
|
+
const upper = Math.ceil(index);
|
|
17
|
+
if (lower === upper) {
|
|
18
|
+
return sorted[lower];
|
|
19
|
+
}
|
|
20
|
+
const weight = index - lower;
|
|
21
|
+
return sorted[lower] * (1 - weight) + sorted[upper] * weight;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate the mean of an array of numbers
|
|
25
|
+
*/
|
|
26
|
+
export function mean(values) {
|
|
27
|
+
if (values.length === 0)
|
|
28
|
+
return 0;
|
|
29
|
+
return values.reduce((sum, v) => sum + v, 0) / values.length;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate the median of an array of numbers
|
|
33
|
+
*/
|
|
34
|
+
export function median(values) {
|
|
35
|
+
if (values.length === 0)
|
|
36
|
+
return 0;
|
|
37
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
38
|
+
return percentile(sorted, 50);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Calculate the standard deviation of an array of numbers
|
|
42
|
+
*/
|
|
43
|
+
export function standardDeviation(values) {
|
|
44
|
+
if (values.length < 2)
|
|
45
|
+
return 0;
|
|
46
|
+
const avg = mean(values);
|
|
47
|
+
const squaredDiffs = values.map((v) => Math.pow(v - avg, 2));
|
|
48
|
+
return Math.sqrt(mean(squaredDiffs));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate comprehensive timing statistics from an array of measurements
|
|
52
|
+
*/
|
|
53
|
+
export function calculateStats(measurements) {
|
|
54
|
+
if (measurements.length === 0) {
|
|
55
|
+
return {
|
|
56
|
+
mean: 0,
|
|
57
|
+
median: 0,
|
|
58
|
+
min: 0,
|
|
59
|
+
max: 0,
|
|
60
|
+
stdDev: 0,
|
|
61
|
+
p95: 0,
|
|
62
|
+
p99: 0,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const sorted = [...measurements].sort((a, b) => a - b);
|
|
66
|
+
return {
|
|
67
|
+
mean: mean(measurements),
|
|
68
|
+
median: percentile(sorted, 50),
|
|
69
|
+
min: sorted[0],
|
|
70
|
+
max: sorted[sorted.length - 1],
|
|
71
|
+
stdDev: standardDeviation(measurements),
|
|
72
|
+
p95: percentile(sorted, 95),
|
|
73
|
+
p99: percentile(sorted, 99),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* High-resolution timer using performance.now() or process.hrtime
|
|
78
|
+
*/
|
|
79
|
+
export function now() {
|
|
80
|
+
if (typeof performance !== 'undefined' && performance.now) {
|
|
81
|
+
return performance.now();
|
|
82
|
+
}
|
|
83
|
+
const [seconds, nanoseconds] = process.hrtime();
|
|
84
|
+
return seconds * 1000 + nanoseconds / 1e6;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format milliseconds to a human-readable string
|
|
88
|
+
*/
|
|
89
|
+
export function formatMs(ms) {
|
|
90
|
+
if (ms < 0.001) {
|
|
91
|
+
return `${(ms * 1000000).toFixed(2)}ns`;
|
|
92
|
+
}
|
|
93
|
+
if (ms < 1) {
|
|
94
|
+
return `${(ms * 1000).toFixed(2)}µs`;
|
|
95
|
+
}
|
|
96
|
+
if (ms < 1000) {
|
|
97
|
+
return `${ms.toFixed(2)}ms`;
|
|
98
|
+
}
|
|
99
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Format a percentage change
|
|
103
|
+
*/
|
|
104
|
+
export function formatChange(change) {
|
|
105
|
+
const sign = change >= 0 ? '+' : '';
|
|
106
|
+
return `${sign}${change.toFixed(1)}%`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Round a number to a specified number of decimal places
|
|
110
|
+
*/
|
|
111
|
+
export function round(value, decimals = 2) {
|
|
112
|
+
const factor = Math.pow(10, decimals);
|
|
113
|
+
return Math.round(value * factor) / factor;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/runner/timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest benchmark reporter
|
|
3
|
+
*
|
|
4
|
+
* Custom reporter that collects benchmark results from Vitest
|
|
5
|
+
* and stores them using the benchmark storage system.
|
|
6
|
+
*/
|
|
7
|
+
import type { Reporter, File } from 'vitest';
|
|
8
|
+
/**
|
|
9
|
+
* Options for the benchmark reporter
|
|
10
|
+
*/
|
|
11
|
+
export interface BenchmarkReporterOptions {
|
|
12
|
+
/** Path to JSON baseline file */
|
|
13
|
+
baselinePath?: string;
|
|
14
|
+
/** Path to SQLite database */
|
|
15
|
+
dbPath?: string;
|
|
16
|
+
/** Whether to update the baseline after running */
|
|
17
|
+
updateBaseline?: boolean;
|
|
18
|
+
/** Whether to output to console */
|
|
19
|
+
outputToConsole?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Vitest benchmark reporter
|
|
23
|
+
*/
|
|
24
|
+
export declare class VitestBenchmarkReporter implements Reporter {
|
|
25
|
+
private options;
|
|
26
|
+
private measurements;
|
|
27
|
+
private startTime;
|
|
28
|
+
private runId;
|
|
29
|
+
constructor(options?: BenchmarkReporterOptions);
|
|
30
|
+
onInit(): void;
|
|
31
|
+
onFinished(files?: File[], errors?: unknown[]): void;
|
|
32
|
+
private extractFromTask;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a Vitest benchmark reporter with the given options
|
|
36
|
+
*/
|
|
37
|
+
export declare function createBenchmarkReporter(options?: BenchmarkReporterOptions): VitestBenchmarkReporter;
|
|
38
|
+
//# sourceMappingURL=vitest-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-reporter.d.ts","sourceRoot":"","sources":["../../src/runner/vitest-reporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO7C;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAoBD;;GAEG;AACH,qBAAa,uBAAwB,YAAW,QAAQ;IACtD,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,KAAK,CAAc;gBAEf,OAAO,GAAE,wBAA6B;IAOlD,MAAM,IAAI,IAAI;IAMd,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI;IAiEpD,OAAO,CAAC,eAAe;CAyCxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,uBAAuB,CAEnG"}
|