¿Cuál es el mejor algoritmo de compresión de archivos?

Luego de explicar el uso básico de zpaq , se me ocurrió llevar a cabo un pequeño experimento como comparación de rendimiento de diferentes algoritmos de compresión. Veamos un benchmark de tiempo, tamaño de archivo y uso de CPU para diferentes formatos.







Experimento

El origen para esta prueba son los archivos de este sitio Web: 10106 archivos que en total ocupan aproximadamente 286 MB en disco.

root@linuxito:/tmp/benchmark# find /var/www/linuxito.com/ -type f | wc -l 10106 root@linuxito:/tmp/benchmark# du -hs /var/www/linuxito.com/ 286M /var/www/linuxito.com/

El sistema sobre el cual se realizan las pruebas posee un procesador Intel Core i3-2100:

emi@hal9000:/tmp/benchmark % sysctl hw.model hw.machine hw.ncpu hw.model: Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz hw.machine: amd64 hw.ncpu: 4

Cómo instalar ZIP, bzip2, gzip, RAR, 7-Zip en Debian y derivados

# apt-get install zip unzip gzip bzip2 rar unrar p7zip

Cómo instalar ZIP, bzip2, gzip, RAR, 7-Zip en FreeBSD

# pkg install zip unzip gzip bzip2 rar unrar p7zip

Cómo instalar ZPAQ en Debian y FreeBSD

Ver el artículo Comprimir y extraer archivos con ZPAQ.

ZIP

Formato ZIP a máxima compresión:

zip -9 -r linuxito.zip var/www/linuxito.com/

El tiempo total transcurrido es de aproximadamente 10 segundos:

10.045u 0.536s 0:10.79 97.9% 228+578k 1+826io 0pf+0w

Se ha utilizado un 97.9% de CPU en promedio.

El tamaño del archivo es de aproximadamente 166 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.zip -rw-r--r-- 1 emi wheel 173914260 Apr 27 13:01 linuxito.zip

bzip2

Formato bzip2 a máxima compresión:

tar -cf linuxito.tar var/www/linuxito.com/ && bzip2 -9 linuxito.tar

El tiempo total transcurrido es de aproximadamente 47 segundos:

0.116u 0.433s 0:02.43 22.2% 73+178k 0+2155io 0pf+0w 45.182u 0.165s 0:45.58 99.4% 40+177k 0+1290io 0pf+0w

Se ha utilizado un 97.5% de CPU en promedio.

El tamaño del archivo es de aproximadamente 159 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.tar.bz -rw-r--r-- 1 emi wheel 167048881 Apr 28 13:03 linuxito.tar.bz2

gzip

Formato gzip a máxima compresión:

gzip -r -c -9 var/www/linuxito.com/ > linuxito.gz

El tiempo total transcurrido es de aproximadamente 10 segundos:

10.440u 0.378s 0:10.87 99.4% 46+167k 0+1324io 0pf+0w

Se ha utilizado un 99.4% de CPU en promedio.

El tamaño del archivo es de aproximadamente 161 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.gz -rw-r--r-- 1 emi wheel 171310613 Apr 28 12:31 linuxito.gz

RAR

Formato RAR a máxima tasa de compresión:

rar a -m5 linuxito.rar -r var/www/linuxito.com

El tiempo total transcurrido es de aproximadamente 33 segundos:

51.426u 3.346s 0:33.00 165.9% 1781+898k 1+17755io 0pf+0w

Se ha utilizado un 165.9% de CPU en promedio.

El tamaño del archivo es de aproximadamente 162 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.rar -rw-r--r-- 1 emi wheel 170126942 Apr 27 13:19 linuxito.rar

7-Zip

Formato 7z en modo "ultra":

7zr a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on linuxito.7z var/www/linuxito.com/

El tiempo total transcurrido es de aproximadamente 58 segundos:

103.671u 1.197s 0:58.27 179.9% 1130+232k 0+1192io 0pf+0w

Se ha utilizado un 179.9% de CPU en promedio.

El tamaño del archivo es de aproximadamente 149 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.7z -rw-r--r-- 1 emi wheel 156150705 Apr 27 13:23 linuxito.7z

ZPAQ

Formato ZPAQ a mínima compresión:

zpaq -method 1 a linuxito.zpaq var/www/linuxito.com/

El tiempo total transcurrido es de aproximadamente 6 segundos:

18.098u 1.104s 0:06.90 278.1% 1152+1522k 1+1258io 0pf+0w

El tamaño del archivo es de aproximadamente 157 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.zpaq -rw-r--r-- 1 emi wheel 164622702 Apr 27 13:44 linuxito.zpaq

Formato ZPAQ a máxima compresión:

zpaq -method 5 a linuxito.zpaq5 var/www/linuxito.com/

El tiempo total transcurrido es de aproximadamente 10 minutos y 15 segundos:

2141.880u 5.362s 10:15.29 348.9% 1153+1350k 0+1174io 4pf+0w

El tamaño del archivo es de aproximadamente 146 MB:

emi@hal9000:/tmp/benchmark % ll linuxito.zpaq5 -rw-r--r-- 1 emi wheel 152860675 Apr 27 13:35 linuxito.zpaq5

Resultados

Tener en cuenta que se trata de una sola muestra para cada formato, con lo cual los resultados de tiempo no son precisos (sino mas bien una tendencia). Para obtener resultados precisos sería necesario tomar múltiples muestras para cada formato y quedarse con el promedio. Los resultados de tamaño son exactos para esta muestra (directorio origen).

Pongamos los resultados anteriores en una tabla:

Algoritmo Tiempo (s) Tamaño (bytes) CPU (%) Uso de CPU (CPU * Tiempo) ZIP 10.79 173914260 97.9 1,056.34 bzip2 47.01 167048881 97.5 4,583.48 gzip 10.87 171310613 99.4 1,080.48 RAR 33.00 170126942 165.9 5,474.70 7-Zip 58.27 156150705 179.9 10,482.77 ZPAQ 6.90 164622702 278.1 1,918.89 ZPAQ 5 615.29 152860675 348.9 214,674.68

A partir de esta tabla es posible generar los siguientes gráficos con LibreOffice Calc.

Conclusiones

La elección del mejor algoritmo de compresión depende del criterio de cada uno. Algunos pueden priorizar el tiempo, otros minimizar el uso de CPU, y el resto optimizar el uso de disco.

La siguiente gráfica, muestra la comparación de las diferentes métricas en escala logarítmica:

Sin embargo, es posible elegir el mejor algoritmo en base a la mejor combinación de estas tres características. Es decir, qué algoritmo logra el valor más eficiente de:

tiempo (segundos) * espacio (MB) * uso de CPU

Para obtener como resultado un índice de baja magnitud, aplico la siguiente fórmula: tiempo * espacio/1000000 * CPU/1000 . Esto da como resultado el siguiente gráfico:

De aquí se concluye que, para comprimir los archivos de este sitio Web, los algoritmos que logran el mejor promedio entre tiempo, espacio y uso de CPU, son ZIP y gzip. Esto tal vez explica por qué la mayoría de los paquetes de software se distribuyen en estos formatos.

Por otro lado, de los gráficos de tiempo y uso de CPU se desprende que el comportamiento de zpaq varía notablemente de acuerdo al método de compresión utilizado. Próximamente publicaré un nuevo test, orientado a la eficiencia de CPU en lugar de a lograr la máxima compresión.



Tal vez pueda interesarte

