Commit | Line | Data |
---|---|---|
ed2968f2 | 1 | const Benchmark = require('benchmark') |
a9c78d5d | 2 | const { LIST_FORMATTER, sleep } = require('./benchmark-utils') |
ed2968f2 JB |
3 | |
4 | const suite = new Benchmark.Suite() | |
5 | ||
6 | const timeout = 2000 | |
a8bf8b7d | 7 | const interval = 1000 |
ed2968f2 | 8 | |
a6c34381 JB |
9 | /** |
10 | * @param timeoutMs | |
11 | */ | |
12 | function dummyTimeoutBusyWait (timeoutMs) { | |
13 | const timeoutTimestampMs = Date.now() + timeoutMs | |
14 | do {} while (Date.now() < timeoutTimestampMs) | |
15 | } | |
16 | ||
e9bfc28e JB |
17 | /** |
18 | * @param timeoutMs | |
19 | */ | |
a8bf8b7d | 20 | async function sleepTimeoutBusyWait (timeoutMs) { |
a9c78d5d | 21 | const timeoutTimestampMs = Date.now() + timeoutMs |
a8bf8b7d JB |
22 | do { |
23 | await sleep(interval) | |
24 | } while (Date.now() < timeoutTimestampMs) | |
a9c78d5d JB |
25 | } |
26 | ||
27 | /** | |
28 | * @param timeoutMs | |
e47f67db | 29 | * @param intervalMs |
a9c78d5d | 30 | */ |
a8bf8b7d JB |
31 | async function divideAndConquerTimeoutBusyWait ( |
32 | timeoutMs, | |
33 | intervalMs = interval | |
34 | ) { | |
e47f67db | 35 | const tries = Math.round(timeoutMs / intervalMs) |
a9c78d5d JB |
36 | let count = 0 |
37 | do { | |
38 | count++ | |
e47f67db | 39 | await sleep(intervalMs) |
a9c78d5d | 40 | } while (count <= tries) |
ed2968f2 JB |
41 | } |
42 | ||
e9bfc28e JB |
43 | /** |
44 | * @param timeoutMs | |
e47f67db | 45 | * @param intervalMs |
e9bfc28e | 46 | */ |
a8bf8b7d | 47 | function setIntervalTimeoutBusyWait (timeoutMs, intervalMs = interval) { |
e47f67db | 48 | const tries = Math.round(timeoutMs / intervalMs) |
ed2968f2 JB |
49 | let count = 0 |
50 | const triesSetInterval = setInterval(() => { | |
51 | count++ | |
52 | if (count === tries) { | |
53 | clearInterval(triesSetInterval) | |
54 | } | |
e47f67db | 55 | }, intervalMs) |
ed2968f2 JB |
56 | } |
57 | ||
58 | suite | |
a6c34381 JB |
59 | .add('dummyTimeoutBusyWait', function () { |
60 | dummyTimeoutBusyWait(timeout) | |
61 | }) | |
a8bf8b7d JB |
62 | .add('sleepTimeoutBusyWait', async function () { |
63 | sleepTimeoutBusyWait(timeout) | |
ed2968f2 | 64 | }) |
a9c78d5d JB |
65 | .add('divideAndConquerTimeoutBusyWait', async function () { |
66 | await divideAndConquerTimeoutBusyWait(timeout) | |
67 | }) | |
ed2968f2 JB |
68 | .add('setIntervalTimeoutBusyWait', function () { |
69 | setIntervalTimeoutBusyWait(timeout) | |
70 | }) | |
71 | .on('cycle', function (event) { | |
72 | console.log(event.target.toString()) | |
73 | }) | |
74 | .on('complete', function () { | |
75 | console.log( | |
76 | 'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name')) | |
77 | ) | |
78 | // eslint-disable-next-line no-process-exit | |
79 | process.exit() | |
80 | }) | |
81 | .run() |