Comment accélérer la compression des données par quatre sans réécrire le code
Pourquoi changer quelque chose qui fonctionne depuis les années quatre-vingt-dix
La bibliothèque zlib originale est apparue il y a trente ans. Mark Adler et Jean-Loup Gailly ont créé un outil incroyablement fiable et portable. Elle fonctionne presque partout, des montres connectées aux systèmes d'exploitation legacy. Mais cette universalité a un revers.
Pour maintenir la compatibilité avec les anciens compilateurs et les environnements 16 bits, le code zlib doit traîner un tas de contournements. Il est rempli de vérifications de limites de mémoire et de macros pour prendre en charge des processeurs archaïques. Pour cette raison, les nouvelles optimisations pour les instructions vectorielles par les développeurs modernes n'ont tout simplement pas pu être intégrées dans le dépôt principal. Mark Adler maintient des normes élevées en matière de stabilité, et son approche est compréhensible.
C'est à ce moment-là que Hans Christian Rosbach (Dead2) a décidé de compiler les correctifs communautaires accumulés en une seule bifurcation. C'est ainsi qu'est né le projet zlib-ng.
Ce qui a changé à l'intérieur de zlib-ng
L'idée de la bifurcation est simple : supprimer le code legacy ancien et appliquer les instructions vectorielles des processeurs modernes. Les développeurs ont pris les correctifs d'Intel et de Cloudflare, ont nettoyé les exemples des années quatre-vingt-dix, et ont réécrit les algorithmes clés en C11.
Les résultats ont été tangibles. Sur l'architecture x86-64, la compression et la décompression fonctionnent environ quatre fois plus vite que zlib standard.
Ce qui entraîne ce gain de performance :
- Instructions vectorielles pour différentes architectures. AVX2, AVX-512, SSSE3 pour x86, NEON pour ARM, ainsi que les unités vectorielles pour POWER, RISC-V, LoongArch et IBM Z sont utilisées.
- Détection automatique des capacités du processeur à l'exécution. Le binaire compilé sait lui-même quelles fonctions vectorisées appeler sur un processeur spécifique.
- Algorithmes deflate rapides. Les travaux d'Intel sur l'optimisation de la recherche de répétitions, du décalage de hachage et du calcul CRC32 sont utilisés.
- Accès non aligné sécurisé. La lecture et l'écriture de mémoire non alignée sont optimisées ainsi qu'un tampon de bits mis à jour.
Dans le même temps, le projet ne cherche pas à briser l'existant. La bibliothèque peut être compilée avec une API entièrement compatible avec zlib standard, ou vous pouvez utiliser sa propre API native mise à jour.
Comment compiler et tester par vous-même
Le projet dispose de deux systèmes de build : CMake et le bon vieux configure.
Si vous utilisez CMake, la compilation semble familière :
Le paramètre active le mode de compatibilité complète avec zlib classique. La sortie est une bibliothèque qui peut être substituée au système.
Pour les amateurs du processus de build familier , rien ne change :
Si vous utilisez le gestionnaire de dépendances vcpkg, vous n'aurez pas du tout besoin de récupérer les sources manuellement :
Accélérer les applications avec LD_PRELOAD
L'une des astuces les plus intéressantes avec zlib-ng est d'accélérer les logiciels existants sans modifier leur code. Si votre programme se lie dynamiquement à , vous pouvez substituer la bibliothèque à l'exécution.
Voici comment lancer un utilitaire avec une substitution temporaire :
L'application utilise immédiatement les instructions vectorielles de votre processeur sans aucune modification du binaire.
Cependant, les auteurs de la bifurcation mettent en garde spécifiquement dans le README : n'essayez pas de remplacer le système au niveau de la distribution dans les répertoires de Linux. Si quelque chose se passe mal ou qu'une incompatibilité rare apparaît, tout le système plantera, y compris les services système. Il est plus sûr d'installer la bifurcation dans un répertoire séparé comme et de le lier explicitement.
Quelle est la couverture de test du code
Le code responsable de la compression de données doit fonctionner sans défaillances. Perdre même un seul bit transformera une archive en déchet. Les auteurs de zlib-ng ont pris les tests au sérieux.
Le dépôt utilise un ensemble complet de vérifications :
- Sanitizers de mémoire et fuzzing via OSS-Fuzz.
- CI natif et émulé via QEMU pour ARM, PowerPC, RISC-V, SPARC64 et S390x.
- Tests unitaires basés sur Google Test.
- Mesures de performance utilisant Google Benchmark.
Grâce au fuzzing continu, la bibliothèque maintient un niveau élevé de fiabilité, ce qui est critique lors du remplacement de composants système essentiels.
Qui bénéficiera de zlib-ng
Avant tout, la bifurcation sera utile pour les équipes où la compression et la décompression de données sont devenues un goulot d'étranglement. Si vous traitez des gigaoctets de logs, travaillez avec des serveurs web comme nginx, compressez des textures dans le développement de jeux, ou traitez d'énormes quantités de données dans le backend, zlib-ng offrira un gain de vitesse notable.
D'un autre côté, si votre logiciel s'exécute sur d'anciens microcontrôleurs 16 bits ou des systèmes d'exploitation exotiques vieux de trois décennies, il n'y a aucun intérêt à toucher au zlib original éprouvé. La bifurcation a été créée spécifiquement pour les plateformes modernes.
L'outil semble mature et est activement maintenu par la communauté. Si vous avez besoin de performances maximales DEFLATE et gzip sur du matériel moderne, cela vaut la peine de passer quelques heures et d'exécuter des benchmarks sur vos données.
Projets similaires