Páginas

terça-feira, 24 de agosto de 2021

33. Benchmark de Compressores no Linux


Decidi realizar um comparativo de diversos compressores de arquivos disponíveis no Linux Debian 11. Esses testes estão muito longe de serem científicos e precisos, servem apenas para comparação simples, mas ainda é um artigo útil!

O arquivo escolhido para ser compactado e descompactado foi uma pasta de instalação do jogo Ultima Online: Time of Legends, versão 7-0-87-11. É um jogo antigo, mas com uma boa variedade de formatos de arquivos: é uma pasta com 2,5 Gb contendo executáveis, textos, mp3, imagens etc.

Formatos como jpg, mp3, mp4, avi e muitos outros, já são formatos compactos, por isso a redução de tamanho quando comprimidos tende a ser nula, às vezes de apenas 2% com muita sorte. 

Os testes foram realizados num Ryzen 5 1600 AF (12 threads!) e num SSD M.2 com leitura e gravação altíssima. Os testes foram realizados com multithreading habilitado sempre que disponível!

Devo dizer que não foi um teste honesto pra muitos desses compressores. Isso porque alguns tinham suporte à paralelização (multithreading, ou apenas MT), podendo fazer uso de vários núcleos e acelerar tremendamente o trabalho. No Linux, o formato ZIP não tem suporte à MT (nem no "File Roller"), mas no Windows, o WinZip possui, assim como o WinRAR e o 7Zip! No Linux o formato 7z possui MT para comprimir, mas não para extrair, e o RAR possui em ambas as direções.

Por conta disso, nos testes abaixo, o GZIP parece se sair tremendamente bem quando comparado com os seus concorrentes naturais: ARJ, LZOP e ZIP. Mas isso só ocorre porque ele é o único no Linux com MT. E isso é feito através do uso do aplicativo pigz (tar -I pigz -cvf arquivo.tar.gz arquivos). Porque o GZIP em si não possui suporte a MT. Esse mesmo teste, quando realizado sem o MT, resultou num tempo de compressão de 110 segundos pro GZIP, ou seja, empate técnico com os demais. Usei também o pbzip2 para o BZIP2 e o plzip para o formato LZIP.

O que estiver em verde são os testes realizados fora do padrão do formato, isto é, usando níveis variados de compressão, geralmente o máximo (-9). Algumas exceções são o ZSTD que chega até 19 e o BROTLI que vai até 11 (sendo esse seu padrão). O BROTLI foi testado fora do padrão apenas. Comprimi em níveis 6 e 7 e já demorou muito, não quis perder tempo com a compressão nível 11. Na coluna de opções, o parêntesis "(def)" significa que o valor antes dele é o "default" do formato, isto é, o "padrão". Em colchetes está a variação mínima e máxima das opções de compressão disponíveis para aquele formato.

clique para ampliar!

Conclusões

Pequena Compressão

Na faixa dos formatos com Pequena Compressão (redução de cerca de -40%) e velocidade relativamente rápida para comprimir e extrair, temos o ARJ, LZOP, GZIP, RAR e o ZIP.

LZOP, apesar de incrivelmente veloz, é o pior de todos os testados. Reduz apenas 27,2% contra os 40% dos demais e os 47,4% do RAR!

ARJ não vale à pena. É um formato legacy (legado), herança das antigas BBS dos anos 1990/2000. Ele reduz o mesmo tanto, mas leva 50% mais tempo que os demais. E tem a desvantagem de não ser usado por mais ninguém e não ter suporte à MT. Pra piorar, o ARJ já está no nível máximo de compressão. Ele é o único caso invertido: quanto maior o nível, menor a compressão e maior a velocidade. 

RAR é o melhor deles, reduz 7,4% mais que os outros, com tempos equivalentes de compressão e extração. Ainda é possível encontrar arquivos para baixar nesse formato, mas ele ainda é pouco usado. E ele só vai apresentar ganhos sobre os demais em arquivos muito grandes! No nosso exemplo economizou 190 Mb em relação aos demais, mas isso pra comprimir uma pasta de 2.500 Mb! Ele é muito bom, mas não recomendo para uso cotidiano.

ZIP e GZIP são MUITO equivalentes, especialmente quando não tem MT. Quando há MT disponível (GZIP apenas), então o GZIP vence em disparada, porque comprime mais rápido (10x no caso). Vale à pena usar o tar.gz no Linux através do pigz para arquivos medianos e pequenos. Até porque os usuários do Windows conseguem abrir os tar.gz no WinZip! Use o ZIP apenas se o amiguinho do Windows insistir nisso.

Não vale à pena usar nenhum dos três na compressão máxima, pois não tem tanta diferença, mas os tempos de compressão aumentam muito!

Grande Compressão

Na faixa dos formatos com Grande Compressão (redução de -45 a -55%), com velocidades de compactação lentas e velocidades de extração medianas, temos: o RAR (de novo, ele é bom!), BZIP2, LZIP, XZ e 7Z.

BZIP2 é tão tradicional e eficiente! Reduziu em 45%, tem suporte total a MT através do pbzip2 e possui o melhor tempo de compressão! Sendo o tempo de extração bastante competitivo com os demais. É um formato para compressão de arquivos medianos, não muito grandes nem muito pequenos.

O LZIP, o XZ e o 7Z (de 7zip) são a mesma coisa, com poucas diferenças. Todos usam o mesmo algoritmo: o LZMA. O LZIP usa uma versão simplificada do LZMA, o 7zip introduziu o LZMA2, e o XZ é uma implementação do 7zip pro Linux. Todos os três possuem suporte a MT, mas penas o LZIP possui suporte à MT para extração e descompressão. A diferença de desempenho na redução dos arquivos foi muito pequena, e só apareceu porque o arquivo é muito grande. Em arquivos pequenos não faz diferença, mas eles serão usados em arquivos grandes com certeza! Então, nesse caso, onde compressão importa, a vitória é essa: 7Z > XZ > LZIP. Mesmo usando níveis de compressão máxima. Porém, se uma dezena de MB não é importante pra você, fique com o LZIP, porque o tempo de extração dele é 4 vezes mais rápido. O tempo de compressão deles é equivalente. O problema do LZIP é ser pouco difundido. O 7zip para Windows abre o 7Z e o XZ do Linux, mas não abre o LZIP. Se for compartilhar é melhor ficar com 7Z/XZ, ambos tem MT nativo sem necessidade de ferramentas externas (o LZIP precisa do plzip). O 7Z usa MT automaticamente, já o XZ precisa da opção "- T0" (não é a letra ô, mas sim zero). Use: "tar I 'xz - T0' -cvf arquivo.tar.xz arquivos".

Compressão e Descompressão Rápidas

Na faixa dos formatos de Compressão e Descompressão Rápidas (e redução acima de -40%), temos: BROTLI, LZOP, ZPAQ, ZSTD e, com ressalvas, o LZIP e o RAR.

BROTLI (. br) é um formato muito interessante! Foi introduzido em 2013 pelo Google! Ele foi desenvolvido tendo em mente servidores web. Foi criado para compactar Java script, HTML, css e afins (sites). O servidor compacta os dados e o seu navegador descompacta quando os recebe. Permite economia na largura de banda e agiliza o carregamento das páginas. Dito isso, o meu teste foi injusto porque esses tipos de dados usados não são o alvo do BROTLI. No entanto, dá pra ver que ele é muito superior ao GZIP e é absurdamente rápido para descompactar. Nos testes, ele descompactou 1,4 Gb em 8 segundos! Se considerarmos um site típico, estamos falando de milésimos de segundo. Porém, ele é lento para compactar, o que não é problema, pois os servidores web costumam ter um hardware mais parrudo. E olha que o nível de compressão padrão do BROTLI é 11, e eu só testei os níveis 6 e 7...

ZPAQ foi uma descoberta feliz. Pesquisando sobre compactação de dados achei esse formato que é muito ágil para compactar e descompactar e possui boa taxa de compressão. Ele é intencionalmente voltado para backup, porque é incremental. Imagina que você compacta seu HD. Leva um tempão, claro. E se tiver que fazer isso todo dia fodeu... Aí entra o ZPAQ, ele adiciona ao arquivo inicial de backup apenas o que foi alterado, agilizando muito o processo. Além disso ele cria índices dos arquivos compactados, que te permite extrair a versão de uma data específica do backup. É impressionante! Dito isso, é óbvio que ele não foi feito para competir com 7Z, XZ ou Lzip. E ainda possuí 5 níveis de compressão (sendo 1 o padrão) que podem ser usados por usuários comuns (1) ou por servidores (5). Veja que o 5 levou 25 minutos para comprimir e extrair. O nível 2 já está de bom tamanho para a maioria dos casos. Ele usa o mesmo algoritmo do Brotli: o LZ77.

ZSTD, abreviação de "Zstandard". É um formato feito para ser rápido. E bota rápido nisso. Além disso ele mantém uma taxa de compressão similar ao GZIP e seus rivais. O nível padrão é 3, podendo ir até 19! O mais interessante dele é que, enquanto o tempo de compressão aumenta conforme aumenta o nível de compactação, o tempo de descompactação não se altera, ficando na casa dos 6 segundos! Acho que ele também poderia ser usado para os mesmos fins do BROTLI... O que faz sentido, já que ambos fazem uso do algoritmo LZ77. 

LZOP é um formato falho, com uma taxa de compressão ridícula (27,2%), mas muito rápido. Infelizmente, em níveis de compressão elevada (-9), ele não consegue melhorar esse índice significativamente (apenas 36,2%) ficando abaixo do ZIP (compressão - 6) e, pra piorar, ele perde a sua velocidade de compressão, que era seu único atrativo. Fora que não é difundido.

LZIP só é rápido graças ao MT, e apenas na descompactação. Então ele não é bem dessa categoria, apenas coloquei para frisar essa virtude.

RAR tem as mesmas observações do LZIP, e é mais rápido que ele para comprimir. Um formato competente. Mesmo assim, LZIP e RAR não são formatos feitos para serem rápidos, e não se equiparam aos anteriores.

Essa categoria não tem um vencedor. Cada compressor foi criado para um propósito e possuem seu nicho.

Encerramento

Para finalizar, ficamos com os formatos clássicos: zip, gzip, bzip2, 7z e xz.

Nenhum comentário:

Postar um comentário