Front End

10 jul, 2013

Enviar mensagens pelo WebSocket no Chrome é lento?

Publicidade

Não faz muito tempo que passei por uma situação estranha com o Chrome. Meus testes com o Jasmine falharam porque o timeout em ações assíncronas era muito curto para o Chrome, mesmo que eles funcionassem perfeitamente no Firefox. Isso me levou a escrever alguns testes para ver se a implementação do WebSocket no Chrome estava lenta, o que levou a resultados bem interessantes. Eu também soube de resultados interessantes dos meus leitores, então decidi investigar um pouco mais.

A nova questão

Desta vez, estávamos vendo o tempo que levava para enviar e receber mensagens. Algumas pessoas me disseram que estavam tendo baixas velocidades nas mensagens, então decidi adicionar um pequeno teste ao projeto que eu já tinha feito, de forma a testar as conexões do Socket.IO. O projeto está no GitHub, caso você queira testá-lo em seu próprio computador.

Vamos dar uma olhada no código do teste.

Script do Front End

[js]function runMessageTest() {
var start, end;
var socket = io.connect(":8080", {
‘force new connection’: true,
‘auto connect’: false
});

socket.on(‘connect’, function() {
start = new Date();
socket.emit(‘1’, 1);
});

socket.on(‘2’, function() {
socket.emit(‘3’, "1");
});

socket.on(‘4’, function() {
socket.emit(‘5’, {one:1});
});

socket.on(‘6’, function() {
socket.emit(‘7′, {one:1, two:’2’});
});

socket.on(‘8’, function() {
end = new Date();
socket.disconnect();
});

socket.on(‘disconnect’, function() {
var time = end – start;
output.append("Time to finish all messages: "+ time +"ms\n");
});

socket.socket.connect();
}
[/js]

É muito simples. Ao conectar, envia-se a mensagem (nomeada com um número ímpar) para o servidor com algum dado variado. Fazemos o mesmo quando recebemos qualquer mensagem (nomeadas com números pares) do servidor: simplesmente envie outra mensagem de volta (com um número ímpar). Fazemos isso 8 vezes, e então desconectamos. O servidor está configurado exatamente da mesma forma. Quando ele recebe uma mensagem (com números ímpares), ele envia uma mensagem de volta (com números pares).

Script do Back End
[code]var io = require(‘socket.io’).listen(8080);

    io.sockets.on(‘connection’, function(socket) {

     socket.on(‘1’, function(){
      socket.emit(‘2’, 1);
     });

     socket.on(‘3’, function(){
      socket.emit(‘4’, ‘1’);
     });

     socket.on(‘5’, function() {
      socket.emit(‘6’, {one:1});
     });

     socket.on(‘7’, function() {
      socket.emit(‘8′, {one:1, two:’2’});
     });
    });[/code]
Super simples, certo? Bem, eu executei esses testes e não pude encontrar um navegador que não tenha passado por todas as mensagem em mais de 10ms em média. Isso parece MUITO rápido, e é, mas trata-se de uma conexão local, então as mensagens não tinham que ir muito longe.

De qualquer maneira, os resultados parecem ser bem conclusivos para mim: o envio de mensagens não é atrapalhado de forma alguma. Então, novamente, eu apenas tive lentidão em um único navegador em um único computador, enquanto que outros navegadores executaram muito bem em todos os computadores. Portanto, pode haver alguém que irá executar esse teste e terá resultados muito diferentes.

Novo formato de teste e nota sobre o Firebug

Apenas para que todos saibam, os testes funcionaram um pouco diferente em relação à última vez, quando eles executavam automaticamente e a saída se dava no console, mas mudei isso por diversas razões.

  1. Acrescentei outro teste, pois queria que o usuário pudesse escolher o teste e executar apenas um.
  2. Se o console não estivesse aberto quando o teste executasse pela primeira vez, talvez fosse preciso atualizar depois da abertura do console de forma a poder visualizar os resultados.
  3. Consoles são lentos (especialmente no Firebug). Ao executar o teste de conexão no Firefox com diferentes consoles abertos, tive esta média de resultados para a velocidade de conexão WebSocket:

Sem console: 15-35ms

Com console embutido: 30-85ms

Com o console do Firebug: 450-800ms

Eu amo o Firebug, mas ele tem estado “bugado” (sem trocadilho aqui). O desempenho do Firebug tem sido péssimo nos últimos meses. Estou feliz que (especialmente na versão Nightly do Firefox) o console embutido e as ferramentas de desenvolvedor tenham ficado muito melhores nos últimos tempos. Isso permite que eu não tenha que abrir o monolito vagaroso que se tornou o Firebug para realizar a maior parte das tarefas corriqueiras que eu preciso fazer.

De qualquer maneira, devido a essas razões, movi a saída dos testes para uma textarea e os testes são executados quando você clica em um botão. Não é uma grande mudança, mas achei que merecesse menção.

Conclusão

Não me parece que haja problemas com o envio de mensagens no WebSockets, mas há razões para acreditar que isso não esteja causando problemas no computador de algumas pessoas, especialmente ao se considerar de que o teste impactou o Chrome em apenas um dos meus computadores. Tente configurar o servidor em uma máquina separada para termos um tempo de lag e ver se isso faz diferença.

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://www.joezimjs.com/javascript/is-sending-messages-through-websockets-slow-on-chrome/