Se ha lanzado la versión 2.0 de la biblioteca zlib-ng, que se considera la primera versión estable del proyecto (ya está disponible una versión de corrección 2.0.1). Zlib-ng es compatible con zlib a nivel de API, pero ofrece optimizaciones adicionales que no fueron aceptadas en el repositorio oficial de zlib debido a un enfoque conservador en la aceptación de cambios. También se ha propuesto una API modernizada, basada en zlib, pero modificada para facilitar la portabilidad. El código del proyecto está escrito en C y se distribuye bajo la licencia Zlib.
Las pruebas realizadas en sistemas x86_64 han demostrado que, al realizar operaciones de compresión, Zlib-ng es aproximadamente 4 veces más rápido que zlib y 2.1 veces más rápido que gzip. Al descomprimir, Zlib-ng es aproximadamente 2.4 veces más rápido que zlib y 1.8 veces más rápido que gzip. Se ha logrado un aumento significativo en el rendimiento de compresión/descompresión principalmente gracias al uso de instrucciones vectoriales SSE*, AVX2, VSX y Neon.
Incluye una implementación del algoritmo de cálculo de sumas de verificación Adler32, optimizada mediante instrucciones SSSE3, AVX2, Neon y VSX, implementación de CRC32-B basada en PCLMULQDQ y ACLE, tablas hash mejoradas, implementación del hash Slide basada en SSE2, AVX2, Neon y VSX, y operaciones de comparación basadas en SSE4.2 y AVX2. También se incluye modificaciones orientadas a mejorar el rendimiento, utilizadas en forks de las compañías Intel y Cloudflare. El proceso de trabajo con buffers ha sido optimizado. Se ha añadido soporte para sistemas de construcción CMake y NMake. Se han utilizado sistemas de integración continua para las pruebas.
Además de las optimizaciones en Zlib-ng, también se han incluido parches acumulados en los paquetes de distribuciones y se ha limpiado el código de soluciones alternativas utilizadas en zlib para soportar compiladores y plataformas antiguas, que dificultan la implementación de métodos más eficaces (por ejemplo, restricciones necesarias para soportar sistemas de 16 bits y compiladores no compatibles con ANSI C). Se ha trabajado en la identificación y corrección de errores detectados por analizadores estáticos, sistemas de pruebas de fuzzing y herramientas para encontrar problemas de manejo de memoria (AddressSanitizer y MemorySanitizer).
Fuente: opennet.ru
