>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Embebidos Seguridad
C

Cómo acelerar la compresión de datos cuatro veces sin reescribir código

Por qué cambiar algo que ha funcionado desde los noventa

La biblioteca original zlib apareció hace treinta años. Mark Adler y Jean-Loup Gailly crearon una herramienta increíblemente fiable y portable. Funciona casi en todas partes, desde relojes inteligentes hasta sistemas operativos legacy. Pero esta universalidad tiene un inconveniente.

Para mantener la compatibilidad con compiladores antiguos y entornos de 16 bits, el código de zlib arrastra una serie de soluciones alternativas. Está lleno de comprobaciones de límites de memoria y macros para soportar procesadores arcaicos. Por esta razón, las nuevas optimizaciones de instrucciones vectoriales de los desarrolladores modernos simplemente no pudieron incorporarse al repositorio principal. Mark Adler mantiene un alto nivel de estabilidad, y su enfoque es comprensible.

Fue entonces cuando Hans Christian Rosbach (Dead2) decidió compilar los parches acumulados de la comunidad en un único fork. Así nació el proyecto zlib-ng.

Qué cambió dentro de zlib-ng

La idea del fork es sencilla: eliminar el código heredado antiguo y aplicar instrucciones vectoriales de CPUs modernos. Los desarrolladores tomaron parches de Intel y Cloudflare, eliminaron ejemplos de los noventa y reescribieron algoritmos clave en C11.

Los resultados fueron tangibles. En la arquitectura x86-64, la compresión y descompresión funcionan aproximadamente cuatro veces más rápido que con zlib estándar.

Lo que impulsa esta mejora de rendimiento:

  • Instrucciones vectoriales para diferentes arquitecturas. Se utilizan AVX2, AVX-512, SSSE3 para x86, NEON para ARM, así como unidades vectoriales para POWER, RISC-V, LoongArch e IBM Z.
  • Detección automática de capacidades de CPU en tiempo de ejecución. El binario compilado sabe por sí mismo qué funciones vectorizadas llamar en un procesador específico.
  • Algoritmos deflate rápidos. Se utiliza el trabajo de Intel en la optimización de búsqueda de repeticiones, desplazamiento de hash y cálculo CRC32.
  • Acceso no alineado seguro. La lectura y escritura de memoria no alineada está optimizada junto con un búfer de bits actualizado.

Al mismo tiempo, el proyecto no intenta romper el mundo existente. La biblioteca puede compilarse con una API totalmente compatible con zlib estándar, o puedes usar su propia API nativa actualizada.

Cómo compilarlo y probarlo tú mismo

El proyecto tiene dos sistemas de compilación: CMake y el clásico configure.

Si usas CMake, la compilación resulta familiar:

El parámetro habilita el modo de compatibilidad total con zlib clásico. El resultado es una biblioteca que puede sustituirse por el del sistema.

Para los aficionados al familiar proceso de compilación con no es diferente:

Si usas el gestor de dependencias vcpkg, no necesitarás obtener las fuentes manualmente en absoluto:

Acelerar aplicaciones con LD_PRELOAD

Uno de los trucos más interesantes con zlib-ng es acelerar el software existente sin cambiar su código. Si tu programa enlaza dinámicamente con , puedes sustituir la biblioteca en tiempo de ejecución.

Así es cómo lanzar una utilidad con una sustitución temporal:

La aplicación utiliza inmediatamente las instrucciones vectoriales de tu procesador sin ningún cambio en el binario.

Sin embargo, los autores del fork advierten específicamente en el README: no intentes reemplazar el del sistema a nivel de distribución en directorios de Linux. Si algo sale mal o surge una incompatibilidad rara, todo el sistema se colgará, incluyendo los servicios del sistema. Es más seguro instalar el fork en un directorio separado como y enlazarlo explícitamente.

Qué tan bien está cubierto el código por pruebas

El código responsable de la compresión de datos debe funcionar sin fallos. Perder incluso un solo bit convertirá un archivo en basura. Los autores de zlib-ng se tomaron las pruebas en serio.

El repositorio emplea un conjunto completo de comprobaciones:

  • Sanitizers de memoria y fuzzing a través de OSS-Fuzz.
  • CI nativo y emulado a través de QEMU para ARM, PowerPC, RISC-V, SPARC64 y S390x.
  • Pruebas unitarias basadas en Google Test.
  • Medidas de rendimiento usando Google Benchmark.

Gracias al fuzzing continuo, la biblioteca mantiene un alto nivel de fiabilidad, lo cual es crítico al reemplazar componentes del sistema.

Quién se beneficiará de zlib-ng

En primer lugar, el fork será útil para equipos donde la compresión y descompresión de datos se haya convertido en un cuello de botella. Si estás procesando gigabytes de logs, trabajando con servidores web como nginx, comprimiendo texturas en desarrollo de juegos, o procesando enormes cantidades de datos en el backend, zlib-ng proporcionará un aumento notable de velocidad.

Por otro lado, si tu software se ejecuta en microcontroladores antiguos de 16 bits o sistemas operativos exóticos de tres décadas de antigüedad, no tiene sentido tocar el zlib original probado. El fork fue creado específicamente para plataformas modernas.

La herramienta parece madura y es mantenida activamente por la comunidad. Si necesitas el máximo rendimiento de DEFLATE y gzip en hardware moderno, vale la pena dedicar un par de horas y ejecutar benchmarks con tus datos.

Proyectos relacionados