Compressione WebSocket più veloce

· Funzionalità

La compressione WebSocket è essenziale per ridurre la banda e migliorare la reattività, specialmente quando trasmetti dati ripetitivi come payload JSON. L'estensione permessage-deflate comprime al volo ogni frame WebSocket, ma la velocità di quella compressione impatta direttamente sul throughput della tua applicazione.

A partire da sgcWebSockets 2026.4.0, l'implementazione di permessage-deflate è stata completamente riscritta per prestazioni significativamente più veloci. Nei nostri benchmark, i messaggi piccoli si comprimono e decomprimono fino a 15 volte più velocemente, con guadagni misurabili su tutte le dimensioni di payload.

Cosa è cambiato?

L'implementazione precedente inizializzava e distruggeva il motore di compressione per ogni singolo frame WebSocket. Questo significava che anche un piccolo messaggio da 1 KB pagava il costo pieno di impostare il compressore, comprimere i dati e poi smantellare tutto, solo per ripetere l'intero processo per il messaggio successivo.

La nuova implementazione mantiene il motore di compressione attivo tra i frame. Viene inizializzato una sola volta quando arriva il primo frame e riutilizzato per la durata della connessione. Questo elimina l'overhead di setup per ogni frame e permette anche al motore di imparare dai messaggi precedenti, risultando in una compressione più veloce di pattern di dati ripetitivi.

Oltre al contesto di compressione persistente, la nuova implementazione include diverse altre ottimizzazioni:

Risultati dei benchmark

Abbiamo eseguito 10.000 round-trip di compressione + decompressione per ogni dimensione di messaggio. Ogni round-trip comprime un payload JSON e poi lo decomprime, verificando che l'output corrisponda all'originale. Il test è stato eseguito su una macchina Windows a 64 bit compilata con Delphi 12 Athens.

Configurazione di default (contesto persistente)

Questa è la modalità di default in cui il contesto di compressione viene mantenuto tra i frame, lo scenario reale più comune:

Dimensione messaggio Precedente (ms) Nuovo (ms) Velocizzazione
1 KB 437 ms 28 ms 15,6x più veloce
4 KB 480 ms 88 ms 5,5x più veloce
16 KB 546 ms 431 ms 1,3x più veloce
64 KB 1.994 ms 1.725 ms 1,2x più veloce

Con NoContextTakeOver (frame indipendenti)

Quando NoContextTakeOver è abilitato, ogni frame viene compresso in modo indipendente. Anche in questa modalità, le ottimizzazioni di riutilizzo dei buffer e accesso diretto alla memoria forniscono un solido miglioramento:

Dimensione messaggio Precedente (ms) Nuovo (ms) Velocizzazione
1 KB 149 ms 75 ms 2,0x più veloce
4 KB 173 ms 100 ms 1,7x più veloce
16 KB 302 ms 228 ms 1,3x più veloce
64 KB 1.216 ms 1.094 ms 1,1x più veloce

Chi ne beneficia di più?

Il miglioramento è più drammatico per le applicazioni che scambiano molti messaggi piccoli, che è esattamente il caso d'uso tipico di WebSocket:

Chat e messaggistica
I messaggi di testo brevi (tipicamente sotto i 4 KB) vedono i maggiori guadagni: compressione da 5 a 15 volte più veloce.
Feed di dati in tempo reale
Gli aggiornamenti JSON per dashboard, ticker azionari e sensori IoT beneficiano sia della velocità sia del contesto persistente che impara i pattern ripetitivi.
Gaming e multiplayer
I frequenti piccoli aggiornamenti di stato beneficiano del basso overhead per frame.
Server ad alta concorrenza
Meno tempo CPU per frame significa che il server può gestire più connessioni simultanee.

Completamente compatibile

L'ottimizzazione è completamente trasparente: non sono necessarie modifiche al codice della tua applicazione. I dati compressi sul filo sono identici alla versione precedente, quindi i server aggiornati funzionano perfettamente con i client esistenti e viceversa.

La nuova implementazione supporta tutte le piattaforme e i compilatori:

Aggiorna a 2026.4.0

L'ottimizzazione di permessage-deflate è disponibile in sgcWebSockets 2026.4.0. Aggiorna semplicemente all'ultima versione e le tue connessioni WebSocket beneficeranno automaticamente di una compressione più veloce. Scarica da esegece.com.

Un ringraziamento speciale a Michael per aver contribuito all'implementazione ottimizzata iniziale che ha ispirato questo lavoro. La sua ricerca su contesti zlib persistenti e accesso diretto alla memoria ha posto le basi per questi miglioramenti delle prestazioni.