Socket.io
nodejs

Socket.IOの通信速度を測ってみる。

More than 1 year has passed since last update.

結果

このやり方だとローカルで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までお願い致します。