• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2const common = require('../common.js');
3const { spawnSync } = require('child_process');
4const path = require('path');
5
6let Worker;  // Lazy loaded in main
7
8const bench = common.createBenchmark(main, {
9  script: [
10    'benchmark/fixtures/require-builtins',
11    'test/fixtures/semicolon',
12  ],
13  mode: ['process', 'worker'],
14  count: [30],
15});
16
17function spawnProcess(script, bench, state) {
18  const cmd = process.execPath || process.argv[0];
19  while (state.finished < state.count) {
20    const child = spawnSync(cmd, [script]);
21    if (child.status !== 0) {
22      console.log('---- STDOUT ----');
23      console.log(child.stdout.toString());
24      console.log('---- STDERR ----');
25      console.log(child.stderr.toString());
26      throw new Error(`Child process stopped with exit code ${child.status}`);
27    }
28    state.finished++;
29    if (state.finished === 0) {
30      // Finished warmup.
31      bench.start();
32    }
33
34    if (state.finished === state.count) {
35      bench.end(state.count);
36    }
37  }
38}
39
40function spawnWorker(script, bench, state) {
41  const child = new Worker(script);
42  child.on('exit', (code) => {
43    if (code !== 0) {
44      throw new Error(`Worker stopped with exit code ${code}`);
45    }
46    state.finished++;
47    if (state.finished === 0) {
48      // Finished warmup.
49      bench.start();
50    }
51    if (state.finished < state.count) {
52      spawnWorker(script, bench, state);
53    } else {
54      bench.end(state.count);
55    }
56  });
57}
58
59function main({ count, script, mode }) {
60  script = path.resolve(__dirname, '../../', `${script}.js`);
61  const warmup = 3;
62  const state = { count, finished: -warmup };
63  if (mode === 'worker') {
64    Worker = require('worker_threads').Worker;
65    spawnWorker(script, bench, state);
66  } else {
67    spawnProcess(script, bench, state);
68  }
69}
70