• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2const common = require('../common.js');
3const { spawn } = require('child_process');
4const path = require('path');
5
6let Worker;  // Lazy loaded in main
7
8const bench = common.createBenchmark(main, {
9  dur: [1],
10  script: ['benchmark/fixtures/require-cachable', 'test/fixtures/semicolon'],
11  mode: ['process', 'worker']
12}, {
13  flags: ['--expose-internals']
14});
15
16function spawnProcess(script) {
17  const cmd = process.execPath || process.argv[0];
18  const argv = ['--expose-internals', script];
19  return spawn(cmd, argv);
20}
21
22function spawnWorker(script) {
23  return new Worker(script, { stderr: true, stdout: true });
24}
25
26function start(state, script, bench, getNode) {
27  const node = getNode(script);
28  let stdout = '';
29  let stderr = '';
30
31  node.stdout.on('data', (data) => {
32    stdout += data;
33  });
34
35  node.stderr.on('data', (data) => {
36    stderr += data;
37  });
38
39  node.on('exit', (code) => {
40    if (code !== 0) {
41      console.error('------ stdout ------');
42      console.error(stdout);
43      console.error('------ stderr ------');
44      console.error(stderr);
45      throw new Error(`Error during node startup, exit code ${code}`);
46    }
47    state.throughput++;
48
49    if (state.go) {
50      start(state, script, bench, getNode);
51    } else {
52      bench.end(state.throughput);
53    }
54  });
55}
56
57function main({ dur, script, mode }) {
58  const state = {
59    go: true,
60    throughput: 0
61  };
62
63  setTimeout(() => {
64    state.go = false;
65  }, dur * 1000);
66
67  script = path.resolve(__dirname, '../../', `${script}.js`);
68  if (mode === 'worker') {
69    Worker = require('worker_threads').Worker;
70    bench.start();
71    start(state, script, bench, spawnWorker);
72  } else {
73    bench.start();
74    start(state, script, bench, spawnProcess);
75  }
76}
77