Die Version 2.0 der Bibliothek zlib-ng ist jetzt verfügbar und wird als erster stabiler Release des Projekts eingeordnet (darauf folgt bereits das Korrektur-Release 2.0.1). Zlib-ng ist API-kompatibel mit zlib, bietet jedoch zusätzliche Optimierungen, die aufgrund eines konservativen Ansatzes zur Annahme von Änderungen nicht im offiziellen zlib-Repository aufgenommen wurden. Zusätzlich wird eine modernisierte API angeboten, die auf zlib basiert, jedoch zur Vereinfachung der Portierung geändert wurde. Der Code des Projekts ist in C geschrieben und wird unter der Zlib-Lizenz verbreitet.
Tests auf x86_64-Systemen haben gezeigt, dass Zlib-ng beim Komprimieren etwa 4-mal schneller ist als zlib und 2,1-mal schneller als gzip. Bei der Dekomprimierung ist Zlib-ng etwa 2,4-mal schneller als zlib und 1,8-mal schneller als gzip. Diese signifikante Leistungssteigerung bei der Kompression/Dekompression wurde hauptsächlich durch den Einsatz von Vektor-Anweisungen wie SSE*, AVX2, VSX und Neon erreicht.
Unter anderem wurde die Implementierung des Algorithmus zur Berechnung von Adler32-Prüfziffern hinzugefügt, optimiert durch SSSE3-, AVX2-, Neon- und VSX-Anweisungen. Zudem umfasst es die Implementierung von CRC32-B auf Basis von PCLMULQDQ und ACLE, verbesserte Hash-Tabellen, die Hash-Implementierung von Slide unter Verwendung von SSE2, AVX2, Neon und VSX sowie Vergleichsoperationen basierend auf SSE4.2 und AVX2. Auch Leistungssteigerungen, die in Forks von Intel und Cloudflare verwendet werden, sind enthalten. Der Buffer-Prozess wurde optimiert. Unterstützung für die Build-Systeme CMake und NMake wurde hinzugefügt. Für Tests wurden Systeme zur kontinuierlichen Integration eingesetzt.
Neben den Optimierungen in Zlib-ng wurden auch die in den Distributionspaketen angefallenen Patches integriert und der Code von Workarounds gereinigt, die in zlib verwendet wurden, um ältere Compiler und Plattformen zu unterstützen, jedoch die Implementierung effizienterer Methoden behinderten (zum Beispiel die Einschränkungen, die notwendig sind, um 16-Bit-Systeme und inkompatible ANSI C-Compiler zu unterstützen). Es wurde an der Identifizierung und Behebung von Fehlern gearbeitet, die durch statische Analysatoren, Fuzzing-Tests und Werkzeuge zur Identifizierung von Problemen mit dem Speicher (AddressSanitizer und MemorySanitizer) gefunden wurden.
Quelle: opennet.ru
