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 :
- Buffers mémoire préalloués — les buffers sont alloués une fois et réutilisés, évitant l'allocation mémoire répétée à chaque trame.
- Accès mémoire direct — quand l'entrée est déjà en mémoire, le moteur la lit directement sans la copier d'abord dans des buffers intermédiaires.
- Flux temporaires réutilisés — les flux de travail internes sont créés une fois dans le constructeur au lieu d'être créés et détruits à chaque appel compress/decompress.
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 :
- Delphi 7 à Delphi 13 (y compris C++Builder)
- Windows, macOS, Linux, Android, iOS
- Cibles 32 bits et 64 bits
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.
