diff options
Diffstat (limited to 'benchmark/cluster')
-rw-r--r-- | benchmark/cluster/echo.js | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/benchmark/cluster/echo.js b/benchmark/cluster/echo.js new file mode 100644 index 0000000000..0733bdbd20 --- /dev/null +++ b/benchmark/cluster/echo.js @@ -0,0 +1,70 @@ +'use strict'; + +const cluster = require('cluster'); +if (cluster.isMaster) { + const common = require('../common.js'); + const bench = common.createBenchmark(main, { + workers: [1], + payload: ['string', 'object'], + sendsPerBroadcast: [1, 10], + n: [1e5] + }); + + function main(conf) { + var n = +conf.n; + var workers = +conf.workers; + var sends = +conf.sendsPerBroadcast; + var expectedPerBroadcast = sends * workers; + var payload; + var readies = 0; + var broadcasts = 0; + var msgCount = 0; + + switch (conf.payload) { + case 'string': + payload = 'hello world!'; + break; + case 'object': + payload = { action: 'pewpewpew', powerLevel: 9001 }; + break; + default: + throw new Error('Unsupported payload type'); + } + + for (var i = 0; i < workers; ++i) + cluster.fork().on('online', onOnline).on('message', onMessage); + + function onOnline(msg) { + if (++readies === workers) { + bench.start(); + broadcast(); + } + } + + function broadcast() { + var id; + if (broadcasts++ === n) { + bench.end(n); + for (id in cluster.workers) + cluster.workers[id].disconnect(); + return; + } + for (id in cluster.workers) { + const worker = cluster.workers[id]; + for (var i = 0; i < sends; ++i) + worker.send(payload); + } + } + + function onMessage(msg) { + if (++msgCount === expectedPerBroadcast) { + msgCount = 0; + broadcast(); + } + } + } +} else { + process.on('message', function(msg) { + process.send(msg); + }); +} |