Skip to content

Commit

Permalink
benchmark: rewrite detect-esm-syntax benchmark
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
joyeecheung committed Oct 1, 2024
1 parent dec1099 commit 1df909a
Showing 1 changed file with 16 additions and 17 deletions.
33 changes: 16 additions & 17 deletions benchmark/esm/detect-esm-syntax.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,33 @@
// 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 fixtures = require('../../test/common/fixtures.js');
const scriptPath = fixtures.path('snapshot', 'typescript.js');
const fs = require('node:fs');

const bench = common.createBenchmark(main, {
type: ['with-module-syntax-detection', 'without-module-syntax-detection'],
type: ['with-package-json', 'without-package-json'],
n: [1e4],
}, {
flags: ['--experimental-detect-module'],
});

const benchmarkDirectory = tmpdir.fileURL('benchmark-detect-esm-syntax');
const ambiguousURL = new URL('./typescript.js', benchmarkDirectory);
const explicitURL = new URL('./typescript.cjs', benchmarkDirectory);

async function main({ n, type }) {
tmpdir.refresh();
fs.mkdirSync(tmpdir.resolve('bench'));

fs.mkdirSync(benchmarkDirectory, { recursive: true });
fs.cpSync(scriptPath, ambiguousURL);
fs.cpSync(scriptPath, explicitURL);

bench.start();

let loader = '';
const modules = [];
for (let i = 0; i < n; i++) {
const url = type === 'with-module-syntax-detection' ? ambiguousURL : explicitURL;
await import(url);
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`

Check failure on line 23 in benchmark/esm/detect-esm-syntax.js

View workflow job for this annotation

GitHub Actions / lint-js-and-md

Missing semicolon
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);
}

0 comments on commit 1df909a

Please sign in to comment.