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