node/benchmark/esm/detect-esm-syntax.js
Joyee Cheung 4eeeab09f0
benchmark: rewrite detect-esm-syntax benchmark
Syntax detection has been unflagged so it's no longer meaningful
to toggle the detection based on CLI flags. It was also previously
benchmarking cached module imports which isn't very meaningful
for subsequent loads. This patch updates the benchmark to toggle
the detection based on the presence of type field in the package.json,
and generates fixtures to benchmark fresh module loads.

PR-URL: https://github.com/nodejs/node/pull/55238
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
2024-10-09 14:16:01 +00:00

37 lines
1.1 KiB
JavaScript

'use strict';
// This benchmarks the cost of running `containsModuleSyntax` on a CommonJS module being imported.
// We use the TypeScript fixture because it's a very large CommonJS file with no ESM syntax: the worst case.
const common = require('../common.js');
const tmpdir = require('../../test/common/tmpdir.js');
const fs = require('node:fs');
const bench = common.createBenchmark(main, {
type: ['with-package-json', 'without-package-json'],
n: [1e4],
});
async function main({ n, type }) {
tmpdir.refresh();
fs.mkdirSync(tmpdir.resolve('bench'));
let loader = '';
const modules = [];
for (let i = 0; i < n; i++) {
const url = tmpdir.fileURL('bench', `mod${i}.js`);
fs.writeFileSync(url, `const foo${i} = ${i};\nexport { foo${i} };\n`);
loader += `import { foo${i} } from './mod${i}.js';\n`;
modules.push(url);
}
const loaderURL = tmpdir.fileURL('bench', 'load.js');
fs.writeFileSync(loaderURL, loader);
if (type === 'with-package-json') {
fs.writeFileSync(tmpdir.resolve('bench', 'package.json'), '{ "type": "module" }');
}
bench.start();
await import(loaderURL);
bench.end(n);
}