gzip 的不同压缩级别有何不同?

How do the different compression levels of gzip differ?

我试图更好地了解 gzip 的不同压缩级别 (1-9) 在编码实现方式上有何不同。

我查看了 zlib C 源代码,它似乎与搜索最长匹配字符串的详尽程度有关,但正在寻找更具体的信息。

例如,在霍夫曼编码的分配上,级别是否产生任何差异?

据我所知,是的,它主要基于您要分配的缓冲区的大小。缓冲区越大,压缩效果越好。如果您可以分配大小约为 input file size × 1.2 的缓冲区,那么在大多数情况下,您将获得 Huffman 可能获得的最佳压缩。

原因是霍夫曼 table 将包含所有字节,当您有这么大的缓冲区时,结果可能是最好的。当算法用完缓冲区 space 时,它需要重置其 table(为此添加了流中的代码),这意味着您从 table 开始新的编码从头开始,这意味着您丢失了字节来重新设计新的 table...

虽然在某些情况下重置可能是有益的(即在文件的前半部分将许多字节设置为值 X,然后在后半部分将更多字节设置为值 Y),但这种情况很少发生.

正如您所观察到的,级别的不同仅在于 deflate 查找匹配字符串的难度。霍夫曼编码是在选定的固定数量的符号(文字和 length/distance 对)上完成的,产生 "block",其中该数字由内存级别定义,而不是压缩级别。生成的霍夫曼码必然不同,因为编码的符号不同。

内存级别的选择对压缩也有一些影响,因为更多的符号将块的代码描述成本分摊到更多的符号上,但太多的符号可能会阻止霍夫曼代码适应本地符号统计数据的变化。默认内存级别为 8(每个块产生 16,383 个符号),因为测试表明它比级别 9(每个块 32,767 个符号)提供更好的压缩。但是,您的里程可能会有所不同。