結果
このやり方だとローカルで130Mbps~140Mbps
追記 環境による差異が大きいようです。
- Windows 10(当記事の検証PC) 135Mbps前後
- Hyper-V上のUbuntu Server 100Mbps前後
- 開発用ノートPC(Arch Linux) 3200Mbps前後
- 友人のMac 1200Mbps前後
同じLinuxでもバラバラだったりするのが非常に謎ですが、何かがオーバーヘッドになってることは確かなようです。
検証
- Windows 10
- そこそこ速いSSD
- Node.js v8.9.1
- 約100MBのmp3ファイル
サーバ側
server.js
var server = require('http').createServer(response);
var io = require('socket.io')(server);
var fs = require('fs');
function response(req, res){
// HTTP
}
function socketio(socket){
socket.on('starttest', function(data){
fs.readFile('sample.mp3', function(err, data){
var start = (new Date()).getTime();
io.emit('mp3data', { 'mp3':data, 'start':start } )
});
});
}
io.on('connection', socketio);
server.listen(3000);
console.log('Server started on 3000');
クライアント側から着信を受けた後、送信時のタイムスタンプとデータをSocketIOで送ります。
クライアント側
client.js
var socket = require('socket.io-client').connect('http://localhost:3000');
var fs = require('fs');
socket.on('connect', function(){
console.log('Connected');
});
socket.on('mp3data', function(data){
var end = (new Date()).getTime();
var sec = (end - data.start) / 1000;
var bps= Math.round(data.mp3.length / sec);
console.log((bps * 8 / 1000 / 1000) + 'Mbps');
});
process.stdin.on('data', function(data){
socket.emit('starttest', {msg: data});
});
コンソールに適当に入力するとサーバ側に発信します。受信が終わったら計算をして出力します。
感想
自分の実装が悪いのかSocket.IOが悪いのかWebsocketの限界なのかわかりませんが、どんな書き方をしてもこれ以上パフォーマンスは上がりませんでした。何かあればご指摘ください。ファイルの送受信は素直にHTTPを使ったほうがいいような気もします。
何かあればコメント欄かTwitter @kznr_lukまでお願い致します。