WebSocket-Komprimierung ist entscheidend, um Bandbreite zu sparen und die Reaktionsfähigkeit zu verbessern – besonders bei wiederkehrenden Daten wie JSON-Payloads. Die Erweiterung permessage-deflate komprimiert jeden WebSocket-Frame on the fly — und die Geschwindigkeit dieser Komprimierung wirkt sich direkt auf den Durchsatz deiner Anwendung aus.
Ab sgcWebSockets 2026.4.0 wurde die permessage-deflate-Implementierung komplett neu geschrieben, um deutlich schneller zu sein. In unseren Benchmarks komprimieren und dekomprimieren kleine Nachrichten bis zu 15-mal schneller, mit messbaren Gewinnen bei allen Payload-Größen.
Was hat sich geändert?
Die bisherige Implementierung initialisierte und zerstörte die Kompressions-Engine bei jedem einzelnen WebSocket-Frame. Das hieß: Selbst eine winzige 1-KB-Nachricht zahlte die vollen Kosten dafür, den Komprimierer aufzusetzen, die Daten zu komprimieren und alles wieder abzubauen — nur, um den gesamten Vorgang für die nächste Nachricht zu wiederholen.
Die neue Implementierung hält die Kompressions-Engine über mehrere Frames hinweg am Leben. Sie wird einmal initialisiert, wenn der erste Frame eintrifft, und für die gesamte Lebensdauer der Verbindung wiederverwendet. Das eliminiert den Pro-Frame-Setup-Overhead und erlaubt der Engine zudem, aus vorherigen Nachrichten zu lernen – wiederkehrende Datenmuster werden so schneller komprimiert.
Zusätzlich zum persistenten Kompressionskontext enthält die neue Implementierung mehrere weitere Optimierungen:
- Vorab allokierte Speicherpuffer — Puffer werden einmal allokiert und wiederverwendet, sodass wiederholte Speicherallokation pro Frame entfällt.
- Direkter Speicherzugriff — Wenn die Eingabe bereits im Speicher liegt, liest die Engine sie direkt, ohne sie zunächst in Zwischenpuffer zu kopieren.
- Wiederverwendete Hilfsstreams — Interne Arbeitsstreams werden einmal im Konstruktor angelegt, anstatt bei jedem Compress-/Decompress-Aufruf erzeugt und zerstört zu werden.
Benchmark-Ergebnisse
Wir haben für jede Nachrichtengröße 10.000 Compress-+-Decompress-Round-trips gefahren. Jeder Round-trip komprimiert ein JSON-Payload und dekomprimiert es wieder, wobei verifiziert wird, dass die Ausgabe dem Original entspricht. Der Test lief auf einer Windows-64-Bit-Maschine, kompiliert mit Delphi 12 Athens.
Standardkonfiguration (persistenter Kontext)
Das ist der Standardmodus, in dem der Kompressionskontext über mehrere Frames hinweg erhalten bleibt — das in der Praxis häufigste Szenario:
| Nachrichtengröße | Vorher (ms) | Neu (ms) | Beschleunigung |
|---|---|---|---|
| 1 KB | 437 ms | 28 ms | 15,6-mal schneller |
| 4 KB | 480 ms | 88 ms | 5,5-mal schneller |
| 16 KB | 546 ms | 431 ms | 1,3-mal schneller |
| 64 KB | 1.994 ms | 1.725 ms | 1,2-mal schneller |
Mit NoContextTakeOver (unabhängige Frames)
Wenn NoContextTakeOver aktiviert ist, wird jeder Frame unabhängig komprimiert. Auch in diesem Modus bringen die Pufferwiederverwendung und der direkte Speicherzugriff eine solide Verbesserung:
| Nachrichtengröße | Vorher (ms) | Neu (ms) | Beschleunigung |
|---|---|---|---|
| 1 KB | 149 ms | 75 ms | 2,0-mal schneller |
| 4 KB | 173 ms | 100 ms | 1,7-mal schneller |
| 16 KB | 302 ms | 228 ms | 1,3-mal schneller |
| 64 KB | 1.216 ms | 1.094 ms | 1,1-mal schneller |
Wer profitiert am meisten?
Die Verbesserung ist am dramatischsten bei Anwendungen, die viele kleine Nachrichten austauschen — also genau dem typischen WebSocket-Anwendungsfall:
|
Chat & Messaging Kurze Textnachrichten (typisch unter 4 KB) verzeichnen die größten Zuwächse: 5- bis 15-mal schnellere Komprimierung. |
Echtzeit-Datenfeeds JSON-Updates für Dashboards, Aktienticker und IoT-Sensoren profitieren sowohl von der Geschwindigkeit als auch vom persistenten Kontext, der wiederkehrende Muster lernt. |
|
Gaming & Multiplayer Häufige kleine Status-Updates profitieren vom niedrigen Pro-Frame-Overhead. |
Server mit hoher Parallelität Weniger CPU-Zeit pro Frame bedeutet, dass der Server mehr gleichzeitige Verbindungen bedienen kann. |
Voll kompatibel
Die Optimierung ist vollständig transparent — in deiner Anwendung sind keine Codeänderungen nötig. Die komprimierten Daten auf der Leitung sind identisch mit der vorherigen Version, sodass aktualisierte Server problemlos mit bestehenden Clients zusammenarbeiten und umgekehrt.
Die neue Implementierung unterstützt alle Plattformen und Compiler:
- Delphi 7 bis Delphi 13 (einschließlich C++Builder)
- Windows, macOS, Linux, Android, iOS
- 32-Bit- und 64-Bit-Ziele
Upgrade auf 2026.4.0
Die permessage-deflate-Optimierung ist in sgcWebSockets 2026.4.0 verfügbar. Aktualisiere einfach auf die neueste Version, und deine WebSocket-Verbindungen profitieren automatisch von schnellerer Komprimierung. Download unter esegece.com.
Besonderer Dank gilt Michael, der die ursprünglich optimierte Implementierung beigesteuert hat, die diese Arbeit inspiriert hat. Seine Untersuchung persistenter zlib-Kontexte und direkten Speicherzugriffs legte das Fundament für diese Performance-Verbesserungen.
