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