1'use strict';
2
3const fs = require('fs');
4const path = require('path');
5const common = require('../common.js');
6const tmpdir = require('../../test/common/tmpdir');
7const benchmarkDirectory = path.join(tmpdir.path, 'nodejs-benchmark-module');
8
9const bench = common.createBenchmark(main, {
10  type: ['.js', '.json', 'dir'],
11  n: [1e4],
12});
13
14function main({ type, n }) {
15  tmpdir.refresh();
16  createEntryPoint(n);
17
18  switch (type) {
19    case '.js':
20      measureJSFile(n);
21      break;
22    case '.json':
23      measureJSONFile(n);
24      break;
25    case 'dir':
26      measureDir(n);
27  }
28
29  tmpdir.refresh();
30}
31
32function measureJSFile(n) {
33  bench.start();
34  for (let i = 0; i < n; i++) {
35    require(`${benchmarkDirectory}/${i}`);
36  }
37  bench.end(n);
38}
39
40function measureJSONFile(n) {
41  bench.start();
42  for (let i = 0; i < n; i++) {
43    require(`${benchmarkDirectory}/json_${i}.json`);
44  }
45  bench.end(n);
46}
47
48function measureDir(n) {
49  bench.start();
50  for (let i = 0; i < n; i++) {
51    require(`${benchmarkDirectory}${i}`);
52  }
53  bench.end(n);
54}
55
56function createEntryPoint(n) {
57  fs.mkdirSync(benchmarkDirectory);
58
59  const JSFileContent = 'module.exports = [];';
60  const JSONFileContent = '[]';
61
62  for (let i = 0; i < n; i++) {
63    // JS file.
64    fs.writeFileSync(`${benchmarkDirectory}/${i}.js`, JSFileContent);
65
66    // JSON file.
67    fs.writeFileSync(`${benchmarkDirectory}/json_${i}.json`, JSONFileContent);
68
69    // Dir.
70    fs.mkdirSync(`${benchmarkDirectory}${i}`);
71    fs.writeFileSync(
72      `${benchmarkDirectory}${i}/package.json`,
73      '{"main": "index.js"}',
74    );
75    fs.writeFileSync(
76      `${benchmarkDirectory}${i}/index.js`,
77      JSFileContent,
78    );
79  }
80}
81