Szybsza kompresja WebSocket

· Funkcje

Kompresja WebSocket jest niezbędna do redukcji przepustowości i poprawy responsywności, zwłaszcza przy przesyłaniu powtarzalnych danych, takich jak payload JSON. Rozszerzenie permessage-deflate kompresuje każdą ramkę WebSocket w locie — ale szybkość tej kompresji bezpośrednio wpływa na przepustowość aplikacji.

Począwszy od sgcWebSockets 2026.4.0 implementacja permessage-deflate została całkowicie przepisana dla znacznie szybszego działania. W naszych testach małe wiadomości są kompresowane i dekompresowane nawet 15 razy szybciej, z mierzalnymi zyskami dla wszystkich rozmiarów payload.

Co się zmieniło?

Poprzednia implementacja inicjalizowała i niszczyła silnik kompresji przy każdej ramce WebSocket. Oznaczało to, że nawet mała wiadomość 1 KB ponosiła pełny koszt konfigurowania kompresora, kompresowania danych i demontowania wszystkiego — tylko po to, by powtórzyć cały proces dla następnej wiadomości.

Nowa implementacja utrzymuje silnik kompresji aktywny między ramkami. Jest inicjalizowany raz przy nadejściu pierwszej ramki i ponownie używany przez cały czas trwania połączenia. Eliminuje to narzut konfiguracji per-ramka i pozwala silnikowi uczyć się z poprzednich wiadomości, co skutkuje szybszą kompresją powtarzalnych wzorców danych.

Poza trwałym kontekstem kompresji nowa implementacja zawiera kilka innych optymalizacji:

Wyniki testów wydajnościowych

Przeprowadziliśmy 10 000 cykli kompresja + dekompresja dla każdego rozmiaru wiadomości. Każdy cykl kompresuje payload JSON, a następnie dekompresuje go z powrotem, weryfikując, czy wynik odpowiada oryginałowi. Test przeprowadzono na maszynie Windows 64-bit skompilowanej z Delphi 12 Athens.

Domyślna konfiguracja (trwały kontekst)

To jest tryb domyślny, w którym kontekst kompresji jest utrzymywany między ramkami — najczęstszy scenariusz w praktyce:

Rozmiar wiadomości Poprzedni (ms) Nowy (ms) Przyspieszenie
1 KB 437 ms 28 ms 15.6x faster
4 KB 480 ms 88 ms 5.5x faster
16 KB 546 ms 431 ms 1.3x faster
64 KB 1,994 ms 1,725 ms 1.2x faster

Z NoContextTakeOver (niezależne ramki)

Gdy NoContextTakeOver jest włączony, każda ramka jest kompresowana niezależnie. Nawet w tym trybie optymalizacje wielokrotnego użycia buforów i bezpośredniego dostępu do pamięci zapewniają solidną poprawę:

Rozmiar wiadomości Poprzedni (ms) Nowy (ms) Przyspieszenie
1 KB 149 ms 75 ms 2.0x faster
4 KB 173 ms 100 ms 1.7x faster
16 KB 302 ms 228 ms 1.3x faster
64 KB 1,216 ms 1,094 ms 1.1x faster

Kto zyska najwięcej?

Poprawa jest najbardziej dramatyczna dla aplikacji wymieniających wiele małych wiadomości — co jest dokładnie typowym scenariuszem użycia WebSocket:

Czat i wiadomości
Krótkie wiadomości tekstowe (zazwyczaj poniżej 4 KB) zyskują najbardziej: kompresja 5–15 razy szybsza.
Kanały danych w czasie rzeczywistym
Aktualizacje JSON dla pulpitów, tickerów giełdowych i czujników IoT korzystają zarówno ze szybkości, jak i z uczenia się powtarzalnych wzorców przez trwały kontekst.
Gry i multiplayer
Częste małe aktualizacje stanu korzystają z niskiego narzutu per-ramka.
Serwery o wysokiej współbieżności
Mniej czasu CPU na ramkę oznacza, że serwer może obsłużyć więcej jednoczesnych połączeń.

Pełna kompatybilność

Optymalizacja jest w pełni przezroczysta — nie są wymagane żadne zmiany kodu w aplikacji. Dane kompresowane w sieci są identyczne z poprzednią wersją, więc zaktualizowane serwery współpracują bezproblemowo z istniejącymi klientami i odwrotnie.

Nowa implementacja obsługuje wszystkie platformy i kompilatory:

Aktualizacja do 2026.4.0

Optymalizacja permessage-deflate jest dostępna w sgcWebSockets 2026.4.0. Wystarczy zaktualizować do najnowszej wersji, a połączenia WebSocket automatycznie skorzystają z szybszej kompresji. Pobierz na esegece.com.

Szczególne podziękowania dla Michaela za wkład w początkową zoptymalizowaną implementację, która zainspirowała tę pracę. Jego badania nad trwałymi kontekstami zlib i bezpośrednim dostępem do pamięci stworzyły fundament tych ulepszeń wydajności.