-
Notifications
You must be signed in to change notification settings - Fork 30k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dgram: support dgram.send with multiple buffers
Added ability to dgram.send to send multiple buffers, _writev style. The offset and length parameters in dgram.send are now optional. Refactored the dgram benchmarks, and seperated them from net. Added docs for the new signature. Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com> Fixes: #4302 PR-URL: #4374
- Loading branch information
Showing
12 changed files
with
455 additions
and
117 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// test UDP send throughput with the multi buffer API against Buffer.concat | ||
'use strict'; | ||
|
||
const common = require('../common.js'); | ||
const 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: [64, 256, 512, 1024], | ||
num: [100], | ||
chunks: [1, 2, 4, 8], | ||
type: ['concat', 'multi'], | ||
dur: [5] | ||
}); | ||
|
||
var dur; | ||
var len; | ||
var num; | ||
var type; | ||
var chunk; | ||
var chunks; | ||
var encoding; | ||
|
||
function main(conf) { | ||
dur = +conf.dur; | ||
len = +conf.len; | ||
num = +conf.num; | ||
type = conf.type; | ||
chunks = +conf.chunks; | ||
|
||
chunk = [] | ||
for (var i = 0; i < chunks; i++) { | ||
chunk.push(new Buffer(Math.round(len / chunks))); | ||
} | ||
|
||
server(); | ||
} | ||
|
||
var dgram = require('dgram'); | ||
|
||
function server() { | ||
var sent = 0; | ||
var received = 0; | ||
var socket = dgram.createSocket('udp4'); | ||
|
||
var onsend = type === 'concat' ? onsendConcat : onsendMulti; | ||
|
||
function onsendConcat() { | ||
if (sent++ % num == 0) | ||
for (var i = 0; i < num; i++) { | ||
socket.send(Buffer.concat(chunk), PORT, '127.0.0.1', onsend); | ||
} | ||
} | ||
|
||
function onsendMulti() { | ||
if (sent++ % num == 0) | ||
for (var i = 0; i < num; i++) { | ||
socket.send(chunk, PORT, '127.0.0.1', onsend); | ||
} | ||
} | ||
|
||
socket.on('listening', function() { | ||
bench.start(); | ||
onsend(); | ||
|
||
setTimeout(function() { | ||
var bytes = sent * len; | ||
var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
bench.end(gbits); | ||
}, dur * 1000); | ||
}); | ||
|
||
socket.on('message', function(buf, rinfo) { | ||
received++; | ||
}); | ||
|
||
socket.bind(PORT); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
// test UDP send/recv throughput with the multi buffer API | ||
'use strict'; | ||
|
||
const common = require('../common.js'); | ||
const 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: [64, 256, 1024], | ||
num: [100], | ||
chunks: [1, 2, 4, 8], | ||
type: ['send', 'recv'], | ||
dur: [5] | ||
}); | ||
|
||
var dur; | ||
var len; | ||
var num; | ||
var type; | ||
var chunk; | ||
var chunks; | ||
var encoding; | ||
|
||
function main(conf) { | ||
dur = +conf.dur; | ||
len = +conf.len; | ||
num = +conf.num; | ||
type = conf.type; | ||
chunks = +conf.chunks; | ||
|
||
chunk = [] | ||
for (var i = 0; i < chunks; i++) { | ||
chunk.push(new Buffer(Math.round(len / chunks))); | ||
} | ||
|
||
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, PORT, '127.0.0.1', onsend); | ||
} | ||
|
||
socket.on('listening', function() { | ||
bench.start(); | ||
onsend(); | ||
|
||
setTimeout(function() { | ||
var bytes = (type === 'send' ? sent : received) * len; | ||
var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
bench.end(gbits); | ||
}, dur * 1000); | ||
}); | ||
|
||
socket.on('message', function(buf, rinfo) { | ||
received++; | ||
}); | ||
|
||
socket.bind(PORT); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// test UDP send/recv throughput with the new single Buffer API | ||
'use strict'; | ||
|
||
const common = require('../common.js'); | ||
const 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, 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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.