(
fn: () => void,
expected?: { time: number; mem: number; exprs: number }
)
| 359 | expected?: { time: number; mem: number; exprs: number } |
| 360 | ) { |
| 361 | const startMem = process.memoryUsage().heapUsed; |
| 362 | const start = globalThis.performance.now(); |
| 363 | |
| 364 | fn(); |
| 365 | |
| 366 | const end = globalThis.performance.now(); |
| 367 | const endMem = process.memoryUsage().heapUsed; |
| 368 | |
| 369 | const delta = { |
| 370 | time: end - start, |
| 371 | mem: endMem - startMem, |
| 372 | }; |
| 373 | if (!expected) { |
| 374 | console.log('mem:', delta.mem, ', time:', delta.time.toFixed(2)); |
| 375 | return 1000; |
| 376 | } |
| 377 | |
| 378 | // Memory is not a reliable measurement because of unpredictable GC |
| 379 | const variance = delta.time / expected.time - 1; |
| 380 | |
| 381 | if (true || Math.abs(variance) > 0.1) { |
| 382 | console.error( |
| 383 | `\u001b[0mVariance ${(variance * 100).toFixed(1)}% (actual vs expected)`, |
| 384 | `\n mem ${emoji(delta.mem, expected.mem)}` + |
| 385 | `${memToString(delta.mem)} (${memToString(expected.mem)} ${Number( |
| 386 | (100 * delta.mem) / expected.mem |
| 387 | ).toFixed(2)}%)` + |
| 388 | `\n time ${emoji(delta.time, expected.time)}`, |
| 389 | `${timeToString(delta.time)} (${timeToString(expected.time)} ${Number( |
| 390 | (100 * delta.time) / expected.time |
| 391 | ).toFixed(2)}%)` |
| 392 | ); |
| 393 | } |
| 394 | return variance; |
| 395 | } |
| 396 | |
| 397 | function emoji(a, b): string { |
| 398 | if (a === b) return '✅'; |
| 399 | if (a < b) return '\u001b[32m\u25BC\u001b[0m'; // green up triangle |
| 400 | return '\u001b[31m\u25B2\u001b[0m'; |
| 401 | } |
| 402 |
nothing calls this directly
no test coverage detected