Reequilibrio de los niveles de compresión Deflate en Go

Fuentes: Re-balancing Deflate Compression Levels

Tras un trabajo prolongado de optimización de la compresión Deflate en Go, el análisis de los benchmarks reveló dos problemas claros en los niveles de compresión existentes. En primer lugar, existía un salto de rendimiento considerable entre el nivel 1 y el nivel 2, algo esperable porque el nivel 1 emplea un algoritmo distinto orientado a la velocidad. En segundo lugar, las mejoras por encima del nivel 5 eran insignificantes: la diferencia de compresión entre el nivel 6 (valor predeterminado actual) y el nivel 9 era de apenas un 0,25 %, mientras que la pérdida de rendimiento alcanzaba el 25 %. Esto suponía duplicar el uso de CPU a cambio de una reducción de red del 3 %, un equilibrio poco razonable para los usuarios.

Con el objetivo de corregir estos desajustes, se planteó reequilibrar los niveles para que cada uno ofreciese una mejora de compresión respecto al anterior a un coste de velocidad proporcionado, manteniendo como extremos los niveles 1 y 9 y logrando una progresión más lineal de la velocidad. Para ello se ajustaron parámetros como la búsqueda de coincidencias previas, la detección de datos incompresibles y los límites de memoria. Los experimentos se realizaron sobre tres conjuntos de datos: enwik9 (volcado XML de Wikipedia), el corpus de 10 GB de Matt Mahoney y un conjunto propio de 548 archivos típicos de servidor web.

Los resultados muestran una distribución mucho más uniforme de los niveles, con una progresión más intuitiva entre velocidad y compresión. La excepción es el nivel 2, que sigue rindiendo por debajo de lo esperado y requeriría cambios en el código para mejorarlo. Como consecuencia del análisis, el nivel 5 se propone como nuevo valor predeterminado: ofrece el mejor equilibrio general, casi duplica la velocidad del nivel 6 y, sumado a las optimizaciones sobre la biblioteca estándar, resulta entre 4 y 5 veces más rápido con una pérdida de compresión del 2-5 %. Los cambios estaban disponibles en una rama de pull request en el repositorio klauspost/compress y se esperaba su integración en Go 1.7.