Comparando algorítimos de compressão na prática: LZMA, LZMA2, PPMd, BZip2, RAR, RAR5 e ZIP.


Frequentemente tenho que realizar backups de arquivos grandes, normalmente os arquivos ficam muito tempo armazenados e raramente são acessados então a minha preocupação com esse arquivos é com armazenamento e não com tempo de acesso. Por isso eu sempre comprimi os arquivos de backup, minha ferramenta favorita para isso é o 7-zip por ser leve, opensource, permitir a divisão em multiplos arquivos (que evita problemas com alguns sistemas de arquivos) e usa algoritmos de compressão que possuem clientes em todas as plataformas, então eu sei que vou poder abrir os arquivos em qualquer computador que eu tenha à disposição quando precisar.

O 7-zip abre diversos tipos de arquivos mas para comprimir ele oferece 4 algoritmos além do ZIP: LZMA, LZMA2, PPMd e BZip2. Embora eu conheça os algoritmos e use eles o tempo todo eu não tinha certeza de qual teria o melhor resultado e se a diferença no tempo de compressão seria muito grande, procurei no Google por um comparativo rápido para consulta, achei que seria fácil encontrar um teste feito em condições controladas com gráficos, mas não foi, até achei algumas comparações mas elas não cobriam todos esses algoritmos, eram em sua maioria comparativos do 7-zip com o WinRAR, então eu decidi fazer eu mesmo esse comparativo e escrever esse artigo para que outras pessoas com a mesma duvida encontre a resposta de forma rápida.

Condições do teste

Eu queria que o teste fosse feito em condições normais de uso, não criei um ambiente especifico para o teste nem arquivos específicos, utilizei arquivos que realmente precisava comprimir e tentei minimizar a interferência de fatores externos fechando todos os programas e desabilitando serviços não essenciais ao processo. O teste foi realizado em um Intel i7 920 (1ª geração, 8 Threads, clock padrão 2,6GHz) rodando em overclock a 4Ghz com 12GB de RAM, pela quantidade de memória disponível versus a utilizada pelo programa acredito que não houve necessidade de paginação.
Para minimizar a influencia do IO e atrasos de disco utilizei dois discos diferentes do disco em que o SO está instalado, coloquei os arquivos de origem em um e mandei o 7-zip gerar os arquivos em outro, antes de começar o processo formatei os dois discos para que não houvesse fragmentação de dados.
Como o objetivo é obter o menor arquivo utilizei todos os algoritmos no presset Ultra do 7zip, sem alterar configuração de tamanho de dicionario ou numero de threads, deixando as opções como o 7-zip determinou serem as melhores. Por fim adicionei os resultados com a compressão em ZIP pelo 7-zip e em RAR e RAR5 pelo WinRAR para comparações.

Os testes foram realizados com 5 pacotes de arquivos de diferentes tipos:
Teste 1: Pasta de arquivos de projeto de websites contendo código imagens e logs de SVN. Arquivos: 69.305, tamanho: 12,2 GB (13.129.809.842 bytes)
Teste 2: Pasta com videos retirados diretamente de várias câmeras diferentes, sem conversão ou compressão. Arquivos: 111, tamanho: 28,8 GB (31.021.332.937 bytes)
Teste 3: Pasta com musicas, arquivos mp3. Arquivos: 3.224, tamanho: 33,2 GB (35.752.850.553 bytes)
Teste 4: Arquivo de texto gerado a partir de um sequência de caracteres aleatórios, 10,0 GB (10.737.418.240 bytes)
Teste 5: Arquivo de texto gerado com palavras aleatórias em inglês,8,71 GB (9.359.180.361 bytes)

O tempo de execução de cada algoritmo foi determinado por um script PowerShell com base na data de criação e escrita dos arquivos.

Resultados em tamanho (menor = melhor)

Tamanho dos arquivos

Teste 1 Teste 2 Teste 3 Teste 4 Teste 5 Media
BZip2 50.85% 97.05% 96.70% 75.17% 32.02% 70.36%
LZMA 36.68% 95.04% 97.11% 76.62% 30.07% 67.10%
LZMA2 37.15% 94.28% 96.86% 76.46% 30.11% 66.97%
PPMd 46.19% 95.58% 97.19% 76.52% 24.14% 67.92%
RAR 50.31% 96.65% 96.74% 77.13% 32.42% 70.65%
RAR5 47.08% 95.53% 96.71% 77.42% 33.41% 70.04%
ZIP 56.81% 97.90% 96.75% 75.09% 42.37% 73.78%

Resultados em tempo de compressão (menor = melhor)

Tempo de compressão

Tempo em segundos para compressão

Teste 1 Teste 2 Teste 3 Teste 4 Teste 5
BZip2 10823 7178 17166 4422 3436
LZMA 7508 12048 14611 8594 8546
LZMA2 5411 8635 4811 5291 4658
PPMd 5328 25657 26004 11844 5329
RAR 1763 5688 2072 5938 6424
RAR5 3500 3316 11084 991 2527
ZIP 8518 13961 4241 6528 13991

Tempo de execução em percentagem (assumindo o maior como 100%)

Teste 1 Teste 2 Teste 3 Teste 4 Teste 5
BZip2 100.00% 27.98% 66.01% 37.34% 24.56%
LZMA 69.37% 46.96% 56.19% 72.56% 61.08%
LZMA2 50.00% 33.66% 18.50% 44.67% 33.29%
PPMd 49.23% 100.00% 100.00% 100.00% 38.09%
RAR 16.29% 22.17% 7.97% 50.14% 45.92%
RAR5 32.34% 12.92% 42.62% 8.37% 18.06%
ZIP 78.70% 54.41% 16.31% 55.12% 100.00%

Resultados em velocidade de compressão (maior = melhor)

(MBps)

Velocidade de compressão

Teste 1 Teste 2 Teste 3 Teste 4 Teste 5
BZip2 0.59 4.00 1.92 1.74 0.83
LZMA 0.61 2.33 2.27 0.91 0.31
LZMA2 0.86 3.23 6.86 1.48 0.58
PPMd 1.09 1.10 1.27 0.66 0.40
RAR 3.57 5.03 15.92 1.33 0.45
RAR5 1.68 8.52 2.98 8.00 1.18
ZIP 0.84 2.07 7.78 1.18 0.27

Conclusão

LZMA e LZMA2 resultaram nos menores arquivos, tendo LZMA2 um resultado em tempo muito melhor, vale dizer que LZMA2 fez uso das 8 threads disponíveis do processador enquanto LZMA se limitou a apenas uma.

RAR, RAR5 e ZIP obtiveram os melhores resultados em tempo mas também as menores taxas de compressão.

PPMd obteve os piores resultados em termos de tempo.

Se você ainda usa o WinRAR mude para o 7zip (também abre RAR): http://www.7-zip.org/