1'use strict'; 2 3const common = require('../common.js'); 4const { Worker } = require('worker_threads'); 5const path = require('path'); 6const bench = common.createBenchmark(main, { 7 workers: [1], 8 payload: ['string', 'object'], 9 sendsPerBroadcast: [1, 10], 10 n: [1e5] 11}); 12 13const workerPath = path.resolve(__dirname, '..', 'fixtures', 'echo.worker.js'); 14 15function main({ n, workers, sendsPerBroadcast: sends, payload: payloadType }) { 16 const expectedPerBroadcast = sends * workers; 17 let payload; 18 let readies = 0; 19 let broadcasts = 0; 20 let msgCount = 0; 21 22 switch (payloadType) { 23 case 'string': 24 payload = 'hello world!'; 25 break; 26 case 'object': 27 payload = { action: 'pewpewpew', powerLevel: 9001 }; 28 break; 29 default: 30 throw new Error('Unsupported payload type'); 31 } 32 33 const workerObjs = []; 34 35 for (let i = 0; i < workers; ++i) { 36 const worker = new Worker(workerPath); 37 workerObjs.push(worker); 38 worker.on('online', onOnline); 39 worker.on('message', onMessage); 40 } 41 42 function onOnline() { 43 if (++readies === workers) { 44 bench.start(); 45 broadcast(); 46 } 47 } 48 49 function broadcast() { 50 if (broadcasts++ === n) { 51 bench.end(n); 52 for (const worker of workerObjs) { 53 worker.unref(); 54 } 55 return; 56 } 57 for (const worker of workerObjs) { 58 for (let i = 0; i < sends; ++i) 59 worker.postMessage(payload); 60 } 61 } 62 63 function onMessage() { 64 if (++msgCount === expectedPerBroadcast) { 65 msgCount = 0; 66 broadcast(); 67 } 68 } 69} 70