.NET 11 adiciona compressão Zstandard nativa ao System.IO.Compression
.NET 11 Preview 1 entrega ZstandardStream, ZstandardEncoder e ZstandardDecoder no System.IO.Compression, oferecendo suporte zstd rápido e integrado sem pacotes de terceiros.
Desenvolvedores .NET que precisaram de compressão Zstandard contaram com wrappers de terceiros como ZstdSharp ou ZstdNet por anos. A partir do .NET 11 Preview 1, isso muda: System.IO.Compression agora entrega ZstandardStream, ZstandardEncoder e ZstandardDecoder como APIs de primeira classe, sem desvios por NuGet.
Por que Zstandard importa
Zstandard (zstd), desenvolvido pela Meta, fica em um ponto doce entre velocidade e taxa. Benchmarks internos da equipe .NET mostram que ele comprime 2-7x mais rápido que Brotli e Deflate em qualidade equivalente, e descomprime 2-14x mais rápido no nível mais rápido. Para payloads HTTP, envio de log, ou serialização binária, essa lacuna é significativa.
Compressão em streaming em cinco linhas
A API espelha BrotliStream e GZipStream, então o caminho de migração é familiar:
using System.IO.Compression;
await using var input = File.OpenRead("dump.json");
await using var output = File.Create("dump.json.zst");
await using var zstd = new ZstandardStream(output, CompressionMode.Compress);
await input.CopyToAsync(zstd);
A descompressão é a imagem espelhada: envolva o stream de entrada e leia.
await using var compressed = File.OpenRead("dump.json.zst");
await using var zstd = new ZstandardStream(compressed, CompressionMode.Decompress);
await using var output = File.Create("dump.json");
await zstd.CopyToAsync(output);
Controle fino com ZstandardEncoder
Quando você precisar definir níveis de compressão ou usar dicionários treinados, desça para ZstandardEncoder:
using var encoder = new ZstandardEncoder(compressionLevel: 6);
Span<byte> source = GetPayload();
Span<byte> destination = new byte[ZstandardEncoder.GetMaxCompressedLength(source.Length)];
encoder.TryCompress(source, destination, out int bytesWritten);
Os níveis de compressão vão de 1 (mais rápido) a 22 (saída menor). O nível 3, o padrão, já supera as taxas do Deflate para a maioria das cargas de trabalho. ZstandardDictionary permite treinar com amostras representativas para taxas ainda melhores em payloads pequenos e repetitivos como respostas de API ou linhas de log.
HttpClient ganha descompressão Zstd automática
DecompressionMethods agora inclui um membro Zstandard, então optar pela descompressão HTTP transparente é uma única flag:
var handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.Zstandard
};
var client = new HttpClient(handler);
Se o servidor enviar uma resposta Content-Encoding: zstd, o handler a descomprime antes que seu código veja o stream.
O que experimentar agora
Instale o .NET 11 Preview SDK, mire net11.0, e troque um dos seus sites de chamada existentes de BrotliStream ou GZipStream para ZstandardStream. Meça o throughput e o tamanho comprimido: os números tendem a falar por si.
A superfície completa da API, incluindo ZstandardCompressionOptions para ajuste de tamanho de janela, está documentada na Microsoft Learn.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.