@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.
Files changed (77) hide show
  1. package/dist/analysis/comparison.d.ts +29 -0
  2. package/dist/analysis/comparison.d.ts.map +1 -0
  3. package/dist/analysis/comparison.js +94 -0
  4. package/dist/analysis/comparison.js.map +1 -0
  5. package/dist/analysis/index.d.ts +6 -0
  6. package/dist/analysis/index.d.ts.map +1 -0
  7. package/dist/analysis/index.js +6 -0
  8. package/dist/analysis/index.js.map +1 -0
  9. package/dist/analysis/regression.d.ts +34 -0
  10. package/dist/analysis/regression.d.ts.map +1 -0
  11. package/dist/analysis/regression.js +63 -0
  12. package/dist/analysis/regression.js.map +1 -0
  13. package/dist/cli/commands/compare.d.ts +9 -0
  14. package/dist/cli/commands/compare.d.ts.map +1 -0
  15. package/dist/cli/commands/compare.js +142 -0
  16. package/dist/cli/commands/compare.js.map +1 -0
  17. package/dist/cli/commands/report.d.ts +9 -0
  18. package/dist/cli/commands/report.d.ts.map +1 -0
  19. package/dist/cli/commands/report.js +158 -0
  20. package/dist/cli/commands/report.js.map +1 -0
  21. package/dist/cli/commands/run.d.ts +9 -0
  22. package/dist/cli/commands/run.d.ts.map +1 -0
  23. package/dist/cli/commands/run.js +107 -0
  24. package/dist/cli/commands/run.js.map +1 -0
  25. package/dist/cli/index.d.ts +8 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +165 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/index.d.ts +16 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +19 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/reporters/console-reporter.d.ts +47 -0
  34. package/dist/reporters/console-reporter.d.ts.map +1 -0
  35. package/dist/reporters/console-reporter.js +191 -0
  36. package/dist/reporters/console-reporter.js.map +1 -0
  37. package/dist/reporters/index.d.ts +6 -0
  38. package/dist/reporters/index.d.ts.map +1 -0
  39. package/dist/reporters/index.js +6 -0
  40. package/dist/reporters/index.js.map +1 -0
  41. package/dist/reporters/markdown-reporter.d.ts +32 -0
  42. package/dist/reporters/markdown-reporter.d.ts.map +1 -0
  43. package/dist/reporters/markdown-reporter.js +133 -0
  44. package/dist/reporters/markdown-reporter.js.map +1 -0
  45. package/dist/runner/benchmark-runner.d.ts +37 -0
  46. package/dist/runner/benchmark-runner.d.ts.map +1 -0
  47. package/dist/runner/benchmark-runner.js +133 -0
  48. package/dist/runner/benchmark-runner.js.map +1 -0
  49. package/dist/runner/index.d.ts +6 -0
  50. package/dist/runner/index.d.ts.map +1 -0
  51. package/dist/runner/index.js +6 -0
  52. package/dist/runner/index.js.map +1 -0
  53. package/dist/runner/timing.d.ts +43 -0
  54. package/dist/runner/timing.d.ts.map +1 -0
  55. package/dist/runner/timing.js +115 -0
  56. package/dist/runner/timing.js.map +1 -0
  57. package/dist/runner/vitest-reporter.d.ts +38 -0
  58. package/dist/runner/vitest-reporter.d.ts.map +1 -0
  59. package/dist/runner/vitest-reporter.js +134 -0
  60. package/dist/runner/vitest-reporter.js.map +1 -0
  61. package/dist/storage/index.d.ts +6 -0
  62. package/dist/storage/index.d.ts.map +1 -0
  63. package/dist/storage/index.js +6 -0
  64. package/dist/storage/index.js.map +1 -0
  65. package/dist/storage/json-storage.d.ts +59 -0
  66. package/dist/storage/json-storage.d.ts.map +1 -0
  67. package/dist/storage/json-storage.js +142 -0
  68. package/dist/storage/json-storage.js.map +1 -0
  69. package/dist/storage/sqlite-storage.d.ts +72 -0
  70. package/dist/storage/sqlite-storage.d.ts.map +1 -0
  71. package/dist/storage/sqlite-storage.js +305 -0
  72. package/dist/storage/sqlite-storage.js.map +1 -0
  73. package/dist/types.d.ts +253 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/dist/types.js +21 -0
  76. package/dist/types.js.map +1 -0
  77. 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"}