Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wydajność socket.io
Skie
post
Post #1





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


Hej,
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');
});


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');
    }    
});


Ten post edytował Skie 21.04.2016, 19:33:20
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Cytat
Node.js akurat jest stanowy, więc wydaje mi się, że pisałeś to na szybko i coś Ci się pomieszało.

Taa akurat wychodziłem i pisałem to na szybko, nie przeczytałem tego nawet drugi raz..

Problem z testowaniem tego jest taki, że nigdy nie będziesz od jednego połączenia wysyłać 10k pustych emitów, jak i to że socket.io domyślnie startuje z xhr-pollingu, i już na tym połączeniu zdarzenie `connect` jest wyzwalane. Jeżeli próbujesz wszystko wysłać w jedną sekundę, to wszystko zwyczajnie pójdzie jednym xhr'owym requestem. Musiałbyś w ustawieniach podać tylko `websocket` jako protokół:

Kod
var socket = io('http://localhost', { transports: ['websocket'] });
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 15:43