>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
C

Como acelerar a compressão de dados em quatro vezes sem reescrever código

Por que mudar algo que funciona desde os anos noventa

A biblioteca zlib original surgiu há trinta anos. Mark Adler e Jean-Loup Gailly criaram uma ferramenta incrivelmente confiável e portátil. Ela funciona em quase todos os lugares, de smartwatches a sistemas operacionais legados. Mas essa universalidade tem um preço.

Para manter a compatibilidade com compiladores antigos e ambientes de 16 bits, o código do zlib precisa carregar consigo um monte de gambiarras. Está cheio de verificações de limite de memória e macros para suportar processadores arcaicos. Por esse motivo, novas otimizações para instruções vetoriais feitas por desenvolvedores modernos simplesmente não puderam ser incorporadas ao repositório principal. Mark Adler mantém um alto padrão de estabilidade, e sua abordagem é compreensível.

Foi então que Hans Christian Rosbach (Dead2) decidiu compilar os patches acumulados da comunidade em um único fork. Foi assim que o projeto zlib-ng nasceu.

O que mudou dentro do zlib-ng

A ideia do fork é simples: remover o código legado antigo e aplicar instruções vetoriais de CPUs modernos. Os desenvolvedores pegaram patches da Intel e da Cloudflare, removeram exemplos dos anos noventa e reescreveram algoritmos-chave em C11.

Os resultados foram tangíveis. Na arquitetura x86-64, compressão e descompressão funcionam aproximadamente quatro vezes mais rápido que o zlib padrão.

O que impulsiona esse ganho de desempenho:

  • Instruções vetoriais para diferentes arquiteturas. AVX2, AVX-512, SSSE3 para x86, NEON para ARM, bem como unidades vetoriais para POWER, RISC-V, LoongArch e IBM Z são utilizadas.
  • Detecção automática de capacidades da CPU em tempo de execução. O binário compilado em si sabe quais funções vetorizadas chamar em um processador específico.
  • Algoritmos deflate rápidos. O trabalho da Intel em otimização de busca de repetições, deslocamento de hash e cálculo de CRC32 é utilizado.
  • Acesso não alinhado seguro. Leitura e escrita de memória não alinhada é otimizada junto com um buffer de bits atualizado.

Ao mesmo tempo, o projeto não tenta quebrar o mundo existente. A biblioteca pode ser compilada com uma API totalmente compatível com o zlib padrão, ou você pode usar sua própria API nativa atualizada.

Como compilar e testar você mesmo

O projeto possui dois sistemas de build: CMake e o bom e velho configure.

Se você usa CMake, o build é familiar:

O parâmetro habilita o modo de compatibilidade total com o zlib clássico. A saída é uma biblioteca que pode ser substituída pelo do sistema.

Para os fãs do familiar processo de build não é diferente:

Se você usa o gerenciador de dependências vcpkg, não precisará buscar as fontes manualmente:

Acelerando aplicações com LD_PRELOAD

Um dos truques mais interessantes com o zlib-ng é acelerar software existente sem alterar seu código. Se seu programa faz link dinâmico com , você pode substituir a biblioteca em tempo de execução.

Aqui está como iniciar um utilitário com uma substituição temporária:

A aplicação imediatamente utiliza as instruções vetoriais do seu processador sem nenhuma alteração no binário.

No entanto, os autores do fork alertam especificamente no README: não tente substituir o do sistema no nível de distribuição nos diretórios do Linux. Se algo der errado ou uma incompatibilidade rara aparecer, todo o sistema vai travar, incluindo serviços do sistema. É mais seguro instalar o fork em um diretório separado como e fazer o link explicitamente.

Quão bem o código é coberto por testes

O código responsável pela compressão de dados deve funcionar sem falhas. Perder até mesmo um único bit transformará um arquivo em lixo. Os autores do zlib-ng levam os testes a sério.

O repositório emprega um conjunto abrangente de verificações:

  • Sanitizers de memória e fuzzing via OSS-Fuzz.
  • CI nativo e emulado via QEMU para ARM, PowerPC, RISC-V, SPARC64 e S390x.
  • Testes unitários baseados no Google Test.
  • Medições de desempenho usando o Google Benchmark.

Graças ao fuzzing contínuo, a biblioteca mantém um alto nível de confiabilidade, o que é crítico ao substituir componentes principais do sistema.

Quem se beneficiaria do zlib-ng

Antes de mais nada, o fork será útil para equipes onde a compressão e descompressão de dados se tornaram um gargalo. Se você está processando gigabytes de logs, trabalhando com servidores web como nginx, comprimindo texturas no desenvolvimento de jogos, ou processando enormes quantidades de dados no backend, o zlib-ng oferecerá um aumento perceptível de velocidade.

Por outro lado, se seu software roda em microcontroladores antigos de 16 bits ou sistemas operacionais exóticos de três décadas, não faz sentido mexer no zlib original comprovado. O fork foi criado especificamente para plataformas modernas.

A ferramenta parece madura e é mantida ativamente pela comunidade. Se você precisa do máximo desempenho DEFLATE e gzip em hardware moderno, vale a pena dedicar algumas horas e executar benchmarks com seus dados.

Projetos relacionados