bench: add dgram send/recv benchmark
authorBen Noordhuis <info@bnoordhuis.nl>
Wed, 20 Mar 2013 15:53:23 +0000 (16:53 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Wed, 20 Mar 2013 16:16:30 +0000 (17:16 +0100)
benchmark/net/dgram.js [new file with mode: 0644]

diff --git a/benchmark/net/dgram.js b/benchmark/net/dgram.js
new file mode 100644 (file)
index 0000000..6a0c550
--- /dev/null
@@ -0,0 +1,61 @@
+// test UDP send/recv throughput
+
+var common = require('../common.js');
+var PORT = common.PORT;
+
+// `num` is the number of send requests to queue up each time.
+// Keep it reasonably high (>10) otherwise you're benchmarking the speed of
+// event loop cycles more than anything else.
+var bench = common.createBenchmark(main, {
+  len: [1, 64, 256, 1024],
+  num: [100],
+  type: ['send', 'recv'],
+  dur: [5]
+});
+
+var dur;
+var len;
+var num;
+var type;
+var chunk;
+var encoding;
+
+function main(conf) {
+  dur = +conf.dur;
+  len = +conf.len;
+  num = +conf.num;
+  type = conf.type;
+  chunk = new Buffer(len);
+  server();
+}
+
+var dgram = require('dgram');
+
+function server() {
+  var sent = 0;
+  var received = 0;
+  var socket = dgram.createSocket('udp4');
+
+  function onsend() {
+    if (sent++ % num == 0)
+      for (var i = 0; i < num; i++)
+        socket.send(chunk, 0, chunk.length, PORT, '127.0.0.1', onsend);
+  }
+
+  socket.on('listening', function() {
+    bench.start();
+    onsend();
+
+    setTimeout(function() {
+      var bytes = (type === 'send' ? sent : received) * chunk.length;
+      var gbits = (bytes * 8) / (1024 * 1024 * 1024);
+      bench.end(gbits);
+    }, dur * 1000);
+  });
+
+  socket.on('message', function(buf, rinfo) {
+    received++;
+  });
+
+  socket.bind(PORT);
+}