Compression WebSocket plus rapide

· Fonctionnalités

La compression WebSocket est essentielle pour réduire la bande passante et améliorer la réactivité, en particulier lors de la transmission de données répétitives comme des charges utiles JSON. L'extension permessage-deflate compresse chaque trame WebSocket à la volée — mais la vitesse de cette compression impacte directement le débit de ton application.

À partir de sgcWebSockets 2026.4.0, l'implémentation de permessage-deflate a été entièrement réécrite pour des performances bien plus rapides. Dans nos benchmarks, les petits messages se compressent et se décompressent jusqu'à 15 fois plus vite, avec des gains mesurables sur toutes les tailles de charges utiles.

Qu'est-ce qui a changé ?

L'implémentation précédente initialisait et détruisait le moteur de compression à chaque trame WebSocket. Cela signifiait que même un minuscule message de 1 Ko payait le coût complet de la configuration du compresseur, de la compression des données, puis du démontage de tout — pour répéter ensuite tout le processus pour le message suivant.

La nouvelle implémentation maintient le moteur de compression vivant entre les trames. Il est initialisé une fois quand la première trame arrive et réutilisé pendant toute la durée de vie de la connexion. Cela élimine la surcharge de configuration par trame et permet aussi au moteur d'apprendre des messages précédents, ce qui donne une compression plus rapide des motifs de données répétitifs.

En plus du contexte de compression persistant, la nouvelle implémentation inclut plusieurs autres optimisations :

Résultats des benchmarks

Nous avons exécuté 10 000 allers-retours compression + décompression pour chaque taille de message. Chaque aller-retour compresse une charge utile JSON puis la décompresse, en vérifiant que la sortie correspond à l'original. Le test a été effectué sur une machine Windows 64 bits compilée avec Delphi 12 Athens.

Configuration par défaut (contexte persistant)

C'est le mode par défaut où le contexte de compression est maintenu entre les trames — le scénario réel le plus courant :

Taille du message Précédent (ms) Nouveau (ms) Accélération
1 KB 437 ms 28 ms 15,6x plus rapide
4 KB 480 ms 88 ms 5,5x plus rapide
16 KB 546 ms 431 ms 1,3x plus rapide
64 KB 1,994 ms 1,725 ms 1,2x plus rapide

Avec NoContextTakeOver (trames indépendantes)

Quand NoContextTakeOver est activé, chaque trame est compressée indépendamment. Même dans ce mode, les optimisations de réutilisation de buffer et d'accès mémoire direct fournissent une amélioration solide :

Taille du message Précédent (ms) Nouveau (ms) Accélération
1 KB 149 ms 75 ms 2,0x plus rapide
4 KB 173 ms 100 ms 1,7x plus rapide
16 KB 302 ms 228 ms 1,3x plus rapide
64 KB 1,216 ms 1,094 ms 1,1x plus rapide

Qui en profite le plus ?

L'amélioration est la plus spectaculaire pour les applications qui échangent de nombreux petits messages — ce qui est exactement le cas d'usage typique de WebSocket :

Chat & messagerie
Les messages texte courts (typiquement sous 4 Ko) bénéficient des plus grands gains : compression 5 à 15 fois plus rapide.
Flux de données en temps réel
Les mises à jour JSON pour tableaux de bord, tickers boursiers et capteurs IoT bénéficient à la fois de la vitesse et du contexte persistant qui apprend les motifs répétitifs.
Jeu & multijoueur
Les mises à jour d'état petites et fréquentes bénéficient de la faible surcharge par trame.
Serveurs à forte concurrence
Moins de temps CPU par trame signifie que le serveur peut gérer plus de connexions simultanées.

Totalement compatible

L'optimisation est totalement transparente — aucune modification de code n'est nécessaire dans ton application. Les données compressées sur le réseau sont identiques à la version précédente, donc les serveurs mis à jour fonctionnent de manière transparente avec les clients existants et inversement.

La nouvelle implémentation prend en charge toutes les plateformes et tous les compilateurs :

Mettre à jour vers 2026.4.0

L'optimisation permessage-deflate est disponible dans sgcWebSockets 2026.4.0. Il te suffit de mettre à jour vers la dernière version et tes connexions WebSocket bénéficieront automatiquement d'une compression plus rapide. Télécharge sur esegece.com.

Remerciements particuliers à Michael pour avoir contribué à l'implémentation optimisée initiale qui a inspiré ce travail. Ses recherches sur les contextes zlib persistants et l'accès mémoire direct ont posé les bases de ces améliorations de performance.