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