Esta biblioteca propõe dois codificadores de entropia de alta velocidade:
Huff0 , um codec Huffman projetado para CPUs modernas, apresentando operações OoO (Out of Order) em múltiplas ALU (Unidades Lógicas Aritméticas), alcançando velocidades de compactação e descompactação extremamente rápidas.
FSE é um novo tipo de codificador de entropia, baseado na teoria ANS, de Jarek Duda, alcançando precisão de compressão precisa (como codificação aritmética) em velocidades muito mais altas.
Filial | Status |
---|---|
mestre | |
desenvolvedor |
Os benchmarks são executados em um Intel Core i7-5600U, com Linux Mint de 64 bits. O código-fonte é compilado usando GCC 4.8.4, modo de 64 bits. Os arquivos de teste são gerados usando o programa probagen
fornecido. O Benchmark divide os arquivos de amostra em blocos de 32 KB. Huff0
e FSE
são comparados ao zlibh
, o codificador huffman dentro do zlib, fornecido por Frederic Kayser.
Arquivo | Codec | Razão | Compressão | Descompressão |
---|---|---|---|---|
Proba80 | ||||
Huff0 | 6,38 | 600MB/s | 1350MB/s | |
FSE | 8,84 | 325MB/s | 440MB/s | |
zlibh | 6,38 | 265MB/s | 300MB/s | |
Proba14 | ||||
Huff0 | 1,90 | 595MB/s | 860MB/s | |
FSE | 1,91 | 330MB/s | 460MB/s | |
zlibh | 1,90 | 255MB/s | 250MB/s | |
Proba02 | ||||
Huff0 | 1.13 | 525MB/s | 555MB/s | |
FSE | 1.13 | 325MB/s | 445MB/s | |
zlibh | 1.13 | 180MB/s | 210MB/s |
Por design, Huffman não consegue quebrar o limite de "1 bit por símbolo" e, portanto, perde eficiência em distribuições comprimidas, como Proba80
. O FSE está livre desse limite e sua eficiência de compressão permanece próxima do limite de Shannon em todas as circunstâncias. No entanto, esta precisão nem sempre é necessária, e distribuições menos compressíveis mostram pouca diferença com Huffman. Por outro lado, o Huff0 oferece uma enorme vantagem de velocidade.
Contribuições externas são bem-vindas e incentivadas. O branch “master” destina-se apenas a hospedar versões estáveis. O branch “dev” é aquele onde todas as contribuições são mescladas. Se você quiser propor um patch, faça commit no branch "dev" ou no branch de recurso dedicado. Comprometimento direto com "master" não é permitido.