modestbench 0.0.1
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/CHANGELOG.md +45 -0
- package/LICENSE.md +55 -0
- package/README.md +699 -0
- package/dist/bootstrap.cjs +37 -0
- package/dist/bootstrap.cjs.map +1 -0
- package/dist/bootstrap.d.cts +17 -0
- package/dist/bootstrap.d.cts.map +1 -0
- package/dist/bootstrap.d.ts +17 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +33 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli/commands/history.cjs +459 -0
- package/dist/cli/commands/history.cjs.map +1 -0
- package/dist/cli/commands/history.d.cts +34 -0
- package/dist/cli/commands/history.d.cts.map +1 -0
- package/dist/cli/commands/history.d.ts +34 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +422 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.cjs +566 -0
- package/dist/cli/commands/init.cjs.map +1 -0
- package/dist/cli/commands/init.d.cts +26 -0
- package/dist/cli/commands/init.d.cts.map +1 -0
- package/dist/cli/commands/init.d.ts +26 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +562 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.cjs +285 -0
- package/dist/cli/commands/run.cjs.map +1 -0
- package/dist/cli/commands/run.d.cts +37 -0
- package/dist/cli/commands/run.d.cts.map +1 -0
- package/dist/cli/commands/run.d.ts +37 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +248 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.cjs +523 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +58 -0
- package/dist/cli/index.d.cts.map +1 -0
- package/dist/cli/index.d.ts +58 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +515 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/manager.cjs +370 -0
- package/dist/config/manager.cjs.map +1 -0
- package/dist/config/manager.d.cts +46 -0
- package/dist/config/manager.d.cts.map +1 -0
- package/dist/config/manager.d.ts +46 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +333 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/schema.cjs +182 -0
- package/dist/config/schema.cjs.map +1 -0
- package/dist/config/schema.d.cts +51 -0
- package/dist/config/schema.d.cts.map +1 -0
- package/dist/config/schema.d.ts +51 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +145 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.cjs +22 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +10 -0
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +19 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/benchmark-schema.cjs +135 -0
- package/dist/core/benchmark-schema.cjs.map +1 -0
- package/dist/core/benchmark-schema.d.cts +139 -0
- package/dist/core/benchmark-schema.d.cts.map +1 -0
- package/dist/core/benchmark-schema.d.ts +139 -0
- package/dist/core/benchmark-schema.d.ts.map +1 -0
- package/dist/core/benchmark-schema.js +132 -0
- package/dist/core/benchmark-schema.js.map +1 -0
- package/dist/core/engine.cjs +669 -0
- package/dist/core/engine.cjs.map +1 -0
- package/dist/core/engine.d.cts +128 -0
- package/dist/core/engine.d.cts.map +1 -0
- package/dist/core/engine.d.ts +128 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +632 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/engines/accurate-engine.cjs +292 -0
- package/dist/core/engines/accurate-engine.cjs.map +1 -0
- package/dist/core/engines/accurate-engine.d.cts +63 -0
- package/dist/core/engines/accurate-engine.d.cts.map +1 -0
- package/dist/core/engines/accurate-engine.d.ts +63 -0
- package/dist/core/engines/accurate-engine.d.ts.map +1 -0
- package/dist/core/engines/accurate-engine.js +288 -0
- package/dist/core/engines/accurate-engine.js.map +1 -0
- package/dist/core/engines/index.cjs +21 -0
- package/dist/core/engines/index.cjs.map +1 -0
- package/dist/core/engines/index.d.cts +16 -0
- package/dist/core/engines/index.d.cts.map +1 -0
- package/dist/core/engines/index.d.ts +16 -0
- package/dist/core/engines/index.d.ts.map +1 -0
- package/dist/core/engines/index.js +16 -0
- package/dist/core/engines/index.js.map +1 -0
- package/dist/core/engines/tinybench-engine.cjs +286 -0
- package/dist/core/engines/tinybench-engine.cjs.map +1 -0
- package/dist/core/engines/tinybench-engine.d.cts +18 -0
- package/dist/core/engines/tinybench-engine.d.cts.map +1 -0
- package/dist/core/engines/tinybench-engine.d.ts +18 -0
- package/dist/core/engines/tinybench-engine.d.ts.map +1 -0
- package/dist/core/engines/tinybench-engine.js +282 -0
- package/dist/core/engines/tinybench-engine.js.map +1 -0
- package/dist/core/error-manager.cjs +303 -0
- package/dist/core/error-manager.cjs.map +1 -0
- package/dist/core/error-manager.d.cts +77 -0
- package/dist/core/error-manager.d.cts.map +1 -0
- package/dist/core/error-manager.d.ts +77 -0
- package/dist/core/error-manager.d.ts.map +1 -0
- package/dist/core/error-manager.js +299 -0
- package/dist/core/error-manager.js.map +1 -0
- package/dist/core/loader.cjs +287 -0
- package/dist/core/loader.cjs.map +1 -0
- package/dist/core/loader.d.cts +55 -0
- package/dist/core/loader.d.cts.map +1 -0
- package/dist/core/loader.d.ts +55 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +250 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/stats-utils.cjs +99 -0
- package/dist/core/stats-utils.cjs.map +1 -0
- package/dist/core/stats-utils.d.cts +50 -0
- package/dist/core/stats-utils.d.cts.map +1 -0
- package/dist/core/stats-utils.d.ts +50 -0
- package/dist/core/stats-utils.d.ts.map +1 -0
- package/dist/core/stats-utils.js +94 -0
- package/dist/core/stats-utils.js.map +1 -0
- package/dist/index.cjs +64 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +22 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/progress/manager.cjs +325 -0
- package/dist/progress/manager.cjs.map +1 -0
- package/dist/progress/manager.d.cts +125 -0
- package/dist/progress/manager.d.cts.map +1 -0
- package/dist/progress/manager.d.ts +125 -0
- package/dist/progress/manager.d.ts.map +1 -0
- package/dist/progress/manager.js +321 -0
- package/dist/progress/manager.js.map +1 -0
- package/dist/reporters/csv.cjs +250 -0
- package/dist/reporters/csv.cjs.map +1 -0
- package/dist/reporters/csv.d.cts +92 -0
- package/dist/reporters/csv.d.cts.map +1 -0
- package/dist/reporters/csv.d.ts +92 -0
- package/dist/reporters/csv.d.ts.map +1 -0
- package/dist/reporters/csv.js +246 -0
- package/dist/reporters/csv.js.map +1 -0
- package/dist/reporters/human.cjs +516 -0
- package/dist/reporters/human.cjs.map +1 -0
- package/dist/reporters/human.d.cts +86 -0
- package/dist/reporters/human.d.cts.map +1 -0
- package/dist/reporters/human.d.ts +86 -0
- package/dist/reporters/human.d.ts.map +1 -0
- package/dist/reporters/human.js +509 -0
- package/dist/reporters/human.js.map +1 -0
- package/dist/reporters/index.cjs +17 -0
- package/dist/reporters/index.cjs.map +1 -0
- package/dist/reporters/index.d.cts +10 -0
- package/dist/reporters/index.d.cts.map +1 -0
- package/dist/reporters/index.d.ts +10 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +10 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.cjs +215 -0
- package/dist/reporters/json.cjs.map +1 -0
- package/dist/reporters/json.d.cts +79 -0
- package/dist/reporters/json.d.cts.map +1 -0
- package/dist/reporters/json.d.ts +79 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +211 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/registry.cjs +255 -0
- package/dist/reporters/registry.cjs.map +1 -0
- package/dist/reporters/registry.d.cts +155 -0
- package/dist/reporters/registry.d.cts.map +1 -0
- package/dist/reporters/registry.d.ts +155 -0
- package/dist/reporters/registry.d.ts.map +1 -0
- package/dist/reporters/registry.js +249 -0
- package/dist/reporters/registry.js.map +1 -0
- package/dist/reporters/simple.cjs +328 -0
- package/dist/reporters/simple.cjs.map +1 -0
- package/dist/reporters/simple.d.cts +51 -0
- package/dist/reporters/simple.d.cts.map +1 -0
- package/dist/reporters/simple.d.ts +51 -0
- package/dist/reporters/simple.d.ts.map +1 -0
- package/dist/reporters/simple.js +321 -0
- package/dist/reporters/simple.js.map +1 -0
- package/dist/schema/modestbench-config.schema.json +162 -0
- package/dist/storage/history.cjs +456 -0
- package/dist/storage/history.cjs.map +1 -0
- package/dist/storage/history.d.cts +99 -0
- package/dist/storage/history.d.cts.map +1 -0
- package/dist/storage/history.d.ts +99 -0
- package/dist/storage/history.d.ts.map +1 -0
- package/dist/storage/history.js +452 -0
- package/dist/storage/history.js.map +1 -0
- package/dist/types/cli.cjs +21 -0
- package/dist/types/cli.cjs.map +1 -0
- package/dist/types/cli.d.cts +296 -0
- package/dist/types/cli.d.cts.map +1 -0
- package/dist/types/cli.d.ts +296 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +18 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/core.cjs +14 -0
- package/dist/types/core.cjs.map +1 -0
- package/dist/types/core.d.cts +380 -0
- package/dist/types/core.d.cts.map +1 -0
- package/dist/types/core.d.ts +380 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +13 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.cjs +27 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +11 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interfaces.cjs +10 -0
- package/dist/types/interfaces.cjs.map +1 -0
- package/dist/types/interfaces.d.cts +381 -0
- package/dist/types/interfaces.d.cts.map +1 -0
- package/dist/types/interfaces.d.ts +381 -0
- package/dist/types/interfaces.d.ts.map +1 -0
- package/dist/types/interfaces.js +9 -0
- package/dist/types/interfaces.js.map +1 -0
- package/dist/types/utility.cjs +92 -0
- package/dist/types/utility.cjs.map +1 -0
- package/dist/types/utility.d.cts +330 -0
- package/dist/types/utility.d.cts.map +1 -0
- package/dist/types/utility.d.ts +330 -0
- package/dist/types/utility.d.ts.map +1 -0
- package/dist/types/utility.js +78 -0
- package/dist/types/utility.js.map +1 -0
- package/package.json +211 -0
- package/src/bootstrap.ts +35 -0
- package/src/cli/commands/history.ts +569 -0
- package/src/cli/commands/init.ts +658 -0
- package/src/cli/commands/run.ts +346 -0
- package/src/cli/index.ts +642 -0
- package/src/config/manager.ts +387 -0
- package/src/config/schema.ts +188 -0
- package/src/constants.ts +21 -0
- package/src/core/benchmark-schema.ts +185 -0
- package/src/core/engine.ts +888 -0
- package/src/core/engines/accurate-engine.ts +408 -0
- package/src/core/engines/index.ts +16 -0
- package/src/core/engines/tinybench-engine.ts +335 -0
- package/src/core/error-manager.ts +372 -0
- package/src/core/loader.ts +324 -0
- package/src/core/stats-utils.ts +135 -0
- package/src/index.ts +46 -0
- package/src/progress/manager.ts +415 -0
- package/src/reporters/csv.ts +368 -0
- package/src/reporters/human.ts +707 -0
- package/src/reporters/index.ts +10 -0
- package/src/reporters/json.ts +302 -0
- package/src/reporters/registry.ts +349 -0
- package/src/reporters/simple.ts +459 -0
- package/src/storage/history.ts +600 -0
- package/src/types/cli.ts +312 -0
- package/src/types/core.ts +414 -0
- package/src/types/index.ts +18 -0
- package/src/types/interfaces.ts +451 -0
- package/src/types/utility.ts +446 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TinybenchEngine - Tinybench-specific benchmark execution implementation
|
|
4
|
+
*
|
|
5
|
+
* Concrete implementation of ModestBenchEngine using the tinybench library for
|
|
6
|
+
* benchmark execution and measurement.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TinybenchEngine = void 0;
|
|
10
|
+
const tinybench_1 = require("tinybench");
|
|
11
|
+
const engine_js_1 = require("../engine.cjs");
|
|
12
|
+
const stats_utils_js_1 = require("../stats-utils.cjs");
|
|
13
|
+
/**
|
|
14
|
+
* Tinybench-specific benchmark execution engine
|
|
15
|
+
*/
|
|
16
|
+
class TinybenchEngine extends engine_js_1.ModestBenchEngine {
|
|
17
|
+
/**
|
|
18
|
+
* Execute a single benchmark task using tinybench
|
|
19
|
+
*/
|
|
20
|
+
async executeBenchmarkTask(taskName, taskData, config, _reporters = [], signal) {
|
|
21
|
+
try {
|
|
22
|
+
if (!taskData.fn || typeof taskData.fn !== 'function') {
|
|
23
|
+
throw new Error('Benchmark task must have a "fn" function property');
|
|
24
|
+
}
|
|
25
|
+
// Determine effective time and iterations based on limitBy mode
|
|
26
|
+
let effectiveTime;
|
|
27
|
+
let effectiveIterations;
|
|
28
|
+
switch (config.limitBy) {
|
|
29
|
+
case 'all':
|
|
30
|
+
// Both must be met - tinybench default behavior
|
|
31
|
+
effectiveTime = Math.min(config.time || 1000, 2000);
|
|
32
|
+
effectiveIterations = config.iterations;
|
|
33
|
+
break;
|
|
34
|
+
case 'any':
|
|
35
|
+
// Stop at whichever comes first
|
|
36
|
+
// Since tinybench requires BOTH to be met, use iterations mode for faster completion
|
|
37
|
+
// This means if iterations completes before time, it stops (time=1ms ensures time completes fast)
|
|
38
|
+
effectiveTime = 1;
|
|
39
|
+
effectiveIterations = config.iterations;
|
|
40
|
+
break;
|
|
41
|
+
case 'iterations':
|
|
42
|
+
// Iterations is the limit, use minimal time
|
|
43
|
+
effectiveTime = 1;
|
|
44
|
+
effectiveIterations = config.iterations;
|
|
45
|
+
break;
|
|
46
|
+
case 'time':
|
|
47
|
+
// Time is the limit, iterations is a minimum (use small value)
|
|
48
|
+
effectiveTime = Math.min(config.time || 1000, 2000);
|
|
49
|
+
effectiveIterations = 1; // Minimal iterations so time is the limiting factor
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
// Fallback to iterations mode
|
|
53
|
+
effectiveTime = 1;
|
|
54
|
+
effectiveIterations = config.iterations;
|
|
55
|
+
}
|
|
56
|
+
const bench = new tinybench_1.Bench({
|
|
57
|
+
iterations: effectiveIterations,
|
|
58
|
+
time: effectiveTime,
|
|
59
|
+
warmupIterations: config.warmup,
|
|
60
|
+
warmupTime: config.warmup > 0 ? Math.min(config.warmup || 0, 500) : 0,
|
|
61
|
+
});
|
|
62
|
+
// Add the task with signal for task-level abort support
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
64
|
+
// @ts-ignore - Pending https://github.com/tinylibs/tinybench/pull/364
|
|
65
|
+
bench.add(taskName, taskData.fn, signal ? { signal } : undefined);
|
|
66
|
+
// Set up periodic progress updates during execution
|
|
67
|
+
const progressInterval = setInterval(() => {
|
|
68
|
+
// Force progress update to show current state with ETA
|
|
69
|
+
this.progressManager.forceUpdate();
|
|
70
|
+
}, 500); // Update every 500ms during execution
|
|
71
|
+
try {
|
|
72
|
+
// Run the benchmark
|
|
73
|
+
await bench.run();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
clearInterval(progressInterval);
|
|
77
|
+
// Handle array length errors for extremely fast operations
|
|
78
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
79
|
+
if (errorMessage.includes('Invalid array length')) {
|
|
80
|
+
// Retry with minimal time (1ms) for extremely fast operations
|
|
81
|
+
// Use same limiting logic but with minimal time for fast ops
|
|
82
|
+
let retryTime;
|
|
83
|
+
switch (config.limitBy) {
|
|
84
|
+
case 'all':
|
|
85
|
+
case 'any':
|
|
86
|
+
retryTime = 10;
|
|
87
|
+
break;
|
|
88
|
+
case 'iterations':
|
|
89
|
+
retryTime = 1;
|
|
90
|
+
break;
|
|
91
|
+
case 'time':
|
|
92
|
+
retryTime = 10;
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
retryTime = 1;
|
|
96
|
+
}
|
|
97
|
+
const minimalBench = new tinybench_1.Bench({
|
|
98
|
+
iterations: config.iterations,
|
|
99
|
+
time: retryTime,
|
|
100
|
+
warmupIterations: config.warmup,
|
|
101
|
+
warmupTime: 0,
|
|
102
|
+
});
|
|
103
|
+
minimalBench.add(taskName, taskData.fn,
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
105
|
+
// @ts-ignore - Pending https://github.com/tinylibs/tinybench/pull/364
|
|
106
|
+
signal ? { signal } : undefined);
|
|
107
|
+
try {
|
|
108
|
+
await minimalBench.run();
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// If still failing, the operation is too fast even for tinybench
|
|
112
|
+
throw new Error(`Benchmark operation is too fast to measure reliably (execution time < 1ns)`);
|
|
113
|
+
}
|
|
114
|
+
const minimalResults = minimalBench.results[0];
|
|
115
|
+
if (!minimalResults || minimalResults.error) {
|
|
116
|
+
throw new Error(`Benchmark too fast to measure reliably: ${minimalResults?.error?.message || 'unknown error'}`);
|
|
117
|
+
}
|
|
118
|
+
// Continue with minimal results - apply outlier removal
|
|
119
|
+
const minimalRawSamples = minimalResults.latency.samples || [];
|
|
120
|
+
const minimalSamplesInNs = minimalRawSamples.map((s) => s * 1e6);
|
|
121
|
+
const minimalCleanedSamples = (0, stats_utils_js_1.removeOutliersIQR)(minimalSamplesInNs);
|
|
122
|
+
const minimalStats = (0, stats_utils_js_1.calculateStatistics)(minimalCleanedSamples);
|
|
123
|
+
const taskResult = {
|
|
124
|
+
cv: minimalStats.cv,
|
|
125
|
+
iterations: minimalCleanedSamples.length,
|
|
126
|
+
marginOfError: minimalStats.marginOfError,
|
|
127
|
+
max: minimalStats.max,
|
|
128
|
+
mean: minimalStats.mean,
|
|
129
|
+
metadata: taskData.metadata ?? {},
|
|
130
|
+
min: minimalStats.min,
|
|
131
|
+
name: taskName,
|
|
132
|
+
opsPerSecond: minimalResults.throughput.mean || 0,
|
|
133
|
+
p95: minimalStats.p95,
|
|
134
|
+
p99: minimalStats.p99,
|
|
135
|
+
stdDev: minimalStats.stdDev,
|
|
136
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
137
|
+
variance: minimalStats.variance,
|
|
138
|
+
};
|
|
139
|
+
return taskResult;
|
|
140
|
+
}
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
// Always clear the progress interval
|
|
145
|
+
clearInterval(progressInterval);
|
|
146
|
+
}
|
|
147
|
+
// Get results
|
|
148
|
+
const results = bench.results[0];
|
|
149
|
+
if (!results) {
|
|
150
|
+
throw new Error('No benchmark results returned');
|
|
151
|
+
}
|
|
152
|
+
// Check if the task was aborted
|
|
153
|
+
if (results.aborted) {
|
|
154
|
+
// Task was aborted via signal - return minimal valid result with error
|
|
155
|
+
const taskResult = {
|
|
156
|
+
cv: 0,
|
|
157
|
+
error: new Error('Benchmark aborted by user signal'),
|
|
158
|
+
iterations: results.latency?.samples?.length || 0,
|
|
159
|
+
marginOfError: 0,
|
|
160
|
+
max: 0,
|
|
161
|
+
mean: 0,
|
|
162
|
+
metadata: taskData.metadata ?? {},
|
|
163
|
+
min: 0,
|
|
164
|
+
name: taskName,
|
|
165
|
+
opsPerSecond: 0,
|
|
166
|
+
p95: 0,
|
|
167
|
+
p99: 0,
|
|
168
|
+
stdDev: 0,
|
|
169
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
170
|
+
variance: 0,
|
|
171
|
+
};
|
|
172
|
+
return taskResult;
|
|
173
|
+
}
|
|
174
|
+
// Check if tinybench detected an error during execution
|
|
175
|
+
if (results.error) {
|
|
176
|
+
const errorMessage = results.error instanceof Error
|
|
177
|
+
? results.error.message
|
|
178
|
+
: String(results.error);
|
|
179
|
+
// Handle array length errors for extremely fast operations
|
|
180
|
+
if (errorMessage.includes('Invalid array length')) {
|
|
181
|
+
// Retry with minimal time for extremely fast operations
|
|
182
|
+
// Use same limiting logic but with minimal time for fast ops
|
|
183
|
+
let retryTime;
|
|
184
|
+
switch (config.limitBy) {
|
|
185
|
+
case 'all':
|
|
186
|
+
case 'any':
|
|
187
|
+
retryTime = 10;
|
|
188
|
+
break;
|
|
189
|
+
case 'iterations':
|
|
190
|
+
retryTime = 1;
|
|
191
|
+
break;
|
|
192
|
+
case 'time':
|
|
193
|
+
retryTime = 10;
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
retryTime = 1;
|
|
197
|
+
}
|
|
198
|
+
const minimalBench = new tinybench_1.Bench({
|
|
199
|
+
iterations: config.iterations,
|
|
200
|
+
time: retryTime,
|
|
201
|
+
warmupIterations: config.warmup,
|
|
202
|
+
warmupTime: 0,
|
|
203
|
+
});
|
|
204
|
+
minimalBench.add(taskName, taskData.fn,
|
|
205
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
206
|
+
// @ts-ignore - Pending https://github.com/tinylibs/tinybench/pull/364
|
|
207
|
+
signal ? { signal } : undefined);
|
|
208
|
+
await minimalBench.run();
|
|
209
|
+
const minimalResults = minimalBench.results[0];
|
|
210
|
+
if (!minimalResults || minimalResults.error) {
|
|
211
|
+
// If retry also fails, just accept it failed
|
|
212
|
+
throw new Error(`Benchmark operation is too fast to measure reliably`);
|
|
213
|
+
}
|
|
214
|
+
// Return minimal results - apply outlier removal
|
|
215
|
+
const minimalRawSamples2 = minimalResults.latency.samples || [];
|
|
216
|
+
const minimalSamplesInNs2 = minimalRawSamples2.map((s) => s * 1e6);
|
|
217
|
+
const minimalCleanedSamples2 = (0, stats_utils_js_1.removeOutliersIQR)(minimalSamplesInNs2);
|
|
218
|
+
const minimalStats2 = (0, stats_utils_js_1.calculateStatistics)(minimalCleanedSamples2);
|
|
219
|
+
const taskResult = {
|
|
220
|
+
cv: minimalStats2.cv,
|
|
221
|
+
iterations: minimalCleanedSamples2.length,
|
|
222
|
+
marginOfError: minimalStats2.marginOfError,
|
|
223
|
+
max: minimalStats2.max,
|
|
224
|
+
mean: minimalStats2.mean,
|
|
225
|
+
metadata: taskData.metadata ?? {},
|
|
226
|
+
min: minimalStats2.min,
|
|
227
|
+
name: taskName,
|
|
228
|
+
opsPerSecond: minimalResults.throughput.mean || 0,
|
|
229
|
+
p95: minimalStats2.p95,
|
|
230
|
+
p99: minimalStats2.p99,
|
|
231
|
+
stdDev: minimalStats2.stdDev,
|
|
232
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
233
|
+
variance: minimalStats2.variance,
|
|
234
|
+
};
|
|
235
|
+
return taskResult;
|
|
236
|
+
}
|
|
237
|
+
throw results.error;
|
|
238
|
+
}
|
|
239
|
+
// Apply IQR outlier removal to raw samples
|
|
240
|
+
const rawSamples = results.latency.samples || [];
|
|
241
|
+
const samplesInNs = rawSamples.map((s) => s * 1e6); // Convert ms to ns
|
|
242
|
+
const cleanedSamples = (0, stats_utils_js_1.removeOutliersIQR)(samplesInNs);
|
|
243
|
+
const stats = (0, stats_utils_js_1.calculateStatistics)(cleanedSamples);
|
|
244
|
+
const taskResult = {
|
|
245
|
+
cv: stats.cv,
|
|
246
|
+
iterations: cleanedSamples.length,
|
|
247
|
+
marginOfError: stats.marginOfError,
|
|
248
|
+
max: stats.max,
|
|
249
|
+
mean: stats.mean,
|
|
250
|
+
metadata: taskData.metadata ?? {},
|
|
251
|
+
min: stats.min,
|
|
252
|
+
name: taskName,
|
|
253
|
+
opsPerSecond: results.throughput.mean || 0, // Keep tinybench's ops/sec
|
|
254
|
+
p95: stats.p95,
|
|
255
|
+
p99: stats.p99,
|
|
256
|
+
stdDev: stats.stdDev,
|
|
257
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
258
|
+
variance: stats.variance,
|
|
259
|
+
};
|
|
260
|
+
return taskResult;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
const executionError = error instanceof Error ? error : new Error(String(error));
|
|
264
|
+
const errorResult = {
|
|
265
|
+
cv: 0,
|
|
266
|
+
error: executionError,
|
|
267
|
+
iterations: 0,
|
|
268
|
+
marginOfError: 0,
|
|
269
|
+
max: 0,
|
|
270
|
+
mean: 0,
|
|
271
|
+
metadata: taskData.metadata ?? {},
|
|
272
|
+
min: 0,
|
|
273
|
+
name: taskName,
|
|
274
|
+
opsPerSecond: 0,
|
|
275
|
+
p95: 0,
|
|
276
|
+
p99: 0,
|
|
277
|
+
stdDev: 0,
|
|
278
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
279
|
+
variance: 0,
|
|
280
|
+
};
|
|
281
|
+
return errorResult;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.TinybenchEngine = TinybenchEngine;
|
|
286
|
+
//# sourceMappingURL=tinybench-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinybench-engine.js","sourceRoot":"","sources":["../../../src/core/engines/tinybench-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinybenchEngine - Tinybench-specific benchmark execution implementation
|
|
3
|
+
*
|
|
4
|
+
* Concrete implementation of ModestBenchEngine using the tinybench library for
|
|
5
|
+
* benchmark execution and measurement.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkTask, ModestBenchConfig, Reporter, TaskResult } from "../../types/index.cjs";
|
|
8
|
+
import { ModestBenchEngine } from "../engine.cjs";
|
|
9
|
+
/**
|
|
10
|
+
* Tinybench-specific benchmark execution engine
|
|
11
|
+
*/
|
|
12
|
+
export declare class TinybenchEngine extends ModestBenchEngine {
|
|
13
|
+
/**
|
|
14
|
+
* Execute a single benchmark task using tinybench
|
|
15
|
+
*/
|
|
16
|
+
protected executeBenchmarkTask(taskName: string, taskData: BenchmarkTask, config: ModestBenchConfig, _reporters?: Reporter[], signal?: AbortSignal): Promise<TaskResult>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tinybench-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinybench-engine.d.ts","sourceRoot":"","sources":["../../../src/core/engines/tinybench-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACX,8BAA6B;AAE9B,OAAO,EAAE,iBAAiB,EAAE,sBAAqB;AAGjD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD;;OAEG;cACa,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACzB,UAAU,GAAE,QAAQ,EAAO,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;CA8SvB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinybenchEngine - Tinybench-specific benchmark execution implementation
|
|
3
|
+
*
|
|
4
|
+
* Concrete implementation of ModestBenchEngine using the tinybench library for
|
|
5
|
+
* benchmark execution and measurement.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkTask, ModestBenchConfig, Reporter, TaskResult } from "../../types/index.js";
|
|
8
|
+
import { ModestBenchEngine } from "../engine.js";
|
|
9
|
+
/**
|
|
10
|
+
* Tinybench-specific benchmark execution engine
|
|
11
|
+
*/
|
|
12
|
+
export declare class TinybenchEngine extends ModestBenchEngine {
|
|
13
|
+
/**
|
|
14
|
+
* Execute a single benchmark task using tinybench
|
|
15
|
+
*/
|
|
16
|
+
protected executeBenchmarkTask(taskName: string, taskData: BenchmarkTask, config: ModestBenchConfig, _reporters?: Reporter[], signal?: AbortSignal): Promise<TaskResult>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tinybench-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinybench-engine.d.ts","sourceRoot":"","sources":["../../../src/core/engines/tinybench-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACX,6BAA6B;AAE9B,OAAO,EAAE,iBAAiB,EAAE,qBAAqB;AAGjD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD;;OAEG;cACa,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACzB,UAAU,GAAE,QAAQ,EAAO,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;CA8SvB"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinybenchEngine - Tinybench-specific benchmark execution implementation
|
|
3
|
+
*
|
|
4
|
+
* Concrete implementation of ModestBenchEngine using the tinybench library for
|
|
5
|
+
* benchmark execution and measurement.
|
|
6
|
+
*/
|
|
7
|
+
import { Bench } from 'tinybench';
|
|
8
|
+
import { ModestBenchEngine } from "../engine.js";
|
|
9
|
+
import { calculateStatistics, removeOutliersIQR } from "../stats-utils.js";
|
|
10
|
+
/**
|
|
11
|
+
* Tinybench-specific benchmark execution engine
|
|
12
|
+
*/
|
|
13
|
+
export class TinybenchEngine extends ModestBenchEngine {
|
|
14
|
+
/**
|
|
15
|
+
* Execute a single benchmark task using tinybench
|
|
16
|
+
*/
|
|
17
|
+
async executeBenchmarkTask(taskName, taskData, config, _reporters = [], signal) {
|
|
18
|
+
try {
|
|
19
|
+
if (!taskData.fn || typeof taskData.fn !== 'function') {
|
|
20
|
+
throw new Error('Benchmark task must have a "fn" function property');
|
|
21
|
+
}
|
|
22
|
+
// Determine effective time and iterations based on limitBy mode
|
|
23
|
+
let effectiveTime;
|
|
24
|
+
let effectiveIterations;
|
|
25
|
+
switch (config.limitBy) {
|
|
26
|
+
case 'all':
|
|
27
|
+
// Both must be met - tinybench default behavior
|
|
28
|
+
effectiveTime = Math.min(config.time || 1000, 2000);
|
|
29
|
+
effectiveIterations = config.iterations;
|
|
30
|
+
break;
|
|
31
|
+
case 'any':
|
|
32
|
+
// Stop at whichever comes first
|
|
33
|
+
// Since tinybench requires BOTH to be met, use iterations mode for faster completion
|
|
34
|
+
// This means if iterations completes before time, it stops (time=1ms ensures time completes fast)
|
|
35
|
+
effectiveTime = 1;
|
|
36
|
+
effectiveIterations = config.iterations;
|
|
37
|
+
break;
|
|
38
|
+
case 'iterations':
|
|
39
|
+
// Iterations is the limit, use minimal time
|
|
40
|
+
effectiveTime = 1;
|
|
41
|
+
effectiveIterations = config.iterations;
|
|
42
|
+
break;
|
|
43
|
+
case 'time':
|
|
44
|
+
// Time is the limit, iterations is a minimum (use small value)
|
|
45
|
+
effectiveTime = Math.min(config.time || 1000, 2000);
|
|
46
|
+
effectiveIterations = 1; // Minimal iterations so time is the limiting factor
|
|
47
|
+
break;
|
|
48
|
+
default:
|
|
49
|
+
// Fallback to iterations mode
|
|
50
|
+
effectiveTime = 1;
|
|
51
|
+
effectiveIterations = config.iterations;
|
|
52
|
+
}
|
|
53
|
+
const bench = new Bench({
|
|
54
|
+
iterations: effectiveIterations,
|
|
55
|
+
time: effectiveTime,
|
|
56
|
+
warmupIterations: config.warmup,
|
|
57
|
+
warmupTime: config.warmup > 0 ? Math.min(config.warmup || 0, 500) : 0,
|
|
58
|
+
});
|
|
59
|
+
// Add the task with signal for task-level abort support
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
61
|
+
// @ts-ignore - Pending https://github.com/tinylibs/tinybench/pull/364
|
|
62
|
+
bench.add(taskName, taskData.fn, signal ? { signal } : undefined);
|
|
63
|
+
// Set up periodic progress updates during execution
|
|
64
|
+
const progressInterval = setInterval(() => {
|
|
65
|
+
// Force progress update to show current state with ETA
|
|
66
|
+
this.progressManager.forceUpdate();
|
|
67
|
+
}, 500); // Update every 500ms during execution
|
|
68
|
+
try {
|
|
69
|
+
// Run the benchmark
|
|
70
|
+
await bench.run();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
clearInterval(progressInterval);
|
|
74
|
+
// Handle array length errors for extremely fast operations
|
|
75
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
76
|
+
if (errorMessage.includes('Invalid array length')) {
|
|
77
|
+
// Retry with minimal time (1ms) for extremely fast operations
|
|
78
|
+
// Use same limiting logic but with minimal time for fast ops
|
|
79
|
+
let retryTime;
|
|
80
|
+
switch (config.limitBy) {
|
|
81
|
+
case 'all':
|
|
82
|
+
case 'any':
|
|
83
|
+
retryTime = 10;
|
|
84
|
+
break;
|
|
85
|
+
case 'iterations':
|
|
86
|
+
retryTime = 1;
|
|
87
|
+
break;
|
|
88
|
+
case 'time':
|
|
89
|
+
retryTime = 10;
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
retryTime = 1;
|
|
93
|
+
}
|
|
94
|
+
const minimalBench = new Bench({
|
|
95
|
+
iterations: config.iterations,
|
|
96
|
+
time: retryTime,
|
|
97
|
+
warmupIterations: config.warmup,
|
|
98
|
+
warmupTime: 0,
|
|
99
|
+
});
|
|
100
|
+
minimalBench.add(taskName, taskData.fn,
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
102
|
+
// @ts-ignore - Pending https://github.com/tinylibs/tinybench/pull/364
|
|
103
|
+
signal ? { signal } : undefined);
|
|
104
|
+
try {
|
|
105
|
+
await minimalBench.run();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// If still failing, the operation is too fast even for tinybench
|
|
109
|
+
throw new Error(`Benchmark operation is too fast to measure reliably (execution time < 1ns)`);
|
|
110
|
+
}
|
|
111
|
+
const minimalResults = minimalBench.results[0];
|
|
112
|
+
if (!minimalResults || minimalResults.error) {
|
|
113
|
+
throw new Error(`Benchmark too fast to measure reliably: ${minimalResults?.error?.message || 'unknown error'}`);
|
|
114
|
+
}
|
|
115
|
+
// Continue with minimal results - apply outlier removal
|
|
116
|
+
const minimalRawSamples = minimalResults.latency.samples || [];
|
|
117
|
+
const minimalSamplesInNs = minimalRawSamples.map((s) => s * 1e6);
|
|
118
|
+
const minimalCleanedSamples = removeOutliersIQR(minimalSamplesInNs);
|
|
119
|
+
const minimalStats = calculateStatistics(minimalCleanedSamples);
|
|
120
|
+
const taskResult = {
|
|
121
|
+
cv: minimalStats.cv,
|
|
122
|
+
iterations: minimalCleanedSamples.length,
|
|
123
|
+
marginOfError: minimalStats.marginOfError,
|
|
124
|
+
max: minimalStats.max,
|
|
125
|
+
mean: minimalStats.mean,
|
|
126
|
+
metadata: taskData.metadata ?? {},
|
|
127
|
+
min: minimalStats.min,
|
|
128
|
+
name: taskName,
|
|
129
|
+
opsPerSecond: minimalResults.throughput.mean || 0,
|
|
130
|
+
p95: minimalStats.p95,
|
|
131
|
+
p99: minimalStats.p99,
|
|
132
|
+
stdDev: minimalStats.stdDev,
|
|
133
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
134
|
+
variance: minimalStats.variance,
|
|
135
|
+
};
|
|
136
|
+
return taskResult;
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
// Always clear the progress interval
|
|
142
|
+
clearInterval(progressInterval);
|
|
143
|
+
}
|
|
144
|
+
// Get results
|
|
145
|
+
const results = bench.results[0];
|
|
146
|
+
if (!results) {
|
|
147
|
+
throw new Error('No benchmark results returned');
|
|
148
|
+
}
|
|
149
|
+
// Check if the task was aborted
|
|
150
|
+
if (results.aborted) {
|
|
151
|
+
// Task was aborted via signal - return minimal valid result with error
|
|
152
|
+
const taskResult = {
|
|
153
|
+
cv: 0,
|
|
154
|
+
error: new Error('Benchmark aborted by user signal'),
|
|
155
|
+
iterations: results.latency?.samples?.length || 0,
|
|
156
|
+
marginOfError: 0,
|
|
157
|
+
max: 0,
|
|
158
|
+
mean: 0,
|
|
159
|
+
metadata: taskData.metadata ?? {},
|
|
160
|
+
min: 0,
|
|
161
|
+
name: taskName,
|
|
162
|
+
opsPerSecond: 0,
|
|
163
|
+
p95: 0,
|
|
164
|
+
p99: 0,
|
|
165
|
+
stdDev: 0,
|
|
166
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
167
|
+
variance: 0,
|
|
168
|
+
};
|
|
169
|
+
return taskResult;
|
|
170
|
+
}
|
|
171
|
+
// Check if tinybench detected an error during execution
|
|
172
|
+
if (results.error) {
|
|
173
|
+
const errorMessage = results.error instanceof Error
|
|
174
|
+
? results.error.message
|
|
175
|
+
: String(results.error);
|
|
176
|
+
// Handle array length errors for extremely fast operations
|
|
177
|
+
if (errorMessage.includes('Invalid array length')) {
|
|
178
|
+
// Retry with minimal time for extremely fast operations
|
|
179
|
+
// Use same limiting logic but with minimal time for fast ops
|
|
180
|
+
let retryTime;
|
|
181
|
+
switch (config.limitBy) {
|
|
182
|
+
case 'all':
|
|
183
|
+
case 'any':
|
|
184
|
+
retryTime = 10;
|
|
185
|
+
break;
|
|
186
|
+
case 'iterations':
|
|
187
|
+
retryTime = 1;
|
|
188
|
+
break;
|
|
189
|
+
case 'time':
|
|
190
|
+
retryTime = 10;
|
|
191
|
+
break;
|
|
192
|
+
default:
|
|
193
|
+
retryTime = 1;
|
|
194
|
+
}
|
|
195
|
+
const minimalBench = new Bench({
|
|
196
|
+
iterations: config.iterations,
|
|
197
|
+
time: retryTime,
|
|
198
|
+
warmupIterations: config.warmup,
|
|
199
|
+
warmupTime: 0,
|
|
200
|
+
});
|
|
201
|
+
minimalBench.add(taskName, taskData.fn,
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
203
|
+
// @ts-ignore - Pending https://github.com/tinylibs/tinybench/pull/364
|
|
204
|
+
signal ? { signal } : undefined);
|
|
205
|
+
await minimalBench.run();
|
|
206
|
+
const minimalResults = minimalBench.results[0];
|
|
207
|
+
if (!minimalResults || minimalResults.error) {
|
|
208
|
+
// If retry also fails, just accept it failed
|
|
209
|
+
throw new Error(`Benchmark operation is too fast to measure reliably`);
|
|
210
|
+
}
|
|
211
|
+
// Return minimal results - apply outlier removal
|
|
212
|
+
const minimalRawSamples2 = minimalResults.latency.samples || [];
|
|
213
|
+
const minimalSamplesInNs2 = minimalRawSamples2.map((s) => s * 1e6);
|
|
214
|
+
const minimalCleanedSamples2 = removeOutliersIQR(minimalSamplesInNs2);
|
|
215
|
+
const minimalStats2 = calculateStatistics(minimalCleanedSamples2);
|
|
216
|
+
const taskResult = {
|
|
217
|
+
cv: minimalStats2.cv,
|
|
218
|
+
iterations: minimalCleanedSamples2.length,
|
|
219
|
+
marginOfError: minimalStats2.marginOfError,
|
|
220
|
+
max: minimalStats2.max,
|
|
221
|
+
mean: minimalStats2.mean,
|
|
222
|
+
metadata: taskData.metadata ?? {},
|
|
223
|
+
min: minimalStats2.min,
|
|
224
|
+
name: taskName,
|
|
225
|
+
opsPerSecond: minimalResults.throughput.mean || 0,
|
|
226
|
+
p95: minimalStats2.p95,
|
|
227
|
+
p99: minimalStats2.p99,
|
|
228
|
+
stdDev: minimalStats2.stdDev,
|
|
229
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
230
|
+
variance: minimalStats2.variance,
|
|
231
|
+
};
|
|
232
|
+
return taskResult;
|
|
233
|
+
}
|
|
234
|
+
throw results.error;
|
|
235
|
+
}
|
|
236
|
+
// Apply IQR outlier removal to raw samples
|
|
237
|
+
const rawSamples = results.latency.samples || [];
|
|
238
|
+
const samplesInNs = rawSamples.map((s) => s * 1e6); // Convert ms to ns
|
|
239
|
+
const cleanedSamples = removeOutliersIQR(samplesInNs);
|
|
240
|
+
const stats = calculateStatistics(cleanedSamples);
|
|
241
|
+
const taskResult = {
|
|
242
|
+
cv: stats.cv,
|
|
243
|
+
iterations: cleanedSamples.length,
|
|
244
|
+
marginOfError: stats.marginOfError,
|
|
245
|
+
max: stats.max,
|
|
246
|
+
mean: stats.mean,
|
|
247
|
+
metadata: taskData.metadata ?? {},
|
|
248
|
+
min: stats.min,
|
|
249
|
+
name: taskName,
|
|
250
|
+
opsPerSecond: results.throughput.mean || 0, // Keep tinybench's ops/sec
|
|
251
|
+
p95: stats.p95,
|
|
252
|
+
p99: stats.p99,
|
|
253
|
+
stdDev: stats.stdDev,
|
|
254
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
255
|
+
variance: stats.variance,
|
|
256
|
+
};
|
|
257
|
+
return taskResult;
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
const executionError = error instanceof Error ? error : new Error(String(error));
|
|
261
|
+
const errorResult = {
|
|
262
|
+
cv: 0,
|
|
263
|
+
error: executionError,
|
|
264
|
+
iterations: 0,
|
|
265
|
+
marginOfError: 0,
|
|
266
|
+
max: 0,
|
|
267
|
+
mean: 0,
|
|
268
|
+
metadata: taskData.metadata ?? {},
|
|
269
|
+
min: 0,
|
|
270
|
+
name: taskName,
|
|
271
|
+
opsPerSecond: 0,
|
|
272
|
+
p95: 0,
|
|
273
|
+
p99: 0,
|
|
274
|
+
stdDev: 0,
|
|
275
|
+
...(taskData.tags ? { tags: taskData.tags } : {}),
|
|
276
|
+
variance: 0,
|
|
277
|
+
};
|
|
278
|
+
return errorResult;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=tinybench-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinybench-engine.js","sourceRoot":"","sources":["../../../src/core/engines/tinybench-engine.ts"],"names":[],"mappings":"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"}
|