• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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