Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
benchmark: add vm.SourceTextModule benchmark
  • Loading branch information
joyeecheung committed Oct 13, 2025
commit 2e71cf1e06e0b409e5e278bf3e6770ce3f2e0b3a
37 changes: 37 additions & 0 deletions benchmark/esm/import-esm-reload.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
'use strict';

const common = require('../common');
const fs = require('fs');
const tmpdir = require('../../test/common/tmpdir');
const assert = require('assert');
const { pathToFileURL } = require('url');
const bench = common.createBenchmark(main, {
count: [1, 100],
n: [1000],
});

function prepare(count) {
tmpdir.refresh();
const dir = tmpdir.resolve('modules');
fs.mkdirSync(dir, { recursive: true });
let modSource = '';
for (let i = 0; i < count; ++i) {
modSource += `export const value${i} = 1;\n`;
}
const script = tmpdir.resolve('mod.js');
fs.writeFileSync(script, modSource, 'utf8');
return script;
}

async function main({ n, count }) {
const script = prepare(count);
const url = pathToFileURL(script).href;
let result = 0;
bench.start();
for (let i = 0; i < n; i++) {
const mod = await import(`${url}?t=${i}`);
result += mod[`value${count - 1}`];
}
bench.end(n);
assert.strictEqual(result, n);
}
48 changes: 48 additions & 0 deletions benchmark/vm/source-text-module-chained.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
'use strict';

const vm = require('vm');
const common = require('../common.js');
const assert = require('assert');

const bench = common.createBenchmark(main, {
stage: ['all', 'instantiate', 'evaluate'],
n: [1000],
}, {
flags: ['--experimental-vm-modules'],
});

function main({ stage, n }) {
const arr = [new vm.SourceTextModule(`
export const value = 42;
`)];

if (stage === 'all') {
bench.start();
}

for (let i = 0; i < n; i++) {
const m = new vm.SourceTextModule(`
export { value } from 'mod${i}';
`);
arr.push(m);
m.linkRequests([arr[i]]);
}

if (stage === 'instantiate') {
bench.start();
}
arr[n].instantiate();
if (stage === 'instantiate') {
bench.end(n);
}

if (stage === 'evaluate') {
bench.start();
}
arr[n].evaluate();
if (stage === 'evaluate' || stage === 'all') {
bench.end(n);
}

assert.strictEqual(arr[n].namespace.value, 42);
}
68 changes: 68 additions & 0 deletions benchmark/vm/source-text-module-flat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
'use strict';

const vm = require('vm');
const common = require('../common.js');
const assert = require('assert');

const bench = common.createBenchmark(main, {
stage: ['all', 'link', 'instantiate', 'evaluate'],
n: [1000],
}, {
flags: ['--experimental-vm-modules'],
});

function main({ stage, n }) {
const arr = [];
let importSource = '';
let useSource = 'export const result = 0 ';
for (let i = 0; i < n; i++) {
importSource += `import { value${i} } from 'mod${i}';\n`;
useSource += ` + value${i}\n`;
}

if (stage === 'all') {
bench.start();
}
for (let i = 0; i < n; i++) {
const m = new vm.SourceTextModule(`
export const value${i} = 1;
`);
arr.push(m);
}

const root = new vm.SourceTextModule(`
${importSource}
${useSource};
`);

if (stage === 'link') {
bench.start();
}

root.linkRequests(arr);
for (let i = 0; i < n; i++) {
arr[i].linkRequests([]);
}

if (stage === 'link') {
bench.end(n);
}

if (stage === 'instantiate') {
bench.start();
}
root.instantiate();
if (stage === 'instantiate') {
bench.end(n);
}

if (stage === 'evaluate') {
bench.start();
}
root.evaluate();
if (stage === 'evaluate' || stage === 'all') {
bench.end(n);
}

assert.strictEqual(root.namespace.result, n);
}