Anteriormente comparé los algoritmos de compresión ZIP, bzip2, gzip, RAR, LZMA y ZPAQ para tratar de determinar cuál era el mejor de ellos en término de uso de CPU, tiempo y radio de compresión, con el objetivo de lograr la máxima compresión posible. En esta ocasión voy a repetir el test, pero orientado a lograr la mayor velocidad posible (para que nuestros backups se hagan lo más rápido posible y sin demoras).

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.

Este experimento apunta a lograr la mayor velocidad de compresión (más rápido), no la máxima tasa de compresión (menor tamaño de archivo). Varios de estos formatos cuentan con la opción store (almacenar sin comprimir, similar a tar), sin embargo el artículo apunta a lograr aunque sea una mínima compresión, no almacenar los archivos planos sin comprimir.

ZIP

Formato ZIP a mínima compresión y máxima velocidad:

zip -1 -r -q linuxito.zip var/www/linuxito.com/

El tiempo total transcurrido es de aproximadamente 9 segundos:

6.263u 0.684s 0:09.27 74.8%     229+580k 1856+851io 0pf+0w

Se ha utilizado un 74.8% de CPU en promedio.

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

emi@hal9000:/tmp/benchmark % ll linuxito.zip 
-rw-r--r--  1 emi  wheel  177049734 May  2 10:43 linuxito.zip

bzip2

Formato bzip2 a máxima velocidad:

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

El tiempo total transcurrido es de aproximadamente 41 segundos:

0.198u 0.404s 0:02.63 22.4%     72+175k 1+2153io 13pf+0w
37.977u 0.244s 0:38.44 99.4%    40+177k 1+1319io 1pf+0w

Se ha utilizado un 94.4% de CPU en promedio.

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

emi@hal9000:/tmp/benchmark % ll linuxito.tar.bz 
-rw-r--r--  1 emi  wheel  170479889 May  2 10:46 linuxito.tar.bz2

gzip

Formato gzip a máxima velocidad:

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

El tiempo total transcurrido es de aproximadamente 6 segundos:

6.498u 0.259s 0:06.76 99.7%     45+168k 0+1342io 0pf+0w

Se ha utilizado un 99.7% de CPU en promedio.

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

emi@hal9000:/tmp/benchmark % ll linuxito.gz 
-rw-r--r--  1 emi  wheel  174396570 May  2 10:49 linuxito.gz

RAR

Formato RAR a mínima tasa de compresión:

rar a -m1 linuxito.rar -idq -r var/www/linuxito.com/

El tiempo total transcurrido es de aproximadamente 16 segundos:

14.737u 2.125s 0:16.30 103.3%   1866+941k 0+17965io 0pf+0w

Se ha utilizado un 103.3% de CPU en promedio.

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

emi@hal9000:/tmp/benchmark % ll linuxito.rar 
-rw-r--r--  1 emi  wheel  172816601 May  2 10:51 linuxito.rar

7-Zip

Formato 7z con LZMA a mínima tasa de compresión:

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

El tiempo total transcurrido es de aproximadamente 74 segundos:

73.311u 0.708s 1:14.20 99.7%    1138+233k 0+1211io 0pf+0w

Se ha utilizado un 99.7% de CPU en promedio (menos que a máxima compresión) y ha sido mucho más lento que a máxima tasa de compresión. Es un algoritmo inherentemente lento por su forma de trabajo.

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

emi@hal9000:/tmp/benchmark % ll linuxito.7z 
-rw-r--r--  1 emi  wheel  158335633 May  4 09:26 linuxito.7z

Por cierto, el manual de 7-Zip es una reverenda mierda, no tiene información y es necesario recurrir a sitios Web de terceros (lo cual es simplemente patético).

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.475u 1.039s 0:07.40 263.5%   1153+1525k 0+1261io 1pf+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

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 nuevamente los resultados en una tabla:

Algoritmo Tiempo (s) Tamaño (bytes) CPU (%) Uso de CPU (CPU * Tiempo)
ZIP 9.27 177049734 74.8 693.39
bzip2 41.07 170479889 94.4 3,877.00
gzip 6.76 174396570 99.7 673.97
RAR 16.30 172816601 103.3 1,683.79
7-Zip 74.20 158335633 99.7 7,397.74
ZPAQ 6.90 164622702 278.1 1,918.89

Conclusiones

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

Nuevamente, para determinar cuál es el mejor algoritmo de compresión (en lo que a velocidad respecta), elijo aquel que 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, el algoritmo que logra el mejor promedio entre tiempo, espacio y uso de CPU a máxima velocidad, es gzip (por una mínima diferencia respecto a ZIP). En definitiva, comparando los resultados de ambos experimentos, se deduce que ZIP y gzip son los mejores algoritmos trabajando a máxima tasa de compresión y máxima velocidad, cuando se analiza el costo (tiempo y uso de CPU promedio) implicado para alcanzarlos.


Tal vez pueda interesarte


Compartí este artículo