Pierwsza stabilna wersja zlib-ng, wysokowydajnego forka zlib

Wydanie biblioteki zlib-ng 2.0 jest już dostępne i jest oznaczone jako pierwsze stabilne wydanie projektu (po nim następuje wydanie korygujące 2.0.1). Zlib-ng jest kompatybilny z zlib na poziomie API, ale zapewnia dodatkowe optymalizacje, które nie są akceptowane w oficjalnym repozytorium zlib ze względu na konserwatywne podejście do akceptowania zmian. Dodatkowo zaproponowano zmodernizowane API oparte na zlib, ale zmodyfikowane w celu uproszczenia przenoszenia. Kod projektu napisany jest w języku C i rozpowszechniany na licencji Zlib.

Testy przeprowadzone na systemach x86_64 wykazały, że podczas wykonywania operacji kompresji Zlib-ng jest około 4 razy szybszy niż zlib i 2.1 razy szybszy niż gzip. Podczas dekompresji Zlib-ng jest około 2.4 razy szybszy niż zlib i 1.8 razy szybszy niż gzip. Znaczący wzrost wydajności kompresji/dekompresji został osiągnięty głównie dzięki zastosowaniu instrukcji wektorowych SSE*, AVX2, VSX i Neon.

Obejmuje dodaną implementację algorytmu sumy kontrolnej Adler32, zoptymalizowaną przy użyciu instrukcji SSSE3, AVX2, Neon i VSX, implementację CRC32-B w oparciu o PCLMULQDQ i ACLE, ulepszone tabele skrótów, implementację skrótu Slide w oparciu o SSE2, AVX2, Neon i VSX, oparte na operacjach porównawczych na SSE4.2 i AVX2. W składzie znalazły się także zmiany mające na celu poprawę wydajności, zastosowane w forkach firm Intel i Cloudflare. Zoptymalizowano proces pracy z buforami. Dodano obsługę systemów kompilacji CMake i NMake. Do testowania wykorzystywane są systemy ciągłej integracji.

Oprócz optymalizacji Zlib-ng zawiera również łatki, które zgromadziły się w pakietach dystrybucyjnych i czyści kod z obejść używanych w zlib do obsługi starszych kompilatorów i platform, ale które uniemożliwiają wdrożenie bardziej wydajnych metod (na przykład ograniczenia niezbędne do obsługi systemy 16-bitowe i kompilatory C inne niż ANSI). Prowadzono prace nad identyfikacją i korektą błędów identyfikowanych przez analizatory statyczne, systemy testowania fuzzingowego oraz narzędzia do identyfikacji problemów podczas pracy z pamięcią (AddressSanitizer i MemorySanitizer).

Źródło: opennet.ru

Dodaj komentarz