mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 10:15:07 +08:00
benchmark: add test-only and mock timers cases
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: https://github.com/nodejs/node/issues/55723 Signed-off-by: Luan Muniz <luan@luanmuniz.com.br> PR-URL: https://github.com/nodejs/node/pull/64097 Reviewed-By: Aviv Keller <me@aviv.sh> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
This commit is contained in:
1 parent
626f42d437
commit
82a710203e
2 files changed
+301
No files matched your search
@@ -0,0 +1,262 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const assert = require('node:assert');
|
||||
const { test } = require('node:test');
|
||||
const nodeTimersPromises = require('node:timers/promises');
|
||||
|
||||
const bench = common.createBenchmark(main, {
|
||||
n: [1000],
|
||||
mode: [
|
||||
'enable-empty-apis',
|
||||
'enable-setTimeout',
|
||||
'enable-setInterval',
|
||||
'enable-setImmediate',
|
||||
'enable-Date',
|
||||
'enable-scheduler.wait',
|
||||
'enable-AbortSignal.timeout',
|
||||
'enable-all',
|
||||
'enable-default',
|
||||
'setTimeout',
|
||||
'setInterval',
|
||||
'setImmediate',
|
||||
'scheduler.wait',
|
||||
'AbortSignal.timeout',
|
||||
'Date',
|
||||
'setTime',
|
||||
'runAll',
|
||||
],
|
||||
}, {
|
||||
// We don't want to test the reporter here.
|
||||
flags: ['--test-reporter=./benchmark/fixtures/empty-test-reporter.js'],
|
||||
});
|
||||
|
||||
function benchmarkEnable(n, mode) {
|
||||
const enableMode = mode.replace('enable-', '');
|
||||
let enableOptions = { apis: [enableMode] };
|
||||
|
||||
if (enableMode === 'all') {
|
||||
enableOptions.apis = ['setTimeout', 'setInterval', 'setImmediate', 'Date', 'scheduler.wait', 'AbortSignal.timeout'];
|
||||
}
|
||||
|
||||
if (enableMode === 'empty-apis') {
|
||||
enableOptions.apis = [];
|
||||
}
|
||||
|
||||
if (enableMode === 'default') {
|
||||
enableOptions = undefined;
|
||||
}
|
||||
|
||||
test((t) => {
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
t.mock.timers.enable(enableOptions);
|
||||
t.mock.timers.reset();
|
||||
}
|
||||
|
||||
bench.end(n);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkSetTimeout(n) {
|
||||
test((t) => {
|
||||
let noDead;
|
||||
|
||||
t.mock.timers.enable({ apis: ['setTimeout'] });
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
setTimeout(() => {
|
||||
noDead = i;
|
||||
}, i + 1);
|
||||
}
|
||||
|
||||
t.mock.timers.tick(n + 1);
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, n - 1);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkSetInterval(n) {
|
||||
test((t) => {
|
||||
let noDead = 0;
|
||||
|
||||
t.mock.timers.enable({ apis: ['setInterval'] });
|
||||
|
||||
setInterval(() => {
|
||||
noDead++;
|
||||
}, 1);
|
||||
|
||||
bench.start();
|
||||
|
||||
t.mock.timers.tick(n);
|
||||
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, n);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkSetImmediate(n) {
|
||||
test((t) => {
|
||||
let noDead;
|
||||
|
||||
t.mock.timers.enable({ apis: ['setImmediate'] });
|
||||
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
setImmediate(() => {
|
||||
noDead = i;
|
||||
});
|
||||
}
|
||||
|
||||
t.mock.timers.tick(0);
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, n - 1);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkSchedulerWait(n) {
|
||||
test(async (t) => {
|
||||
const promises = [];
|
||||
let noDead;
|
||||
|
||||
t.mock.timers.enable({ apis: ['scheduler.wait'] });
|
||||
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
promises.push(nodeTimersPromises.scheduler.wait(i + 1).then(() => {
|
||||
noDead = i;
|
||||
}));
|
||||
}
|
||||
|
||||
t.mock.timers.tick(n + 1);
|
||||
await Promise.all(promises);
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, n - 1);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkAbortSignalTimeout(n) {
|
||||
test((t) => {
|
||||
let noDead;
|
||||
|
||||
t.mock.timers.enable({ apis: ['AbortSignal.timeout'] });
|
||||
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
noDead = AbortSignal.timeout(i + 1);
|
||||
}
|
||||
|
||||
t.mock.timers.tick(n + 1);
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead.aborted, true);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkDate(n) {
|
||||
test((t) => {
|
||||
let noDead;
|
||||
|
||||
t.mock.timers.enable({ apis: ['Date'] });
|
||||
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
noDead = Date.now();
|
||||
}
|
||||
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, 0);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkSetTime(n) {
|
||||
test((t) => {
|
||||
let noDead;
|
||||
|
||||
t.mock.timers.enable({ apis: ['Date'] });
|
||||
|
||||
bench.start();
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
t.mock.timers.setTime(i);
|
||||
noDead = Date.now();
|
||||
}
|
||||
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, n - 1);
|
||||
});
|
||||
}
|
||||
|
||||
function benchmarkRunAll(n) {
|
||||
test((t) => {
|
||||
let noDead = 0;
|
||||
|
||||
t.mock.timers.enable({ apis: ['setTimeout'] });
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
setTimeout(() => {
|
||||
noDead++;
|
||||
}, i + 1);
|
||||
}
|
||||
|
||||
bench.start();
|
||||
|
||||
t.mock.timers.runAll();
|
||||
|
||||
bench.end(n);
|
||||
|
||||
assert.strictEqual(noDead, n);
|
||||
});
|
||||
}
|
||||
|
||||
function main({ n, mode }) {
|
||||
switch (mode) {
|
||||
case 'enable-empty-apis':
|
||||
case 'enable-setTimeout':
|
||||
case 'enable-setInterval':
|
||||
case 'enable-setImmediate':
|
||||
case 'enable-Date':
|
||||
case 'enable-scheduler.wait':
|
||||
case 'enable-AbortSignal.timeout':
|
||||
case 'enable-all':
|
||||
case 'enable-default':
|
||||
benchmarkEnable(n, mode);
|
||||
break;
|
||||
case 'setTimeout':
|
||||
benchmarkSetTimeout(n);
|
||||
break;
|
||||
case 'setInterval':
|
||||
benchmarkSetInterval(n);
|
||||
break;
|
||||
case 'setImmediate':
|
||||
benchmarkSetImmediate(n);
|
||||
break;
|
||||
case 'scheduler.wait':
|
||||
benchmarkSchedulerWait(n);
|
||||
break;
|
||||
case 'AbortSignal.timeout':
|
||||
benchmarkAbortSignalTimeout(n);
|
||||
break;
|
||||
case 'Date':
|
||||
benchmarkDate(n);
|
||||
break;
|
||||
case 'setTime':
|
||||
benchmarkSetTime(n);
|
||||
break;
|
||||
case 'runAll':
|
||||
benchmarkRunAll(n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const { finished } = require('node:stream/promises');
|
||||
const reporter = require('../fixtures/empty-test-reporter');
|
||||
const { test } = require('node:test');
|
||||
|
||||
const bench = common.createBenchmark(main, {
|
||||
n: [10000],
|
||||
selected: [1],
|
||||
}, {
|
||||
// We don't want to test the reporter here.
|
||||
flags: [
|
||||
'--test-reporter=./benchmark/fixtures/empty-test-reporter.js',
|
||||
'--test-only',
|
||||
],
|
||||
});
|
||||
|
||||
async function run({ n, selected }) {
|
||||
for (let i = 0; i < selected; i++) {
|
||||
test(`selected-${i}`, { only: true }, () => {});
|
||||
}
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
test(`not-selected-${i}`, () => {
|
||||
throw new Error(`This test ${i} should not run.`);
|
||||
});
|
||||
}
|
||||
|
||||
return finished(reporter);
|
||||
}
|
||||
|
||||
function main(params) {
|
||||
bench.start();
|
||||
|
||||
run(params).then(() => {
|
||||
bench.end(params.n);
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user