Skip to content

Commit 723caba

Browse files
committed
Add benchmarks for node only mode and mock timers.
The only benchmark covers creating selected and non-selected tests when running with --test-only. The mock timers benchmark covers enabling timer mocks, setTimeout, setInterval, setImmediate, scheduler.wait, AbortSignal.timeout, mocked Date.now(), setTime(), and runAll(). Refs: #55723 Signed-off-by: Luan Muniz <luan@luanmuniz.com.br>
1 parent ccc2d7c commit 723caba

2 files changed

Lines changed: 306 additions & 0 deletions

File tree

Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('node:assert');
5+
const { test } = require('node:test');
6+
const nodeTimersPromises = require('node:timers/promises');
7+
8+
const bench = common.createBenchmark(main, {
9+
n: [1, 10, 100, 1000],
10+
mode: [
11+
'enable-empty-apis',
12+
'enable-setTimeout',
13+
'enable-setInterval',
14+
'enable-setImmediate',
15+
'enable-Date',
16+
'enable-scheduler.wait',
17+
'enable-AbortSignal.timeout',
18+
'enable-all',
19+
'enable-default',
20+
'setTimeout',
21+
'setInterval',
22+
'setImmediate',
23+
'scheduler.wait',
24+
'AbortSignal.timeout',
25+
'Date',
26+
'setTime',
27+
'runAll',
28+
],
29+
}, {
30+
// We don't want to test the reporter here.
31+
flags: ['--test-reporter=./benchmark/fixtures/empty-test-reporter.js'],
32+
});
33+
34+
function benchmarkEnable(n, mode) {
35+
const enableMode = mode.replace('enable-', '');
36+
let enableOptions = { apis: [enableMode] };
37+
38+
if (enableMode === 'all') {
39+
enableOptions.apis = ['setTimeout', 'setInterval', 'setImmediate', 'Date', 'scheduler.wait', 'AbortSignal.timeout'];
40+
}
41+
42+
if (enableMode === 'empty-apis') {
43+
enableOptions.apis = [];
44+
}
45+
46+
if (enableMode === 'default') {
47+
enableOptions = undefined;
48+
}
49+
50+
test((t) => {
51+
bench.start();
52+
53+
for (let i = 0; i < n; i++) {
54+
t.mock.timers.enable(enableOptions);
55+
t.mock.timers.reset();
56+
}
57+
58+
bench.end(n);
59+
});
60+
}
61+
62+
function benchmarkSetTimeout(n) {
63+
test((t) => {
64+
let noDead;
65+
66+
t.mock.timers.enable({ apis: ['setTimeout'] });
67+
bench.start();
68+
69+
for (let i = 0; i < n; i++) {
70+
setTimeout(() => {
71+
noDead = i;
72+
}, i + 1);
73+
}
74+
75+
t.mock.timers.tick(n + 1);
76+
bench.end(n);
77+
78+
assert.strictEqual(noDead, n - 1);
79+
});
80+
}
81+
82+
function benchmarkSetInterval(n) {
83+
test((t) => {
84+
let noDead = 0;
85+
86+
t.mock.timers.enable({ apis: ['setInterval'] });
87+
88+
setInterval(() => {
89+
noDead++;
90+
}, 1);
91+
92+
bench.start();
93+
94+
t.mock.timers.tick(n);
95+
96+
bench.end(n);
97+
98+
assert.strictEqual(noDead, n);
99+
});
100+
}
101+
102+
function benchmarkSetImmediate(n) {
103+
test((t) => {
104+
let noDead;
105+
106+
t.mock.timers.enable({ apis: ['setImmediate'] });
107+
108+
bench.start();
109+
110+
for (let i = 0; i < n; i++) {
111+
setImmediate(() => {
112+
noDead = i;
113+
});
114+
}
115+
116+
t.mock.timers.tick(0);
117+
bench.end(n);
118+
119+
assert.strictEqual(noDead, n - 1);
120+
});
121+
}
122+
123+
function benchmarkSchedulerWait(n) {
124+
test(async (t) => {
125+
const promises = [];
126+
let noDead;
127+
128+
t.mock.timers.enable({ apis: ['scheduler.wait'] });
129+
130+
bench.start();
131+
132+
for (let i = 0; i < n; i++) {
133+
promises.push(nodeTimersPromises.scheduler.wait(i + 1).then(() => {
134+
noDead = i;
135+
}));
136+
}
137+
138+
t.mock.timers.tick(n + 1);
139+
await Promise.all(promises);
140+
bench.end(n);
141+
142+
assert.strictEqual(noDead, n - 1);
143+
});
144+
}
145+
146+
function benchmarkAbortSignalTimeout(n) {
147+
test((t) => {
148+
let noDead;
149+
150+
t.mock.timers.enable({ apis: ['AbortSignal.timeout'] });
151+
152+
bench.start();
153+
154+
for (let i = 0; i < n; i++) {
155+
noDead = AbortSignal.timeout(i + 1);
156+
}
157+
158+
t.mock.timers.tick(n + 1);
159+
bench.end(n);
160+
161+
assert.strictEqual(noDead.aborted, true);
162+
});
163+
}
164+
165+
function benchmarkDate(n) {
166+
test((t) => {
167+
let noDead;
168+
169+
t.mock.timers.enable({ apis: ['Date'] });
170+
171+
bench.start();
172+
173+
for (let i = 0; i < n; i++) {
174+
noDead = Date.now();
175+
}
176+
177+
bench.end(n);
178+
179+
assert.strictEqual(noDead, 0);
180+
});
181+
}
182+
183+
function benchmarkSetTime(n) {
184+
test((t) => {
185+
let noDead;
186+
187+
t.mock.timers.enable({ apis: ['Date'] });
188+
189+
bench.start();
190+
191+
for (let i = 0; i < n; i++) {
192+
t.mock.timers.setTime(i);
193+
noDead = Date.now();
194+
}
195+
196+
bench.end(n);
197+
198+
assert.strictEqual(noDead, n - 1);
199+
});
200+
}
201+
202+
function benchmarkRunAll(n) {
203+
test((t) => {
204+
let noDead = 0;
205+
206+
t.mock.timers.enable({ apis: ['setTimeout'] });
207+
208+
for (let i = 0; i < n; i++) {
209+
setTimeout(() => {
210+
noDead++;
211+
}, i + 1);
212+
}
213+
214+
bench.start();
215+
216+
t.mock.timers.runAll();
217+
218+
bench.end(n);
219+
220+
assert.strictEqual(noDead, n);
221+
});
222+
}
223+
224+
function main({ n, mode }) {
225+
switch (mode) {
226+
case 'enable-empty-apis':
227+
case 'enable-setTimeout':
228+
case 'enable-setInterval':
229+
case 'enable-setImmediate':
230+
case 'enable-Date':
231+
case 'enable-scheduler.wait':
232+
case 'enable-AbortSignal.timeout':
233+
case 'enable-all':
234+
case 'enable-default':
235+
benchmarkEnable(n, mode);
236+
break;
237+
case 'setTimeout':
238+
benchmarkSetTimeout(n);
239+
break;
240+
case 'setInterval':
241+
benchmarkSetInterval(n);
242+
break;
243+
case 'setImmediate':
244+
benchmarkSetImmediate(n);
245+
break;
246+
case 'scheduler.wait':
247+
benchmarkSchedulerWait(n);
248+
break;
249+
case 'AbortSignal.timeout':
250+
benchmarkAbortSignalTimeout(n);
251+
break;
252+
case 'Date':
253+
benchmarkDate(n);
254+
break;
255+
case 'setTime':
256+
benchmarkSetTime(n);
257+
break;
258+
case 'runAll':
259+
benchmarkRunAll(n);
260+
break;
261+
}
262+
}

benchmark/test_runner/test-only.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const { finished } = require('node:stream/promises');
5+
const reporter = require('../fixtures/empty-test-reporter');
6+
const { test } = require('node:test');
7+
8+
const bench = common.createBenchmark(main, {
9+
n: [1, 10, 100, 1000],
10+
selected: [1],
11+
}, {
12+
// We don't want to test the reporter here.
13+
flags: [
14+
'--test-reporter=./benchmark/fixtures/empty-test-reporter.js',
15+
'--test-only',
16+
],
17+
});
18+
19+
async function run({ n, selected }) {
20+
// eslint-disable-next-line no-unused-vars
21+
let avoidV8Optimization;
22+
23+
for (let i = 0; i < selected; i++) {
24+
test(`selected-${i}`, { only: true }, () => {
25+
avoidV8Optimization = i;
26+
});
27+
}
28+
29+
for (let i = 0; i < n; i++) {
30+
test(`not-selected-${i}`, () => {
31+
throw new Error(`This test ${i} should not run.`);
32+
});
33+
}
34+
35+
return finished(reporter);
36+
}
37+
38+
function main(params) {
39+
bench.start();
40+
41+
run(params).then(() => {
42+
bench.end(params.n);
43+
});
44+
}

0 commit comments

Comments
 (0)