gzip vs bzip2 vs xz vs zstd - Escolhendo um Formato de Compressão
Qual dos Quatro Você Deve Escolher?
Conclusão: Na dúvida, use zstd - o melhor equilibrio entre velocidade, taxa, e threading. Use gzip para compatibilidade, xz para taxa máxima; bzip2 quase não tem razão para uso novo.
Ao comprimir arquivos no Linux, gzip, bzip2, xz e zstd são as quatro opções padrão. Todos se combinam com tar, mas diferem muito em taxa de compressão, velocidade de compressão, velocidade de descompressão e suporte a paralelismo.
Tabela de referência rápida
| Formato | Extensão | Taxa | Compressão | Descompressão | Em uma frase |
|---|---|---|---|---|---|
| gzip | .gz |
Baixa | Rápida | Rápida | O rei da compatibilidade |
| bzip2 | .bz2 |
Média | Lenta | Lenta | Geração antiga, em declinio |
| xz | .xz |
Alta | Mais lenta | Média | Focado em taxa |
| zstd | .zst |
Média-Alta | Rápida | Mais rápida | O padrão moderno |
Premissas (ambiente alvo)
- Uma distribuição Linux comum (Ubuntu / família RHEL, etc.)
zstdpode não estar instalado em sistemas mais antigos (apt install zstd/dnf install zstd)
O Que Torna Cada Formato Diferente?
Conclusão: gzip usa DEFLATE (rápido, ubiquo), bzip2 usa BWT (taxa média mas lento), xz usa LZMA2 (taxa mais alta), e zstd é rápido com ampla faixa de ajuste.
gzip - O Padrão de Compatibilidade
gzip usa DEFLATE (LZ77 + codificação Huffman). Existe desde 1992 e está instalado em quase todos os lugares. Sua taxa é a mais baixa dos quatro, mas é rápido e descomprime em qualquer lugar. Do HTTP Content-Encoding: gzip em diante, é o padrão de fato para formatos de distribuição.
bzip2 - O Veterano BWT
bzip2 é compressão por ordenação de blocos baseada na Transformada de Burrows-Wheeler (BWT). Comprime melhor que gzip, mas tanto a compressão quanto a descompressão são lentas. Costumava ser a opção "menor que gzip", mas hoje perde para xz e zstd tanto em taxa quanto em velocidade, então quase não há razão para escolhê-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 compressão mais alta dos quatro. Em troca, é o mais lento para comprimir e usa muita memória em níveis altos. Se encaixa em casos de uso comprima uma vez, distribua muitas vezes (fontes do kernel, pacotes de distros, etc.).
zstd - O Padrão Moderno
zstd (Zstandard) é um formato relativamente novo com excelente equilibrio entre velocidade e taxa. Atinge uma taxa maior que gzip em velocidades similares ao gzip, e em níveis altos se aproxima do xz. Sua descompressão muito rápida é uma grande vantagem, e está sendo cada vez mais adotado pelo kernel Linux, btrfs e vários gerenciadores de pacotes.
Como Taxa e Velocidade se Comparam?
Conclusão: Taxa é xz >= zstd(nível alto) > bzip2 > gzip. Velocidade de descompressão é zstd > gzip > xz > bzip2. zstd sozinho cobre "rápido e razoavelmente pequeno."
A compressão fundamentalmente opera no tradeoff "menor significa mais lento". As tendências gerais:
- Taxa:
xzé a mais alta.zstdse aproxima do xz em níveis altos.bzip2é médio,gzipé o mais baixo - Velocidade de compressão:
gzipezstd(níveis baixos a médios) são rápidos.bzip2é lento,xzé o mais lento - Velocidade de descompressão:
zstdé o mais rápido.gziptambém é rápido.xzé médio,bzip2é o mais lento
O que mais importa é a velocidade de descompressão. Você comprime uma vez, mas a descompressão roda muitas vezes no destino. Se você extrai repetidamente em muitos servidores ou no CI, a descompressão rápida do zstd compensa diretamente.
Números reais variam muito por tipo de dado (texto / binário / já comprimido) e CPU. A única resposta correta é fazer benchmark nos seus próprios dados representativos. Meça 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 Você Deve Escolher?
Conclusão: 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 decisão é simples.
- Precisa descomprimir de forma confiável no outro lado? (sistemas antigos, compartilhamento)
-> gzip (
.gzextrai em qualquer lugar) - Quer economizar cada último byte? (arquivamento, armazenamento de longo prazo, muitos downloads) -> xz (lento para comprimir mas menor)
- Todo o resto (backups, logs, trabalho diário) -> zstd (rápido, comprime bem, mais rápido para descomprimir)
- Você recebeu um
.bz2ou tem ativos legados -> descomprima com bzip2 (não use para compressão nova)
Orientação em uma linha
- Na dúvida,
zstd - "Entregando para alguém" ->
gzip - "O menor possível" ->
xz
Quais São os Comandos Básicos?
Conclusão: Todos os quatro compartilham o mesmo padrão:
cmd arquivopara comprimir,cmd -d arquivo.extpara descomprimir, e-kpara manter o original.
Compressão e descompressão de arquivo único seguem convenções quase idênticas 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 padrão. Adicione -k (keep) para mantê-lo. zstd faz o oposto - ele mantém o original por padrão, então adicione --rm se quiser removê-lo. O comportamento é invertido, então tenha cuidado.
Para inspecionar o conteúdo 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 Níveis e Multithreading?
Conclusão: Todos usam
-1a-9para níveis (maior significa menor mas mais lento). xz e zstd suportam-T0para comprimir em paralelo em todos os núcleos da CPU, reduzindo o tempo substancialmente.
Níveis de compressão
Números mais altos comprimem mais mas rodam mais devagar. Padrões típicos:
gzip:-1a-9, padrão-6bzip2:-1a-9, padrão-9(tamanho do bloco)xz:-0a-9, padrão-6zstd:-1a-19, padrão-3. Você pode ir além até o máximo 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 não suportam paralelismo, mas implementações paralelas compatíveis existem. Instale pigz (gzip paralelo) e pbzip2 / lbzip2 para usar todos os núcleos mantendo o formato .gz / .bz2.
Como Combinar Com tar?
Conclusão:
tartem atalhos-z(gzip),-j(bzip2) e-J(xz). Para zstd, use--zstd, ou o pratico-a(caf) que detecta automaticamente pela extensão.
Empacotar múltiplos arquivos (tar) e compressão são passos separados. Especifique o formato de compressão via opções 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 extensão (-a)
Com o -a (--auto-compress) do tar, o tar escolhe o formato pela extensão do arquivo de saída. Mude de formato sem reaprender as opções (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 não-GNU) pode não 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 -