gzip vs bzip2 vs xz vs zstd - Escolhendo um Formato de Compressao

gzip vs bzip2 vs xz vs zstd - Escolhendo um Formato de Compressao

Qual dos Quatro Voce Deve Escolher?

Conclusao: Na duvida, use zstd - o melhor equilibrio entre velocidade, taxa, e threading. Use gzip para compatibilidade, xz para taxa maxima; bzip2 quase nao tem razao para uso novo.

Ao comprimir arquivos no Linux, gzip, bzip2, xz e zstd sao as quatro opcoes padrao. Todos se combinam com tar, mas diferem muito em taxa de compressao, velocidade de compressao, velocidade de descompressao e suporte a paralelismo.

Tabela de referencia rapida

Formato Extensao Taxa Compressao Descompressao Em uma frase
gzip .gz Baixa Rapida Rapida O rei da compatibilidade
bzip2 .bz2 Media Lenta Lenta Geracao antiga, em declinio
xz .xz Alta Mais lenta Media Focado em taxa
zstd .zst Media-Alta Rapida Mais rapida O padrao moderno

Premissas (ambiente alvo)

  • Uma distribuicao Linux comum (Ubuntu / familia RHEL, etc.)
  • zstd pode nao estar instalado em sistemas mais antigos (apt install zstd / dnf install zstd)

O Que Torna Cada Formato Diferente?

Conclusao: gzip usa DEFLATE (rapido, ubiquo), bzip2 usa BWT (taxa media mas lento), xz usa LZMA2 (taxa mais alta), e zstd e rapido com ampla faixa de ajuste.

gzip - O Padrao de Compatibilidade

gzip usa DEFLATE (LZ77 + codificacao Huffman). Existe desde 1992 e esta instalado em quase todos os lugares. Sua taxa e a mais baixa dos quatro, mas e rapido e descomprime em qualquer lugar. Do HTTP Content-Encoding: gzip em diante, e o padrao de fato para formatos de distribuicao.

bzip2 - O Veterano BWT

bzip2 e compressao por ordenacao de blocos baseada na Transformada de Burrows-Wheeler (BWT). Comprime melhor que gzip, mas tanto a compressao quanto a descompressao sao lentas. Costumava ser a opcao "menor que gzip", mas hoje perde para xz e zstd tanto em taxa quanto em velocidade, entao quase nao ha razao para escolhe-lo em trabalhos novos. Serve principalmente para descomprimir arquivos .bz2 existentes.

xz - O Campeao de Taxa

xz usa o algoritmo LZMA2 e entrega a taxa de compressao mais alta dos quatro. Em troca, e o mais lento para comprimir e usa muita memoria em niveis altos. Se encaixa em casos de uso comprima uma vez, distribua muitas vezes (fontes do kernel, pacotes de distros, etc.).

zstd - O Padrao Moderno

zstd (Zstandard) e um formato relativamente novo com excelente equilibrio entre velocidade e taxa. Atinge uma taxa maior que gzip em velocidades similares ao gzip, e em niveis altos se aproxima do xz. Sua descompressao muito rapida e uma grande vantagem, e esta sendo cada vez mais adotado pelo kernel Linux, btrfs e varios gerenciadores de pacotes.

Como Taxa e Velocidade se Comparam?

Conclusao: Taxa e xz >= zstd(nivel alto) > bzip2 > gzip. Velocidade de descompressao e zstd > gzip > xz > bzip2. zstd sozinho cobre "rapido e razoavelmente pequeno."

A compressao fundamentalmente opera no tradeoff "menor significa mais lento". As tendencias gerais:

  • Taxa: xz e a mais alta. zstd se aproxima do xz em niveis altos. bzip2 e medio, gzip e o mais baixo
  • Velocidade de compressao: gzip e zstd (niveis baixos a medios) sao rapidos. bzip2 e lento, xz e o mais lento
  • Velocidade de descompressao: zstd e o mais rapido. gzip tambem e rapido. xz e medio, bzip2 e o mais lento

O que mais importa e a velocidade de descompressao. Voce comprime uma vez, mas a descompressao roda muitas vezes no destino. Se voce extrai repetidamente em muitos servidores ou no CI, a descompressao rapida do zstd compensa diretamente.

Numeros reais variam muito por tipo de dado (texto / binario / ja comprimido) e CPU. A unica resposta correta e fazer benchmark nos seus proprios dados representativos. Meca com time e ls -l.

$ for c in gzip bzip2 xz zstd; do \
    echo "== $c =="; \
    time $c -k -9 -f sample.dat; \
    ls -l sample.dat.* ; rm -f sample.dat.{gz,bz2,xz,zst}; \
  done

Como Voce Deve Escolher?

Conclusao: Escolha gzip para compatibilidade, xz quando a economia de disco vem primeiro, e zstd para quase todo o resto. Use bzip2 apenas para descomprimir arquivos existentes.

O fluxo de decisao e simples.

  1. Precisa descomprimir de forma confiavel no outro lado? (sistemas antigos, compartilhamento) -> gzip (.gz extrai em qualquer lugar)
  2. Quer economizar cada ultimo byte? (arquivamento, armazenamento de longo prazo, muitos downloads) -> xz (lento para comprimir mas menor)
  3. Todo o resto (backups, logs, trabalho diario) -> zstd (rapido, comprime bem, mais rapido para descomprimir)
  4. Voce recebeu um .bz2 ou tem ativos legados -> descomprima com bzip2 (nao use para compressao nova)

Orientacao em uma linha

  • Na duvida, zstd
  • "Entregando para alguem" -> gzip
  • "O menor possivel" -> xz

Quais Sao os Comandos Basicos?

Conclusao: Todos os quatro compartilham o mesmo padrao: cmd arquivo para comprimir, cmd -d arquivo.ext para descomprimir, e -k para manter o original.

Compressao e descompressao de arquivo unico seguem convencoes quase identicas em todos os comandos.

# Comprimir (nota: o original e removido)
$ gzip  file.txt        # -> file.txt.gz
$ bzip2 file.txt        # -> file.txt.bz2
$ xz    file.txt        # -> file.txt.xz
$ zstd  file.txt        # -> file.txt.zst (original mantido)

# Comprimir mantendo o original (-k = keep)
$ gzip -k file.txt
$ xz   -k file.txt

# Descomprimir (-d = decompress)
$ gzip  -d file.txt.gz
$ xz    -d file.txt.xz
$ zstd  -d file.txt.zst

# Comandos dedicados de descompressao tambem existem
$ gunzip  file.txt.gz
$ bunzip2 file.txt.bz2
$ unxz    file.txt.xz
$ unzstd  file.txt.zst

gzip, bzip2 e xz deletam o original por padrao. Adicione -k (keep) para mante-lo. zstd faz o oposto - ele mantem o original por padrao, entao adicione --rm se quiser remove-lo. O comportamento e invertido, entao tenha cuidado.

Para inspecionar o conteudo sem escrever um arquivo descomprimido, use o -c de cada comando (para stdout) ou zcat / bzcat / xzcat / zstdcat.

$ zcat access.log.gz | grep 500
$ zstdcat backup.tar.zst | tar tf -

E Quanto a Niveis e Multithreading?

Conclusao: Todos usam -1 a -9 para niveis (maior significa menor mas mais lento). xz e zstd suportam -T0 para comprimir em paralelo em todos os nucleos da CPU, reduzindo o tempo substancialmente.

Niveis de compressao

Numeros mais altos comprimem mais mas rodam mais devagar. Padroes tipicos:

  • gzip: -1 a -9, padrao -6
  • bzip2: -1 a -9, padrao -9 (tamanho do bloco)
  • xz: -0 a -9, padrao -6
  • zstd: -1 a -19, padrao -3. Voce pode ir alem ate o maximo com --ultra -22
$ gzip -9 file        # compressao maxima
$ xz -9 file          # alta taxa (lento, mais memoria)
$ zstd -19 file       # maximo normal do zstd
$ zstd --ultra -22 file   # maximo absoluto do zstd

Multithreading (paralelismo)

Paralelismo ajuda em arquivos grandes.

$ xz   -T0 big.tar    # comprimir usando todos os nucleos
$ zstd -T0 big.tar    # comprimir usando todos os nucleos (0 = auto)

gzip e bzip2 em si nao suportam paralelismo, mas implementacoes paralelas compativeis existem. Instale pigz (gzip paralelo) e pbzip2 / lbzip2 para usar todos os nucleos mantendo o formato .gz / .bz2.

Como Combinar Com tar?

Conclusao: tar tem atalhos -z (gzip), -j (bzip2) e -J (xz). Para zstd, use --zstd, ou o pratico -a (caf) que detecta automaticamente pela extensao.

Empacotar multiplos arquivos (tar) e compressao sao passos separados. Especifique o formato de compressao via opcoes do tar.

# Criar (c = create, f = file)
$ tar czf archive.tar.gz   dir/   # gzip
$ tar cjf archive.tar.bz2  dir/   # bzip2
$ tar cJf archive.tar.xz   dir/   # xz
$ tar --zstd -cf archive.tar.zst dir/   # zstd

# Na extracao, o formato e detectado automaticamente
$ tar xf archive.tar.gz
$ tar xf archive.tar.zst

Detectar automaticamente pela extensao (-a)

Com o -a (--auto-compress) do tar, o tar escolhe o formato pela extensao do arquivo de saida. Mude de formato sem reaprender as opcoes (z / j / J).

$ tar caf archive.tar.zst dir/   # .zst -> zstd
$ tar caf archive.tar.xz  dir/   # .xz  -> xz
$ tar caf archive.tar.gz  dir/   # .gz  -> gzip

tar mais antigo (especialmente nao-GNU) pode nao suportar --zstd ou -a. Nesse caso, use um pipe.

$ tar cf - dir/ | zstd -T0 -o archive.tar.zst
$ zstd -dc archive.tar.zst | tar xf -

Resumo e Proximos Passos

  • Na duvida, zstd - o melhor equilibrio de velocidade, taxa, descompressao e threading
  • gzip para distribuicao e compatibilidade, xz para taxa maxima
  • bzip2 tem pouca razao para uso novo (apenas descomprimir .bz2 existentes)
  • Niveis vao de -1 a -9 (zstd -19 / --ultra -22); -T0 habilita paralelismo
  • Numeros dependem do ambiente. Faca benchmark nos seus proprios dados representativos antes de decidir

Proximas leituras: