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.
Files changed (275) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE.md +55 -0
  3. package/README.md +699 -0
  4. package/dist/bootstrap.cjs +37 -0
  5. package/dist/bootstrap.cjs.map +1 -0
  6. package/dist/bootstrap.d.cts +17 -0
  7. package/dist/bootstrap.d.cts.map +1 -0
  8. package/dist/bootstrap.d.ts +17 -0
  9. package/dist/bootstrap.d.ts.map +1 -0
  10. package/dist/bootstrap.js +33 -0
  11. package/dist/bootstrap.js.map +1 -0
  12. package/dist/cli/commands/history.cjs +459 -0
  13. package/dist/cli/commands/history.cjs.map +1 -0
  14. package/dist/cli/commands/history.d.cts +34 -0
  15. package/dist/cli/commands/history.d.cts.map +1 -0
  16. package/dist/cli/commands/history.d.ts +34 -0
  17. package/dist/cli/commands/history.d.ts.map +1 -0
  18. package/dist/cli/commands/history.js +422 -0
  19. package/dist/cli/commands/history.js.map +1 -0
  20. package/dist/cli/commands/init.cjs +566 -0
  21. package/dist/cli/commands/init.cjs.map +1 -0
  22. package/dist/cli/commands/init.d.cts +26 -0
  23. package/dist/cli/commands/init.d.cts.map +1 -0
  24. package/dist/cli/commands/init.d.ts +26 -0
  25. package/dist/cli/commands/init.d.ts.map +1 -0
  26. package/dist/cli/commands/init.js +562 -0
  27. package/dist/cli/commands/init.js.map +1 -0
  28. package/dist/cli/commands/run.cjs +285 -0
  29. package/dist/cli/commands/run.cjs.map +1 -0
  30. package/dist/cli/commands/run.d.cts +37 -0
  31. package/dist/cli/commands/run.d.cts.map +1 -0
  32. package/dist/cli/commands/run.d.ts +37 -0
  33. package/dist/cli/commands/run.d.ts.map +1 -0
  34. package/dist/cli/commands/run.js +248 -0
  35. package/dist/cli/commands/run.js.map +1 -0
  36. package/dist/cli/index.cjs +523 -0
  37. package/dist/cli/index.cjs.map +1 -0
  38. package/dist/cli/index.d.cts +58 -0
  39. package/dist/cli/index.d.cts.map +1 -0
  40. package/dist/cli/index.d.ts +58 -0
  41. package/dist/cli/index.d.ts.map +1 -0
  42. package/dist/cli/index.js +515 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/config/manager.cjs +370 -0
  45. package/dist/config/manager.cjs.map +1 -0
  46. package/dist/config/manager.d.cts +46 -0
  47. package/dist/config/manager.d.cts.map +1 -0
  48. package/dist/config/manager.d.ts +46 -0
  49. package/dist/config/manager.d.ts.map +1 -0
  50. package/dist/config/manager.js +333 -0
  51. package/dist/config/manager.js.map +1 -0
  52. package/dist/config/schema.cjs +182 -0
  53. package/dist/config/schema.cjs.map +1 -0
  54. package/dist/config/schema.d.cts +51 -0
  55. package/dist/config/schema.d.cts.map +1 -0
  56. package/dist/config/schema.d.ts +51 -0
  57. package/dist/config/schema.d.ts.map +1 -0
  58. package/dist/config/schema.js +145 -0
  59. package/dist/config/schema.js.map +1 -0
  60. package/dist/constants.cjs +22 -0
  61. package/dist/constants.cjs.map +1 -0
  62. package/dist/constants.d.cts +10 -0
  63. package/dist/constants.d.cts.map +1 -0
  64. package/dist/constants.d.ts +10 -0
  65. package/dist/constants.d.ts.map +1 -0
  66. package/dist/constants.js +19 -0
  67. package/dist/constants.js.map +1 -0
  68. package/dist/core/benchmark-schema.cjs +135 -0
  69. package/dist/core/benchmark-schema.cjs.map +1 -0
  70. package/dist/core/benchmark-schema.d.cts +139 -0
  71. package/dist/core/benchmark-schema.d.cts.map +1 -0
  72. package/dist/core/benchmark-schema.d.ts +139 -0
  73. package/dist/core/benchmark-schema.d.ts.map +1 -0
  74. package/dist/core/benchmark-schema.js +132 -0
  75. package/dist/core/benchmark-schema.js.map +1 -0
  76. package/dist/core/engine.cjs +669 -0
  77. package/dist/core/engine.cjs.map +1 -0
  78. package/dist/core/engine.d.cts +128 -0
  79. package/dist/core/engine.d.cts.map +1 -0
  80. package/dist/core/engine.d.ts +128 -0
  81. package/dist/core/engine.d.ts.map +1 -0
  82. package/dist/core/engine.js +632 -0
  83. package/dist/core/engine.js.map +1 -0
  84. package/dist/core/engines/accurate-engine.cjs +292 -0
  85. package/dist/core/engines/accurate-engine.cjs.map +1 -0
  86. package/dist/core/engines/accurate-engine.d.cts +63 -0
  87. package/dist/core/engines/accurate-engine.d.cts.map +1 -0
  88. package/dist/core/engines/accurate-engine.d.ts +63 -0
  89. package/dist/core/engines/accurate-engine.d.ts.map +1 -0
  90. package/dist/core/engines/accurate-engine.js +288 -0
  91. package/dist/core/engines/accurate-engine.js.map +1 -0
  92. package/dist/core/engines/index.cjs +21 -0
  93. package/dist/core/engines/index.cjs.map +1 -0
  94. package/dist/core/engines/index.d.cts +16 -0
  95. package/dist/core/engines/index.d.cts.map +1 -0
  96. package/dist/core/engines/index.d.ts +16 -0
  97. package/dist/core/engines/index.d.ts.map +1 -0
  98. package/dist/core/engines/index.js +16 -0
  99. package/dist/core/engines/index.js.map +1 -0
  100. package/dist/core/engines/tinybench-engine.cjs +286 -0
  101. package/dist/core/engines/tinybench-engine.cjs.map +1 -0
  102. package/dist/core/engines/tinybench-engine.d.cts +18 -0
  103. package/dist/core/engines/tinybench-engine.d.cts.map +1 -0
  104. package/dist/core/engines/tinybench-engine.d.ts +18 -0
  105. package/dist/core/engines/tinybench-engine.d.ts.map +1 -0
  106. package/dist/core/engines/tinybench-engine.js +282 -0
  107. package/dist/core/engines/tinybench-engine.js.map +1 -0
  108. package/dist/core/error-manager.cjs +303 -0
  109. package/dist/core/error-manager.cjs.map +1 -0
  110. package/dist/core/error-manager.d.cts +77 -0
  111. package/dist/core/error-manager.d.cts.map +1 -0
  112. package/dist/core/error-manager.d.ts +77 -0
  113. package/dist/core/error-manager.d.ts.map +1 -0
  114. package/dist/core/error-manager.js +299 -0
  115. package/dist/core/error-manager.js.map +1 -0
  116. package/dist/core/loader.cjs +287 -0
  117. package/dist/core/loader.cjs.map +1 -0
  118. package/dist/core/loader.d.cts +55 -0
  119. package/dist/core/loader.d.cts.map +1 -0
  120. package/dist/core/loader.d.ts +55 -0
  121. package/dist/core/loader.d.ts.map +1 -0
  122. package/dist/core/loader.js +250 -0
  123. package/dist/core/loader.js.map +1 -0
  124. package/dist/core/stats-utils.cjs +99 -0
  125. package/dist/core/stats-utils.cjs.map +1 -0
  126. package/dist/core/stats-utils.d.cts +50 -0
  127. package/dist/core/stats-utils.d.cts.map +1 -0
  128. package/dist/core/stats-utils.d.ts +50 -0
  129. package/dist/core/stats-utils.d.ts.map +1 -0
  130. package/dist/core/stats-utils.js +94 -0
  131. package/dist/core/stats-utils.js.map +1 -0
  132. package/dist/index.cjs +64 -0
  133. package/dist/index.cjs.map +1 -0
  134. package/dist/index.d.cts +22 -0
  135. package/dist/index.d.cts.map +1 -0
  136. package/dist/index.d.ts +22 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +30 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/progress/manager.cjs +325 -0
  141. package/dist/progress/manager.cjs.map +1 -0
  142. package/dist/progress/manager.d.cts +125 -0
  143. package/dist/progress/manager.d.cts.map +1 -0
  144. package/dist/progress/manager.d.ts +125 -0
  145. package/dist/progress/manager.d.ts.map +1 -0
  146. package/dist/progress/manager.js +321 -0
  147. package/dist/progress/manager.js.map +1 -0
  148. package/dist/reporters/csv.cjs +250 -0
  149. package/dist/reporters/csv.cjs.map +1 -0
  150. package/dist/reporters/csv.d.cts +92 -0
  151. package/dist/reporters/csv.d.cts.map +1 -0
  152. package/dist/reporters/csv.d.ts +92 -0
  153. package/dist/reporters/csv.d.ts.map +1 -0
  154. package/dist/reporters/csv.js +246 -0
  155. package/dist/reporters/csv.js.map +1 -0
  156. package/dist/reporters/human.cjs +516 -0
  157. package/dist/reporters/human.cjs.map +1 -0
  158. package/dist/reporters/human.d.cts +86 -0
  159. package/dist/reporters/human.d.cts.map +1 -0
  160. package/dist/reporters/human.d.ts +86 -0
  161. package/dist/reporters/human.d.ts.map +1 -0
  162. package/dist/reporters/human.js +509 -0
  163. package/dist/reporters/human.js.map +1 -0
  164. package/dist/reporters/index.cjs +17 -0
  165. package/dist/reporters/index.cjs.map +1 -0
  166. package/dist/reporters/index.d.cts +10 -0
  167. package/dist/reporters/index.d.cts.map +1 -0
  168. package/dist/reporters/index.d.ts +10 -0
  169. package/dist/reporters/index.d.ts.map +1 -0
  170. package/dist/reporters/index.js +10 -0
  171. package/dist/reporters/index.js.map +1 -0
  172. package/dist/reporters/json.cjs +215 -0
  173. package/dist/reporters/json.cjs.map +1 -0
  174. package/dist/reporters/json.d.cts +79 -0
  175. package/dist/reporters/json.d.cts.map +1 -0
  176. package/dist/reporters/json.d.ts +79 -0
  177. package/dist/reporters/json.d.ts.map +1 -0
  178. package/dist/reporters/json.js +211 -0
  179. package/dist/reporters/json.js.map +1 -0
  180. package/dist/reporters/registry.cjs +255 -0
  181. package/dist/reporters/registry.cjs.map +1 -0
  182. package/dist/reporters/registry.d.cts +155 -0
  183. package/dist/reporters/registry.d.cts.map +1 -0
  184. package/dist/reporters/registry.d.ts +155 -0
  185. package/dist/reporters/registry.d.ts.map +1 -0
  186. package/dist/reporters/registry.js +249 -0
  187. package/dist/reporters/registry.js.map +1 -0
  188. package/dist/reporters/simple.cjs +328 -0
  189. package/dist/reporters/simple.cjs.map +1 -0
  190. package/dist/reporters/simple.d.cts +51 -0
  191. package/dist/reporters/simple.d.cts.map +1 -0
  192. package/dist/reporters/simple.d.ts +51 -0
  193. package/dist/reporters/simple.d.ts.map +1 -0
  194. package/dist/reporters/simple.js +321 -0
  195. package/dist/reporters/simple.js.map +1 -0
  196. package/dist/schema/modestbench-config.schema.json +162 -0
  197. package/dist/storage/history.cjs +456 -0
  198. package/dist/storage/history.cjs.map +1 -0
  199. package/dist/storage/history.d.cts +99 -0
  200. package/dist/storage/history.d.cts.map +1 -0
  201. package/dist/storage/history.d.ts +99 -0
  202. package/dist/storage/history.d.ts.map +1 -0
  203. package/dist/storage/history.js +452 -0
  204. package/dist/storage/history.js.map +1 -0
  205. package/dist/types/cli.cjs +21 -0
  206. package/dist/types/cli.cjs.map +1 -0
  207. package/dist/types/cli.d.cts +296 -0
  208. package/dist/types/cli.d.cts.map +1 -0
  209. package/dist/types/cli.d.ts +296 -0
  210. package/dist/types/cli.d.ts.map +1 -0
  211. package/dist/types/cli.js +18 -0
  212. package/dist/types/cli.js.map +1 -0
  213. package/dist/types/core.cjs +14 -0
  214. package/dist/types/core.cjs.map +1 -0
  215. package/dist/types/core.d.cts +380 -0
  216. package/dist/types/core.d.cts.map +1 -0
  217. package/dist/types/core.d.ts +380 -0
  218. package/dist/types/core.d.ts.map +1 -0
  219. package/dist/types/core.js +13 -0
  220. package/dist/types/core.js.map +1 -0
  221. package/dist/types/index.cjs +27 -0
  222. package/dist/types/index.cjs.map +1 -0
  223. package/dist/types/index.d.cts +11 -0
  224. package/dist/types/index.d.cts.map +1 -0
  225. package/dist/types/index.d.ts +11 -0
  226. package/dist/types/index.d.ts.map +1 -0
  227. package/dist/types/index.js +11 -0
  228. package/dist/types/index.js.map +1 -0
  229. package/dist/types/interfaces.cjs +10 -0
  230. package/dist/types/interfaces.cjs.map +1 -0
  231. package/dist/types/interfaces.d.cts +381 -0
  232. package/dist/types/interfaces.d.cts.map +1 -0
  233. package/dist/types/interfaces.d.ts +381 -0
  234. package/dist/types/interfaces.d.ts.map +1 -0
  235. package/dist/types/interfaces.js +9 -0
  236. package/dist/types/interfaces.js.map +1 -0
  237. package/dist/types/utility.cjs +92 -0
  238. package/dist/types/utility.cjs.map +1 -0
  239. package/dist/types/utility.d.cts +330 -0
  240. package/dist/types/utility.d.cts.map +1 -0
  241. package/dist/types/utility.d.ts +330 -0
  242. package/dist/types/utility.d.ts.map +1 -0
  243. package/dist/types/utility.js +78 -0
  244. package/dist/types/utility.js.map +1 -0
  245. package/package.json +211 -0
  246. package/src/bootstrap.ts +35 -0
  247. package/src/cli/commands/history.ts +569 -0
  248. package/src/cli/commands/init.ts +658 -0
  249. package/src/cli/commands/run.ts +346 -0
  250. package/src/cli/index.ts +642 -0
  251. package/src/config/manager.ts +387 -0
  252. package/src/config/schema.ts +188 -0
  253. package/src/constants.ts +21 -0
  254. package/src/core/benchmark-schema.ts +185 -0
  255. package/src/core/engine.ts +888 -0
  256. package/src/core/engines/accurate-engine.ts +408 -0
  257. package/src/core/engines/index.ts +16 -0
  258. package/src/core/engines/tinybench-engine.ts +335 -0
  259. package/src/core/error-manager.ts +372 -0
  260. package/src/core/loader.ts +324 -0
  261. package/src/core/stats-utils.ts +135 -0
  262. package/src/index.ts +46 -0
  263. package/src/progress/manager.ts +415 -0
  264. package/src/reporters/csv.ts +368 -0
  265. package/src/reporters/human.ts +707 -0
  266. package/src/reporters/index.ts +10 -0
  267. package/src/reporters/json.ts +302 -0
  268. package/src/reporters/registry.ts +349 -0
  269. package/src/reporters/simple.ts +459 -0
  270. package/src/storage/history.ts +600 -0
  271. package/src/types/cli.ts +312 -0
  272. package/src/types/core.ts +414 -0
  273. package/src/types/index.ts +18 -0
  274. package/src/types/interfaces.ts +451 -0
  275. 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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"}