Usar ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MAX)
leva a uma compressão improvável para fontes com sequências mínimas grandes (> 1kB).
Usando uma concatenação repetida de um CSS reduzido:
Com a configuração targetCBlockSize == ZSTD_TARGETBLOCKSIZE_MAX:
bootstrap.min.css : 97.31% (13862462 => 13488900 bytes, bootstrap.min.css.zst)
Sem definir targetCBlockSize:
bootstrap.min.css : 0.15% (13862462 => 20476 bytes, bootstrap.min.css.zst)
Observação adicional: encontrei isso como resultado da tentativa de reduzir o tamanho do bloco na descompactação em relação ao # 2093. Se, em vez de definir o TargetCompressedBlockSize, o próprio ZSTD_BLOCKSIZEMAX for reduzido, fazendo com que o tamanho máximo do bloco também seja reduzido, ele terá um impacto muito menor na compressão.
A fonte utilizada foi obtida através da seguinte sequência:
rm bootstrap.min.css; wget https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css && for i in {1..5}; do cat bootstrap.min.css >> bootstrap_2.min.css; cat bootstrap_2.min.css >> bootstrap.min.css; done && rm bootstrap_2.min.css
Vou fazer uma pergunta aqui com relação à arquitetura: targetCBlockSize faz com que o compressor presuma que será alimentado em um descompressor que não terá nenhum conhecimento fora do bloco que recebe? ou seja, é um descompressor de streaming totalmente sem buffer?
targetCBlockSize
"destina-se" a ser usado em cenários de streaming onde você deseja reduzir o tempo para descompactar o primeiro byte. Portanto, se o tamanho do seu pacote é de 4 KB, você pode definir o tamanho do bloco de destino para 4 KB e tentar tornar cada pacote descompressível, em vez de ter que esperar 128 KB completos antes de descompactar o primeiro byte.
Não tenho certeza do que está acontecendo neste cenário, mas com a entrada deve ser fácil de reproduzir e corrigir. Vou investigar isso em breve. Obrigado novamente pelo relatório e as instruções detalhadas de reprodução!
@dciliske Eu reproduzi o problema no nível 22. Ele não está presente no zstd-1.4.4, portanto, nunca foi lançado. Parece que apresentei em https://github.com/facebook/zstd/pull/1947. Vou consertar isso em breve.
Comentários muito úteis
@dciliske Eu reproduzi o problema no nível 22. Ele não está presente no zstd-1.4.4, portanto, nunca foi lançado. Parece que apresentei em https://github.com/facebook/zstd/pull/1947. Vou consertar isso em breve.