summaryrefslogtreecommitdiff
path: root/benchmark/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/cluster')
-rw-r--r--benchmark/cluster/echo.js70
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);
+ });
+}