diff --git a/benchmark/module/module-require.js b/benchmark/module/module-require.js new file mode 100644 index 00000000000000..d5b72c4b03f2a9 --- /dev/null +++ b/benchmark/module/module-require.js @@ -0,0 +1,80 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const common = require('../common.js'); +const tmpdir = require('../../test/common/tmpdir'); +const benchmarkDirectory = path.join(tmpdir.path, 'nodejs-benchmark-module'); + +const bench = common.createBenchmark(main, { + type: ['.js', '.json', 'dir'], + n: [1e4], +}); + +function main({ type, n }) { + tmpdir.refresh(); + createEntryPoint(n); + + switch (type) { + case '.js': + measureJSFile(n); + break; + case '.json': + measureJSONFile(n); + break; + case 'dir': + measureDir(n); + } + + tmpdir.refresh(); +} + +function measureJSFile(n) { + bench.start(); + for (let i = 0; i < n; i++) { + require(`${benchmarkDirectory}/${i}`); + } + bench.end(n); +} + +function measureJSONFile(n) { + bench.start(); + for (let i = 0; i < n; i++) { + require(`${benchmarkDirectory}/json_${i}.json`); + } + bench.end(n); +} + +function measureDir(n) { + bench.start(); + for (let i = 0; i < n; i++) { + require(`${benchmarkDirectory}${i}`); + } + bench.end(n); +} + +function createEntryPoint(n) { + fs.mkdirSync(benchmarkDirectory); + + const JSFileContent = 'module.exports = [];'; + const JSONFileContent = '[]'; + + for (let i = 0; i < n; i++) { + // JS file. + fs.writeFileSync(`${benchmarkDirectory}/${i}.js`, JSFileContent); + + // JSON file. + fs.writeFileSync(`${benchmarkDirectory}/json_${i}.json`, JSONFileContent); + + // Dir. + fs.mkdirSync(`${benchmarkDirectory}${i}`); + fs.writeFileSync( + `${benchmarkDirectory}${i}/package.json`, + '{"main": "index.js"}' + ); + fs.writeFileSync( + `${benchmarkDirectory}${i}/index.js`, + JSFileContent + ); + } +} diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 4d1eda158467f1..41955a75eff00a 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -149,7 +149,7 @@ function stat(filename) { if (result !== undefined) return result; } const result = internalModuleStat(filename); - if (statCache !== null && result === 0) { + if (statCache !== null && result >= 0) { // Only set cache when `internalModuleStat(filename)` succeeds. statCache.set(filename, result); }