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.
Fuente: linuxito