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:
- Wstępnie alokowane bufory pamięci — Bufory są alokowane raz i ponownie używane, unikając wielokrotnych alokacji pamięci przy każdej ramce.
- Bezpośredni dostęp do pamięci — Gdy dane wejściowe są już w pamięci, silnik odczytuje je bezpośrednio bez kopiowania do buforów pośrednich.
- Wielokrotnie używane strumienie tymczasowe — Wewnętrzne strumienie robocze są tworzone raz w konstruktorze zamiast być tworzone i niszczone przy każdym wywołaniu kompresji/dekompresji.
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:
- Delphi 7 do Delphi 13 (włącznie z C++Builder)
- Windows, macOS, Linux, Android, iOS
- Cele 32-bitowe i 64-bitowe
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.
