Je odesílání zpráv přes WebSockets v Chrome pomalé?

Není to tak dávno, co jsem narazil na podivný problém s Chrome. Moje testy Jasmine selhaly, protože časový limit asynchronních akcí byl pro Chrome příliš krátký, i když pro Firefox fungovaly naprosto v pořádku. To vedlo k tomu, že jsem napsal několik testů, abych zjistil, zda je implementace WebSocket prohlížeče Chrome pomalá, což přineslo docela zajímavé výsledky. Také jsem od svých čtenářů slyšel několik zajímavých výsledků, a tak jsem se rozhodl prozkoumat více.

Nové vydání

Tentokrát se podíváme na čas potřebný k odesílání a přijímání zpráv. Někteří lidé mi řekli, že dosahují pomalé rychlosti zasílání zpráv, a tak jsem se rozhodl přidat do projektu další malý test, který jsem již provedl pro testování připojení Socket.IO. Projekt je na GitHubu, pokud jej chcete spustit na svých vlastních počítačích.

Pojďme se podívat na kód pro test. Pravděpodobně jsem to měl udělat v minulém příspěvku, aby se vlastně bylo co učit, ale dobře.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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();
}

Je to opravdu velmi jednoduché. Když se připojíme, pošleme na server zprávu (pojmenovanou lichým číslem) s různými daty. Totéž děláme vždy, když ze serveru obdržíme jakoukoli zprávu (se sudým číslem jména):prostě pošleme další zprávu zpět (s lichým číslem). Uděláme to 8krát a poté se odpojíme. Server je nastaven úplně stejně. Když obdrží zprávu (s lichým číslem), odešle zprávu zpět (se sudým číslem).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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'});
});
});

Super jednoduché, že? Provedl jsem tyto testy a nemohl jsem najít prohlížeč, který by neprošel všemi těmito zprávami v průměru za více než 10 ms. Zdá se to OPRAVDU rychlé a také to tak je, ale je to na místním počítači, takže to není tak, že by zprávy měly daleko.

Každopádně výsledky se mi zdály docela průkazné:odesílání zpráv není nijak bráněno. Pak jsem měl pomalost připojení pouze v jednom prohlížeči na jednom počítači, zatímco všechny ostatní prohlížeče na všech ostatních počítačích běžely v pořádku. Takže tam může být někdo, kdo provede tento test a uvidí velmi odlišné výsledky.

Nový testovací formát a vedlejší poznámka k Firebugu

Abychom všichni věděli, testy fungují trochu jinak než dříve. Dříve testy probíhaly automaticky a byly výstupem do konzole, ale to jsem z několika důvodů změnil.

  1. Přidal jsem další test, takže jsem chtěl, aby si uživatel mohl vybrat test a spustit jen ten.
  2. Pokud konzola nebyla při prvním spuštění testu otevřena, možná budete muset po otevření konzole provést aktualizaci, aby se výsledky zobrazily.
  3. Konzole jsou pomalé (zejména Firebug). Při spuštění testu připojení ve Firefoxu s různými otevřenými konzolami jsem získal tyto průměrné výsledky pro rychlost připojení WebSocket:
Bez konzoly 15–35 ms
S vestavěnou konzolí 30–85 ms
S Firebug Console 450–800 ms

Miluju Firebug, ale tohle mě štve (žádná slovní hříčka). Výkon Firebugu byl v posledních několika měsících hrozný. Jsem rád, že (zejména ve verzi Nightly Firefox) se vestavěná konzola a nástroje pro vývojáře webu v poslední době výrazně zlepšily. To mi umožňuje nepotřebovat otevírat pomalý monolit, kterým se Firebug stal pro většinu rychlých věcí, které musím udělat.

Každopádně jsem z těchto důvodů přesunul testovací výstup do textarea a testy se spustí, když kliknete na tlačítko. Nic moc, ale myslel jsem, že to stojí za zmínku.

Závěr

Nezdá se mi, že by došlo k problémům s aspektem odesílání zpráv z WebSockets ke mně, ale není důvod se domnívat, že to nezpůsobuje problémy na počítačích někoho jiného, ​​zvláště vezmeme-li v úvahu, že to ovlivnilo pouze Chrome na jednom z mých počítačů. . Dejte mi vědět své výsledky v komentářích níže. Možná zkuste nastavit server na samostatném počítači, abychom mohli přidat nějakou prodlevu, abychom zjistili, zda to má nějaký rozdíl. Bůh žehnej a šťastné kódování.