4 pontos por GN⁺ 2025-03-17 | 1 comentários | Compartilhar no WhatsApp
  • zlib-rs é uma implementação de zlib em Rust para compressão de dados, e a recente versão 0.4.2 foi lançada com grandes melhorias de desempenho
  • Atualmente é a implementação de zlib compatível com API mais rápida, com destaque especial para o desempenho de descompressão, superior ao de produtos concorrentes
  • Principais melhorias de desempenho: seleção automática, em tempo de execução, da melhor implementação SIMD, aplicação de otimizações de DFA etc.

Multiversionamento (Multiversioning)

  • Em tempo de execução, seleciona automaticamente a versão de função mais rápida de acordo com a CPU
  • No Rust, não há suporte nativo a multiversionamento, então isso precisa ser implementado manualmente
  • Oferece desempenho ideal minimizando o overhead em tempo de execução do código

Otimização de DFA (Deterministic Finite Automata)

  • A linguagem C melhora o desempenho usando fallthrough implícito em instruções switch
  • No Rust, não existe um mecanismo semelhante, o que causa perda de desempenho
  • Aplicação da opção -Cllvm-args=-enable-dfa-jump-thread do LLVM → recuperação de desempenho
  • Ainda não faz parte da configuração padrão do LLVM, mas deve ser ativada por padrão no Rustc no futuro

Comparação de desempenho em benchmark

1. Comparação de desempenho com zlib-ng

  • zlib-rs apresenta desempenho mais rápido que o zlib-ng na maioria dos tamanhos de entrada
  • Em especial, é cerca de 10% mais rápido com entrada de 1 KB e cerca de 6% mais rápido com entrada de 65 KB
  • Fica ligeiramente atrás nos menores tamanhos de entrada, mas em geral mantém vantagem de desempenho

Por exemplo:

  • Quando o tamanho de entrada é de 4 bytes, o zlib-ng é ligeiramente mais rápido, mas isso tem pouco impacto no uso real
  • Quando o tamanho de entrada é de 1 KB, o zlib-rs é cerca de 10% mais rápido
  • Quando o tamanho de entrada é de 65 KB, o zlib-rs é cerca de 6% mais rápido

→ Vantagem clara de desempenho sobre o zlib-ng em chunks grandes

2. Comparação de desempenho com zlib-chromium

  • Em chunks pequenos, o zlib-chromium é mais rápido
  • Mas em chunks grandes, o zlib-rs leva vantagem
  • Em entradas de tamanho comum, o zlib-rs oferece melhor desempenho

Por exemplo:

  • Quando o tamanho de entrada é de 4 bytes, o zlib-chromium é cerca de 12% mais rápido
  • Quando o tamanho de entrada é de 16 bytes, o zlib-chromium é cerca de 6% mais rápido
  • Quando o tamanho de entrada é de 1 KB ou mais, o zlib-rs tem vantagem de desempenho

→ zlib-rs tem vantagem de desempenho em tamanhos comuns

Comparação de desempenho de compressão

  • O desempenho de compressão está melhorando, mas os resultados ainda são mistos
  • Melhoria de 6% no nível de compressão padrão (6) e melhoria de 13% no nível máximo de compressão (9)
  • Em outros níveis de compressão, o zlib-ng ainda é mais rápido

Por exemplo:

  • No nível de compressão 6, o zlib-rs é cerca de 6% mais rápido que o zlib-ng
  • No nível de compressão 9, o zlib-rs é cerca de 13% mais rápido que o zlib-ng
  • Mas nos níveis de compressão 1 a 4, o zlib-ng leva vantagem

Conclusão

  • zlib-rs tem vantagem de desempenho em descompressão sobre zlib-ng e zlib-chromium
  • O desempenho de compressão ainda está em evolução, mas já mostra ganhos significativos nos principais níveis de compressão
  • Pode ser usado tanto em projetos Rust quanto C
    • Rust → usar a flag zlib-rs no crate flate2
    • C → pode ser usado após compilação como biblioteca dinâmica

1 comentários

 
GN⁺ 2025-03-17
Comentários do Hacker News
  • Percebi que já sei Rust

    • Achei que o objetivo do Rust fosse segurança, mas esta biblioteca usa bastante a palavra-chave unsafe
    • Fico me perguntando em que ponto a diferença entre C e Rust deixa de ter significado
    • Se usar assembly inline, ambas as linguagens podem gerar o mesmo código de máquina
    • Fico curioso se o compilador de Rust otimiza melhor que o compilador de C
  • “Mais rápido que C” acaba se resumindo a design, implementação, algoritmo etc.

    • Pode ser mais rápido do que implementações já existentes, mas a afirmação “mais rápido que C” soa estranha
  • zippy em Nim afirma ser de 1,5x a 2x mais rápido que zlib

    • Também existem versões de zlib em C que são mais rápidas que a instalação padrão
    • zlib é antiquado hoje em dia, mas ainda continua popular
    • É usado como base para formatos novos mais amigáveis a paralelismo
  • Fico curioso se o desempenho do Rust tem a ver com o próprio Rust ou se é só uma versão mais otimizada do que outras implementações em C

    • Há casos, como ordenação, em que C++ apresenta desempenho consistentemente melhor que C
    • Fico me perguntando se existe algo parecido entre Rust e C
  • O Chromium usa zlib por causa de algoritmos presentes no padrão

    • Escolher algoritmos melhores pode trazer desempenho melhor
    • Zstandard é mais rápido e também comprime melhor
    • LZ4 é muito mais rápido, mas o tamanho não fica tão pequeno
  • Zstandard e digest blake3 são permitidos

  • É mais correto dizer que Rust é tão rápido quanto C

    • Ainda assim é uma grande conquista
  • Qual biblioteca compila mais rápido

    • Qual biblioteca tem menos dependências
    • Se o tamanho de cada biblioteca é o mesmo, e qual é menor
  • Usuários de Rust gostam de comparar Rust e C, mas usuários de C raramente comparam C e Rust

  • Ao lidar com linguagens de sistema compiladas, a linguagem quase não afeta a velocidade

    • Uma versão otimizada pode facilmente ser mais de 100x mais rápida ao controlar alocações, usar bons padrões de acesso à memória e usar SIMD e multithreading
    • Só um acesso melhor à memória já pode tornar um programa mais de 20x mais rápido
  • O significado é que a implementação é mais rápida do que em C

    • Não existe isso de “mais rápido que C”