testuje sobie dzisiaj wydajność interfejsów websocket dostępnych w róznych językach programowania i trafiłem na problem z socket.io. Napisałem sobie prosty skrypcik, który ma mi zmierzyć czas przesyłania 10 tys. żądań ws. Niestety używając tego skryptu dostaję mierne wyniki rzędu ~1.500 req/s. Przy analogicznym teście z użyciem ratchet w PHP dostaję wyniki ~27.5 tys., czyli prawie 20 razy więcej. Dodatkowo test samego protokołu HTTP w js daje mi wynik prawie 4 tys. żądań. Całość wygląda jakby każde żądanie socket.io nawiązywało nowe połączenie zamiast używać starego, ale zdarzenie connect leci tylko raz, więc to nie powinno być przyczyną. Może mi ktoś powiedzieć co jest w tym teście źle?
Server:
Kod
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res) {
res.sendfile(__dirname + '/index.html');
});
io.on('connection', function(socket) {
socket.emit('connection');
socket.on('req', function() {
socket.emit('ans', 'hello');
});
});
http.listen(3000, function() {
console.log('listening on *:3000');
});
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res) {
res.sendfile(__dirname + '/index.html');
});
io.on('connection', function(socket) {
socket.emit('connection');
socket.on('req', function() {
socket.emit('ans', 'hello');
});
});
http.listen(3000, function() {
console.log('listening on *:3000');
});
Client
Kod
var socket = io();
var cnt = 0;
var startTime = 0;
var endTime = 0;
socket.on('ans', function(message) {
if (++cnt === 10000) {
endTime = performance.now();
console.log(endTime-startTime);
}
});
socket.on('connection', function() {
startTime = performance.now();
for (var i=0; i<10000; i++) {
socket.emit('req', 'hello');
}
});
var cnt = 0;
var startTime = 0;
var endTime = 0;
socket.on('ans', function(message) {
if (++cnt === 10000) {
endTime = performance.now();
console.log(endTime-startTime);
}
});
socket.on('connection', function() {
startTime = performance.now();
for (var i=0; i<10000; i++) {
socket.emit('req', 'hello');
}
});