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,292 @@
1
+ "use strict";
2
+ /**
3
+ * AccurateEngine - High-accuracy benchmark execution implementation
4
+ *
5
+ * Concrete implementation of ModestBenchEngine using measurement techniques
6
+ * adapted from bench-node for improved accuracy. Uses V8 optimization guards
7
+ * and array-based sample collection with IQR outlier removal.
8
+ *
9
+ * **Requirements:**
10
+ *
11
+ * - Node.js >= 20
12
+ * - --allow-natives-syntax flag (for V8 optimization guards)
13
+ *
14
+ * **Key Features:**
15
+ *
16
+ * - V8NeverOptimize guards prevent JIT optimization artifacts
17
+ * - Adaptive iteration calculation based on operation duration
18
+ * - IQR-based outlier removal for improved stability
19
+ * - Comprehensive statistics (mean, stdDev, variance, CV, percentiles)
20
+ * - Full ModestBench feature support (progress, abort, filtering)
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.AccurateEngine = void 0;
24
+ const engine_js_1 = require("../engine.cjs");
25
+ const stats_utils_js_1 = require("../stats-utils.cjs");
26
+ /**
27
+ * AccurateEngine - High-accuracy benchmarking with V8 optimization guards
28
+ */
29
+ class AccurateEngine extends engine_js_1.ModestBenchEngine {
30
+ /**
31
+ * Maximum iterations per round to prevent overwhelming Node.js test runner
32
+ * and excessive memory usage
33
+ */
34
+ static MAX_ITERATIONS_PER_ROUND = 10000;
35
+ hasCheckedNativeSyntax = false;
36
+ nativeSyntaxErrorShown = false;
37
+ nativeSyntaxSupported = false;
38
+ /**
39
+ * Execute a single benchmark task using accurate measurement techniques
40
+ *
41
+ * This is the main integration point with ModestBench's engine abstraction.
42
+ */
43
+ async executeBenchmarkTask(taskName, taskData, config, _reporters = [], signal) {
44
+ try {
45
+ if (!taskData.fn || typeof taskData.fn !== 'function') {
46
+ throw new Error('Benchmark task must have a "fn" function property');
47
+ }
48
+ // Check for V8 native syntax support
49
+ const useOptGuards = this.checkNativeSyntax();
50
+ // Show helpful error if native syntax not available
51
+ if (!useOptGuards && !this.nativeSyntaxErrorShown) {
52
+ if (!config.quiet) {
53
+ console.warn('\n⚠️ AccurateEngine requires --allow-natives-syntax flag for best accuracy.', '\nRunning in fallback mode (reduced accuracy).', '\n\nTo enable V8 optimization guards:', '\n node --allow-natives-syntax --test', '\n or add to package.json: "test": "node --allow-natives-syntax ..."', '\n');
54
+ }
55
+ this.nativeSyntaxErrorShown = true;
56
+ }
57
+ // Execute benchmark with or without opt guards
58
+ const rawSamples = useOptGuards
59
+ ? await this.executeBenchmarkWithOptGuards(taskData.fn, config, signal)
60
+ : await this.executeBenchmarkBasic(taskData.fn, config, signal);
61
+ // Check if aborted
62
+ if (signal?.aborted) {
63
+ return {
64
+ cv: 0,
65
+ error: new Error('Benchmark aborted by user signal'),
66
+ iterations: rawSamples.length,
67
+ marginOfError: 0,
68
+ max: 0,
69
+ mean: 0,
70
+ metadata: taskData.metadata ?? {},
71
+ min: 0,
72
+ name: taskName,
73
+ opsPerSecond: 0,
74
+ p95: 0,
75
+ p99: 0,
76
+ stdDev: 0,
77
+ ...(taskData.tags ? { tags: taskData.tags } : {}),
78
+ variance: 0,
79
+ };
80
+ }
81
+ // Remove outliers using IQR method
82
+ const samples = (0, stats_utils_js_1.removeOutliersIQR)(rawSamples);
83
+ // Calculate statistics
84
+ const stats = (0, stats_utils_js_1.calculateStatistics)(samples);
85
+ // Transform to TaskResult
86
+ const taskResult = {
87
+ cv: stats.cv,
88
+ iterations: samples.length,
89
+ marginOfError: stats.marginOfError,
90
+ max: stats.max,
91
+ mean: stats.mean, // nanoseconds
92
+ metadata: taskData.metadata ?? {},
93
+ min: stats.min,
94
+ name: taskName,
95
+ opsPerSecond: 1e9 / stats.mean, // Convert ns to ops/sec
96
+ p95: stats.p95,
97
+ p99: stats.p99,
98
+ stdDev: stats.stdDev,
99
+ variance: stats.variance,
100
+ ...(taskData.tags ? { tags: taskData.tags } : {}),
101
+ };
102
+ return taskResult;
103
+ }
104
+ catch (error) {
105
+ const executionError = error instanceof Error ? error : new Error(String(error));
106
+ const errorResult = {
107
+ cv: 0,
108
+ error: executionError,
109
+ iterations: 0,
110
+ marginOfError: 0,
111
+ max: 0,
112
+ mean: 0,
113
+ metadata: taskData.metadata ?? {},
114
+ min: 0,
115
+ name: taskName,
116
+ opsPerSecond: 0,
117
+ p95: 0,
118
+ p99: 0,
119
+ stdDev: 0,
120
+ ...(taskData.tags ? { tags: taskData.tags } : {}),
121
+ variance: 0,
122
+ };
123
+ return errorResult;
124
+ }
125
+ }
126
+ /**
127
+ * Calculate initial iterations based on benchmark characteristics Adapted
128
+ * from bench-node's getInitialIterations algorithm
129
+ */
130
+ async calculateInitialIterations(fn, targetTime) {
131
+ // eslint-disable-next-line @typescript-eslint/unbound-method
132
+ const timer = process.hrtime.bigint;
133
+ const MIN_RESOLUTION = 0.5; // nanoseconds
134
+ const SCALE = 1e9; // ns to seconds
135
+ // Run a quick test with 30 iterations
136
+ const testIterations = 30;
137
+ const start = timer();
138
+ for (let i = 0; i < testIterations; i++) {
139
+ fn();
140
+ }
141
+ const duration = Number(timer() - start);
142
+ const durationPerOp = Math.max(MIN_RESOLUTION, duration / testIterations);
143
+ // Calculate how many iterations we need for targetTime
144
+ const totalOpsForTargetTime = targetTime / (durationPerOp / SCALE);
145
+ return Math.min(Number.MAX_SAFE_INTEGER, Math.max(1, Math.round(totalOpsForTargetTime)));
146
+ }
147
+ /**
148
+ * Check if V8 native syntax is available
149
+ */
150
+ checkNativeSyntax() {
151
+ if (this.hasCheckedNativeSyntax) {
152
+ return this.nativeSyntaxSupported;
153
+ }
154
+ try {
155
+ // Try to use a V8 intrinsic - this is the definitive test
156
+ // Must create AND execute the function to test if syntax is available
157
+ // SAFETY: This string is hardcoded and never influenced by user input.
158
+ // We use new Function() specifically to test V8 intrinsics support.
159
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval, @typescript-eslint/no-unsafe-call
160
+ new Function('%NeverOptimizeFunction(() => {})')();
161
+ this.nativeSyntaxSupported = true;
162
+ }
163
+ catch {
164
+ this.nativeSyntaxSupported = false;
165
+ }
166
+ this.hasCheckedNativeSyntax = true;
167
+ return this.nativeSyntaxSupported;
168
+ }
169
+ /**
170
+ * Execute benchmark WITHOUT V8 optimization guards (fallback)
171
+ */
172
+ async executeBenchmarkBasic(fn, config, signal) {
173
+ // eslint-disable-next-line @typescript-eslint/unbound-method
174
+ const timer = process.hrtime.bigint;
175
+ const samples = [];
176
+ const SCALE = 1e9;
177
+ const targetTime = config.time / 1000;
178
+ const initialIterations = await this.calculateInitialIterations(fn, targetTime);
179
+ if (config.warmup > 0) {
180
+ const warmupTime = Math.min(config.warmup / 1000, 0.05);
181
+ await this.runWarmup(fn, initialIterations, warmupTime);
182
+ }
183
+ const maxDuration = (config.time / 1000) * SCALE;
184
+ let timeSpent = 0;
185
+ let iterations = initialIterations;
186
+ while (timeSpent < maxDuration || samples.length < config.iterations) {
187
+ if (signal?.aborted) {
188
+ break;
189
+ }
190
+ const start = timer();
191
+ for (let i = 0; i < iterations; i++) {
192
+ fn();
193
+ }
194
+ const duration = Number(timer() - start);
195
+ const durationPerOp = duration / iterations;
196
+ samples.push(durationPerOp);
197
+ timeSpent += duration;
198
+ if (samples.length % 100 === 0) {
199
+ this.progressManager.forceUpdate();
200
+ }
201
+ const remainingTime = Math.max(0, (maxDuration - timeSpent) / SCALE);
202
+ iterations = Math.round(remainingTime / (durationPerOp / SCALE));
203
+ iterations = Math.max(1, Math.min(AccurateEngine.MAX_ITERATIONS_PER_ROUND, iterations));
204
+ }
205
+ return samples;
206
+ }
207
+ /**
208
+ * Execute benchmark WITH V8 optimization guards (more accurate)
209
+ */
210
+ async executeBenchmarkWithOptGuards(fn, config, signal) {
211
+ // eslint-disable-next-line @typescript-eslint/unbound-method
212
+ const timer = process.hrtime.bigint;
213
+ const samples = [];
214
+ const SCALE = 1e9;
215
+ // Calculate iterations based on config
216
+ const targetTime = config.time / 1000; // ms to seconds
217
+ const initialIterations = await this.calculateInitialIterations(fn, targetTime);
218
+ // Run warmup
219
+ if (config.warmup > 0) {
220
+ const warmupTime = Math.min(config.warmup / 1000, 0.05); // Max 50ms warmup
221
+ await this.runWarmup(fn, initialIterations, warmupTime);
222
+ }
223
+ // Create DoNotOptimize wrapper using V8 intrinsics
224
+ // This prevents V8 from optimizing away the benchmark code
225
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
226
+ const DoNotOptimize = new Function('x', 'return x');
227
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
228
+ const NeverOptimize = new Function('fn', '%NeverOptimizeFunction(fn); return fn;');
229
+ // eslint-disable-next-line new-cap, @typescript-eslint/no-unsafe-call
230
+ const guardedDoNotOptimize = NeverOptimize(DoNotOptimize);
231
+ const maxDuration = (config.time / 1000) * SCALE;
232
+ let timeSpent = 0;
233
+ let iterations = initialIterations;
234
+ // Main benchmark loop
235
+ while (timeSpent < maxDuration || samples.length < config.iterations) {
236
+ if (signal?.aborted) {
237
+ break;
238
+ }
239
+ const start = timer();
240
+ for (let i = 0; i < iterations; i++) {
241
+ const result = fn();
242
+ guardedDoNotOptimize(result); // Prevent optimization
243
+ }
244
+ const duration = Number(timer() - start);
245
+ const durationPerOp = duration / iterations;
246
+ samples.push(durationPerOp);
247
+ timeSpent += duration;
248
+ // Update progress every 100 samples
249
+ if (samples.length % 100 === 0) {
250
+ this.progressManager.forceUpdate();
251
+ }
252
+ // Adjust iterations for next round
253
+ const remainingTime = Math.max(0, (maxDuration - timeSpent) / SCALE);
254
+ iterations = Math.round(remainingTime / (durationPerOp / SCALE));
255
+ iterations = Math.max(1, Math.min(AccurateEngine.MAX_ITERATIONS_PER_ROUND, iterations));
256
+ }
257
+ return samples;
258
+ }
259
+ /**
260
+ * Run warmup phase Adapted from bench-node's runWarmup algorithm
261
+ */
262
+ async runWarmup(
263
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
264
+ fn, initialIterations, warmupTime) {
265
+ // eslint-disable-next-line @typescript-eslint/unbound-method
266
+ const timer = process.hrtime.bigint;
267
+ const MIN_RESOLUTION = 0.5;
268
+ const SCALE = 1e9;
269
+ const maxDuration = warmupTime * SCALE;
270
+ const minSamples = 10;
271
+ let timeSpent = 0n;
272
+ let samples = 0;
273
+ let iterations = Math.min(initialIterations, AccurateEngine.MAX_ITERATIONS_PER_ROUND);
274
+ while (Number(timeSpent) < maxDuration || samples <= minSamples) {
275
+ const start = timer();
276
+ for (let i = 0; i < iterations; i++) {
277
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
278
+ fn();
279
+ }
280
+ const duration = timer() - start;
281
+ timeSpent += duration;
282
+ samples++;
283
+ // Adjust iterations for next round
284
+ const durationPerOp = Math.max(MIN_RESOLUTION, Number(duration) / iterations);
285
+ const remainingTime = Math.max(0, (maxDuration - Number(timeSpent)) / SCALE);
286
+ iterations = Math.round(remainingTime / (durationPerOp / SCALE));
287
+ iterations = Math.max(1, Math.min(AccurateEngine.MAX_ITERATIONS_PER_ROUND, iterations));
288
+ }
289
+ }
290
+ }
291
+ exports.AccurateEngine = AccurateEngine;
292
+ //# sourceMappingURL=accurate-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accurate-engine.js","sourceRoot":"","sources":["../../../src/core/engines/accurate-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * AccurateEngine - High-accuracy benchmark execution implementation
3
+ *
4
+ * Concrete implementation of ModestBenchEngine using measurement techniques
5
+ * adapted from bench-node for improved accuracy. Uses V8 optimization guards
6
+ * and array-based sample collection with IQR outlier removal.
7
+ *
8
+ * **Requirements:**
9
+ *
10
+ * - Node.js >= 20
11
+ * - --allow-natives-syntax flag (for V8 optimization guards)
12
+ *
13
+ * **Key Features:**
14
+ *
15
+ * - V8NeverOptimize guards prevent JIT optimization artifacts
16
+ * - Adaptive iteration calculation based on operation duration
17
+ * - IQR-based outlier removal for improved stability
18
+ * - Comprehensive statistics (mean, stdDev, variance, CV, percentiles)
19
+ * - Full ModestBench feature support (progress, abort, filtering)
20
+ */
21
+ import type { BenchmarkTask, ModestBenchConfig, Reporter, TaskResult } from "../../types/index.cjs";
22
+ import { ModestBenchEngine } from "../engine.cjs";
23
+ /**
24
+ * AccurateEngine - High-accuracy benchmarking with V8 optimization guards
25
+ */
26
+ export declare class AccurateEngine extends ModestBenchEngine {
27
+ /**
28
+ * Maximum iterations per round to prevent overwhelming Node.js test runner
29
+ * and excessive memory usage
30
+ */
31
+ private static readonly MAX_ITERATIONS_PER_ROUND;
32
+ private hasCheckedNativeSyntax;
33
+ private nativeSyntaxErrorShown;
34
+ private nativeSyntaxSupported;
35
+ /**
36
+ * Execute a single benchmark task using accurate measurement techniques
37
+ *
38
+ * This is the main integration point with ModestBench's engine abstraction.
39
+ */
40
+ protected executeBenchmarkTask(taskName: string, taskData: BenchmarkTask, config: ModestBenchConfig, _reporters?: Reporter[], signal?: AbortSignal): Promise<TaskResult>;
41
+ /**
42
+ * Calculate initial iterations based on benchmark characteristics Adapted
43
+ * from bench-node's getInitialIterations algorithm
44
+ */
45
+ private calculateInitialIterations;
46
+ /**
47
+ * Check if V8 native syntax is available
48
+ */
49
+ private checkNativeSyntax;
50
+ /**
51
+ * Execute benchmark WITHOUT V8 optimization guards (fallback)
52
+ */
53
+ private executeBenchmarkBasic;
54
+ /**
55
+ * Execute benchmark WITH V8 optimization guards (more accurate)
56
+ */
57
+ private executeBenchmarkWithOptGuards;
58
+ /**
59
+ * Run warmup phase Adapted from bench-node's runWarmup algorithm
60
+ */
61
+ private runWarmup;
62
+ }
63
+ //# sourceMappingURL=accurate-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accurate-engine.d.ts","sourceRoot":"","sources":["../../../src/core/engines/accurate-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACX,8BAA6B;AAE9B,OAAO,EAAE,iBAAiB,EAAE,sBAAqB;AAGjD;;GAEG;AACH,qBAAa,cAAe,SAAQ,iBAAiB;IACnD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAEzD,OAAO,CAAC,sBAAsB,CAAS;IAEvC,OAAO,CAAC,sBAAsB,CAAS;IAEvC,OAAO,CAAC,qBAAqB,CAAS;IAEtC;;;;OAIG;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;IAoGtB;;;OAGG;YACW,0BAA0B;IA6BxC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;YACW,qBAAqB;IAyDnC;;OAEG;YACW,6BAA6B;IA6E3C;;OAEG;YACW,SAAS;CAgDxB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * AccurateEngine - High-accuracy benchmark execution implementation
3
+ *
4
+ * Concrete implementation of ModestBenchEngine using measurement techniques
5
+ * adapted from bench-node for improved accuracy. Uses V8 optimization guards
6
+ * and array-based sample collection with IQR outlier removal.
7
+ *
8
+ * **Requirements:**
9
+ *
10
+ * - Node.js >= 20
11
+ * - --allow-natives-syntax flag (for V8 optimization guards)
12
+ *
13
+ * **Key Features:**
14
+ *
15
+ * - V8NeverOptimize guards prevent JIT optimization artifacts
16
+ * - Adaptive iteration calculation based on operation duration
17
+ * - IQR-based outlier removal for improved stability
18
+ * - Comprehensive statistics (mean, stdDev, variance, CV, percentiles)
19
+ * - Full ModestBench feature support (progress, abort, filtering)
20
+ */
21
+ import type { BenchmarkTask, ModestBenchConfig, Reporter, TaskResult } from "../../types/index.js";
22
+ import { ModestBenchEngine } from "../engine.js";
23
+ /**
24
+ * AccurateEngine - High-accuracy benchmarking with V8 optimization guards
25
+ */
26
+ export declare class AccurateEngine extends ModestBenchEngine {
27
+ /**
28
+ * Maximum iterations per round to prevent overwhelming Node.js test runner
29
+ * and excessive memory usage
30
+ */
31
+ private static readonly MAX_ITERATIONS_PER_ROUND;
32
+ private hasCheckedNativeSyntax;
33
+ private nativeSyntaxErrorShown;
34
+ private nativeSyntaxSupported;
35
+ /**
36
+ * Execute a single benchmark task using accurate measurement techniques
37
+ *
38
+ * This is the main integration point with ModestBench's engine abstraction.
39
+ */
40
+ protected executeBenchmarkTask(taskName: string, taskData: BenchmarkTask, config: ModestBenchConfig, _reporters?: Reporter[], signal?: AbortSignal): Promise<TaskResult>;
41
+ /**
42
+ * Calculate initial iterations based on benchmark characteristics Adapted
43
+ * from bench-node's getInitialIterations algorithm
44
+ */
45
+ private calculateInitialIterations;
46
+ /**
47
+ * Check if V8 native syntax is available
48
+ */
49
+ private checkNativeSyntax;
50
+ /**
51
+ * Execute benchmark WITHOUT V8 optimization guards (fallback)
52
+ */
53
+ private executeBenchmarkBasic;
54
+ /**
55
+ * Execute benchmark WITH V8 optimization guards (more accurate)
56
+ */
57
+ private executeBenchmarkWithOptGuards;
58
+ /**
59
+ * Run warmup phase Adapted from bench-node's runWarmup algorithm
60
+ */
61
+ private runWarmup;
62
+ }
63
+ //# sourceMappingURL=accurate-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accurate-engine.d.ts","sourceRoot":"","sources":["../../../src/core/engines/accurate-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACX,6BAA6B;AAE9B,OAAO,EAAE,iBAAiB,EAAE,qBAAqB;AAGjD;;GAEG;AACH,qBAAa,cAAe,SAAQ,iBAAiB;IACnD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAEzD,OAAO,CAAC,sBAAsB,CAAS;IAEvC,OAAO,CAAC,sBAAsB,CAAS;IAEvC,OAAO,CAAC,qBAAqB,CAAS;IAEtC;;;;OAIG;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;IAoGtB;;;OAGG;YACW,0BAA0B;IA6BxC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;YACW,qBAAqB;IAyDnC;;OAEG;YACW,6BAA6B;IA6E3C;;OAEG;YACW,SAAS;CAgDxB"}