Está disponível o lançamento da biblioteca zlib-ng 2.0, que é marcada como a primeira versão estável do projeto (em seguida, já está disponível um lançamento corretivo 2.0.1). O zlib-ng é compatível com o zlib em nível de API, mas oferece otimizações adicionais que não foram aceitas no repositório oficial do zlib devido à abordagem conservadora em relação à aceitação de mudanças. Além disso, um API modernizado foi proposto, baseado no zlib, mas alterado para simplificar a portabilidade. O código do projeto foi escrito em C e é distribuído sob a licença Zlib.
Os testes realizados em sistemas x86_64 mostraram que, ao realizar operações de compressão, o zlib-ng é aproximadamente 4 vezes mais rápido que o zlib e 2,1 vezes mais rápido que o gzip. Durante a descompressão, o zlib-ng é aproximadamente 2,4 vezes mais rápido que o zlib e 1,8 vezes mais rápido que o gzip. O aumento significativo no desempenho da compressão/descompressão foi alcançado principalmente pelo uso de instruções vetoriais SSE*, AVX2, VSX e Neon.
Além disso, foi adicionada a implementação do algoritmo de cálculo de somas de verificação Adler32, otimizada com instruções SSSE3, AVX2, Neon e VSX, a implementação de CRC32-B baseada em PCLMULQDQ e ACLE, tabelas de hash aprimoradas, implementação do hash Slide baseada em SSE2, AVX2, Neon e VSX, e operações de comparação baseadas em SSE4.2 e AVX2. O pacote também inclui modificações focadas na melhoria do desempenho, utilizadas em forks das empresas Intel e Cloudflare. O processo de trabalho com buffers foi otimizado. O suporte para sistemas de compilação CMake e NMake foi adicionado. Sistemas de integração contínua foram utilizados para testes.
Além das otimizações, o zlib-ng também inclui patches acumulados em pacotes de distribuições e uma limpeza do código de soluções contornadas utilizadas no zlib para suportar compiladores e plataformas antigos, que dificultam a implementação de métodos mais eficientes (por exemplo, limitações necessárias para suportar sistemas de 16 bits e compiladores incompatíveis com ANSI C). O trabalho foi realizado para identificar e corrigir erros detectados por analisadores estáticos, sistemas de fuzzing e ferramentas para detectar problemas de gerenciamento de memória (AddressSanitizer e MemorySanitizer).
Fonte: opennet.ru
