Zo maak je datacompressie vier keer sneller zonder code te herschrijven
Waarom iets wijzigen dat al werkt sinds de negentiger jaren
De originele zlib-bibliotheek verscheen dertig jaar geleden. Mark Adler en Jean-Loup Gailly creëerden een ongelooflijk betrouwbaar en draagbaar hulpmiddel. Het werkt vrijwel overal, van smartwatches tot oudere besturingssystemen. Maar deze universaliteit heeft een keerzijde.
Om compatibiliteit met oude compilers en 16-bit-omgevingen te behouden, moet zlib-code een heleboel workarounds meeslepen. Het zit vol met geheugenlimietcontroles en macro's voor het ondersteunen van archaïsche processors. Om deze reden konden frisse optimalisaties voor vectorinstructies door moderne ontwikkelaars simpelweg niet naar de hoofdrepository worden gepusht. Mark Adler hanteert een hoge standaard voor stabiliteit, en zijn aanpak is begrijpelijk.
Dat was het moment waarop Hans Christian Rosbach (Dead2) besloot om de opgehoopte community patches samen te voegen tot één fork. Zo werd het zlib-ng project geboren.
Wat er werd gewijzigd binnen zlib-ng
Het idee achter de fork is simpel: verwijder de oude legacy code en pas vectorinstructies van moderne CPU's toe. Ontwikkelaars haalden patches van Intel en Cloudflare, ruimden voorbeelden uit de negentiger jaren op en herschreven belangrijke algoritmen in C11.
De resultaten waren tastbaar. Op x86-64 architectuur werken compressie en decompressie ongeveer vier keer sneller dan standaard zlib.
Wat deze prestatieverbetering mogelijk maakt:
- Vectorinstructies voor verschillende architecturen. AVX2, AVX-512, SSSE3 voor x86, NEON voor ARM, evenals vectorunits voor POWER, RISC-V, LoongArch en IBM Z worden gebruikt.
- Automatische detectie van CPU-mogelijkheden tijdens runtime. Het gecompileerde binaire bestand zelf weet welke gevirtualiseerde functies het moet aanroepen op een specifieke processor.
- Snelle deflate-algoritmen. Intels werk aan het optimaliseren van herhaalzoektocht, hash-verschuiving en CRC32-berekening wordt gebruikt.
- Veilige niet-gealigneerde toegang. Het lezen en schrijven van niet-gealigneerd geheugen is geoptimaliseerd samen met een bijgewerkt bitbuffer.
Tegelijkertijd probeert het project de bestaande wereld niet te breken. De bibliotheek kan worden gebouwd met een API die volledig compatibel is met standaard zlib, of je kunt zijn eigen bijgewerkte native API gebruiken.
Hoe zelf bouwen en uitproberen
Het project heeft twee build-systemen: CMake en het goede oude configure.
Als je CMake gebruikt, ziet de build er vertrouwd uit:
Parameter maakt volledige compatibiliteitsmodus met klassieke zlib mogelijk. De output is een bibliotheek die kan worden gesubstitueerd voor het systeem .
Voor fans van het vertrouwde build-proces is er geen verschil:
Als je de vcpkg dependency manager gebruikt, hoef je helemaal geen bronnen handmatig op te halen:
Applicaties versnellen met LD_PRELOAD
Een van de interessantste trucs met zlib-ng is het versnellen van bestaande software zonder de code te wijzigen. Als je programma dynamisch linkt met , kun je de bibliotheek tijdens runtime substitueren.
Zo start je een utility met een tijdelijke substitutie:
De applicatie gebruikt onmiddellijk de vectorinstructies van je processor zonder enige wijzigingen aan het binaire bestand.
De auteurs van de fork waarschuwen echter specifiek in de README: probeer niet het systeem op distributieniveau te vervangen in Linux -mappen. Als er iets misgaat of er een zeldzame incompatibiliteit optreedt, zal het hele systeem crashen, inclusief systeemdiensten. Het is veiliger om de fork in een aparte map zoals te installeren en deze expliciet te linken.
Hoe goed is de code gedekt door tests
Code verantwoordelijk voor datacompressie moet zonder fouten werken. Het verliezen van zelfs één enkel bit zal een archief veranderen in rommel. De zlib-ng auteurs namen testen serieus.
De repository maakt gebruik van een uitgebreide set controles:
- Geheugensanitizers en fuzzing via OSS-Fuzz.
- Native en geëmuleerde CI via QEMU voor ARM, PowerPC, RISC-V, SPARC64 en S390x.
- Unit tests gebaseerd op Google Test.
- Prestatiemetingen met behulp van Google Benchmark.
Dankzij continue fuzzing handhaaft de bibliotheek een hoog betrouwbaarheidsniveau, wat cruciaal is bij het vervangen van kernsysteemcomponenten.
Wie kan profiteren van zlib-ng
Allereerst zal de fork nuttig zijn voor teams waar compressie en decompressie van data een bottleneck zijn geworden. Als je gigabytes aan logs verwerkt, werkt met webservers zoals nginx, texturen comprimeert bij game-ontwikkeling, of enorme hoeveelheden data in de backend verwerkt, zal zlib-ng een merkbare snelheidsboost leveren.
Aan de andere kant, als je software draait op oude 16-bit microcontrollers of volledig exotische besturingssystemen van drie decennia oud, heeft het geen zin om de bewezen originele zlib aan te raken. De fork werd specifiek gemaakt voor moderne platforms.
Het hulpmiddel ziet er mature uit en wordt actief onderhouden door de community. Als je maximale DEFLATE- en gzip-prestaties nodig hebt op moderne hardware, is het de moeite waard om een paar uur te besteden en benchmarks uit te voeren op je data.
Gerelateerde projecten