Páginas

domingo, 29 de agosto de 2021

34. Benchmark de Compressores no Linux - Round 2... Fight!


Dando sequência ao post anterior, quando realizei um benchmark entre diversos compressores no Linux, decidi fazer um segundo teste , mas desta vez apenas com os meus "eleitos" vencedores naquele post: ZIP, GZIP, ZSTD, BZIP2, BROTLI, XZIP e 7ZIP.

O arquivo escolhido para ser compactado e descompactado foi o código-fonte do kernel 5.13.12 do Linux. Como todos sabem, ele é essencialmente um monte de arquivos texto. Ele foi escolhido para dar uma outra perspectiva desses compressores. Será que eles se saem diferente?

Os testes foram realizados na mesma máquina: Ryzen 5 1600 AF (12 threads!) e num SSD M.2 com leitura e gravação altíssima. A diferença é que os testes foram realizados alternadamente com multithreading ("MT") habilitado e desabilitado. Isso permite comparar melhor aqueles pogramas que possuem MT com aqueles que não possuem.

Resultados

(*) na coluna tamanho, o resultado está em "por mil", isto é, 100% multiplicado por 10. Sendo 1000 (100%) o valor atribuído ao arquivo sem compressão, apenas arquivado pelo TAR.

Todos tiveram um bom desempenho, reduzindo em mais de 78% o tamanho do arquivo. O interessante deste resultado é que as posições se mantiveram:

7z > Xz > Brotli (6-8) > Bzip2 > Zstd (3-9) > Gzip > Zip

Em parêntesis o nível de compressão. Reparem que nesse teste tanto Brotli quanto Zstd não foram testados em seu nível máximo (11 e 19, respectivamente). O nível de compressão padrão do Brotli é o máximo (11), mas como ele é estupidamente lento, optei por realizar o teste apenas nos níveis intermediários. Já o nível de compressão padrão do Zstd é apenas 3, e acima de 9 não há ganhos consideráveis de compressão, mas há uma perda sensível de velocidade de compressão, então limitei a 9.

Conclusões

Apesar da superioridade do 7zip sobre o xzip, observada tanto no teste anterior quanto no atual, a diferença de desempenho entre eles é insignificante: algo em torno de 2 a 3%, chegando a 5% no teste anterior, com arquivos diversos. Em arquivos grandes isso representa apenas uns poucos megabytes (Mb). A diferença dos tempos de compressão entre ambos é bem pequena quando se usa o MT, afinal 10 segundos não é nada! Existe uma diferença mais considerável quando o MT está desabilitado, sendo 40s maior para o XZ. Porém, o MT está disponível para ambos, sendo habilitado por padrão no 7Z. No XZ temos que usar a opção "-t0". Na descompressão, o XZ é apenas 3 segundos mais rápido em qualquer dos casos.

No Linux podemos usar o XZ sem receio, como ele usa o mesmo algoritmo do 7Z, o 7zip do Windows consegue descompactá-lo facilmente. Não é à toa que o kernel linux é distribuído no formato tar.xz. Lembro do tempo que era distribuído pelo bzip2, que gera arquivos quase 20% maiores, e estamos falando de 24 Mb de diferença!

Nos formatos de baixa compressão, a superioridade do gzip sobre o zip se mostrou mais evidente nesse teste onde arquivos textuais são usados. Foi mais de 20% de diferença (42 Mb)!

O Zstandard (ZSTD) é superior ao GZIP em tudo, exceto na popularidade. O BROTLI, que usa o mesmo algoritmo (LZ77), também supera o BZIP2 a partir do nível de compressão 7. O BZIP2 sempre usa o nível de compressão máximo (9). Porém, assim como o ZSTD, ele não é popular. Quero dizer, ele é bastante difundido na compressão em Web Servers, para conteúdo a ser descompactado por navegadores. Então ele não concorre com o BZIP2. Botei BROTLI e ZSTD nesse teste apenas por curiosidade minha.

Adendo

Esse adendo é posterior ao teste acima. Realizei, por curiosidade, a compressão e descompressão do kernel linux com o Brotli no nível de compressão padrão (-q 11). Usei o kernel 5.13.13, pois o 5.13.12 não estava mais disponível, porém a diferença de tamanho entre eles é de apenas 10.752 bytes, isto é, 11 Kb. Os resultados:

$ time tar -I brotli -cvf linux.tar.br linux-5.13.13/

Tempo de compressão: 1.819,614 (30 min e 19 seg!)

Tamanho do arquivo compactado: 121.484.145 bytes (tamanho "por mil" = 111, ou 11,1% do tamanho original)

$ time brotli -d linux.tar.br

Tempo de descompressão: 2,076 segundos

Foi o melhor resultado, mas esperar meia hora pra compactar não compensa.

Os níveis 9 e 10 também foram testados:

 9 :  134,776s : 1,976s : 128 por mil
10 :  802,547s : 2,193s : 124 por mil
11 : 1819,614s : 2,076s : 111 por mil

Também acabei testando o ZPAQ (nível de compressão 3, o padrão é 1), que usa o mesmo algoritmo (LZ77) do BROTLI e do ZSTD, mas possui a vantagem de ter suporte a MT na compressão e na descompressão. É evidente que a descompressão dele é péssima, mas ele é mais recomendado para backups de HD.

$ time zpaq a linux.zpaq linux.tar -m3

 3 : 56,384s : 57,359s : 114 por mil

Conclusões do Adendo


Se você for usar o BROTLI para um propósito diferente do qual ele foi concebido (arquivar sites para enviá-los aos visitantes compactados, e serem rapidamente descompactados, agilizando o carregamento da página), então é melhor limitar ao nível de compressão 9.

Porém, mantendo um nível de compressão próximo ao do BROTLI -11 (111/mil), mas com tempos de compressão equivalentes ao BROTLI -7 (por volta de 50-60s), seria melhor usar o ZPAQ -m3 (114/mil) em vez do BROTLI com esse propósito.

Qualquer que seja sua escolha, frise-se que ambos perdem para o XZIP!

É melhor deixar BROTLI para sites, ZPAQ para backups de HD (no nível padrão -m1 mesmo, porque ele é rápido e incremental) e XZIP para arquivos em geral.

Nenhum comentário:

Postar um comentário