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.)
zstdpode 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:
xze a mais alta.zstdse aproxima do xz em niveis altos.bzip2e medio,gzipe o mais baixo - Velocidade de compressao:
gzipezstd(niveis baixos a medios) sao rapidos.bzip2e lento,xze o mais lento - Velocidade de descompressao:
zstde o mais rapido.gziptambem e rapido.xze medio,bzip2e 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}; \
doneComo 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.
- Precisa descomprimir de forma confiavel no outro lado? (sistemas antigos, compartilhamento)
-> gzip (
.gzextrai em qualquer lugar) - Quer economizar cada ultimo byte? (arquivamento, armazenamento de longo prazo, muitos downloads) -> xz (lento para comprimir mas menor)
- Todo o resto (backups, logs, trabalho diario) -> zstd (rapido, comprime bem, mais rapido para descomprimir)
- Voce recebeu um
.bz2ou 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 arquivopara comprimir,cmd -d arquivo.extpara descomprimir, e-kpara 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
-1a-9para niveis (maior significa menor mas mais lento). xz e zstd suportam-T0para 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:-1a-9, padrao-6bzip2:-1a-9, padrao-9(tamanho do bloco)xz:-0a-9, padrao-6zstd:-1a-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:
tartem 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 -