区别:LZ77 vs. LZ4 vs. LZ4HC(压缩算法)?

Difference: LZ77 vs. LZ4 vs. LZ4HC (compression algorithms)?

我了解LZ77和LZ78算法。 我读到了 LZ4 here and here and found code for it.

这些链接描述了 LZ4 块格式。但如果有人可以解释(或指导我一些资源解释),那就太好了:

LZ4 is built to compress fast, at hundreds of MB/s per core. It's a fit for applications where you want compression that's very cheap: for example, you're trying to make a network or on-disk format more compact but can't afford to spend a bunch of CPU time on compression. It's in a family with, for example, snappy and LZO.

自然的比较点是 zlib 的 DEFLATE algorithm, which uses LZ77 and Huffman coding 并且用于 gzip、.ZIP 和 .PNG 格式以及太多其他地方。

这些快速压缩器的不同之处在于:

  1. 他们使用更快的重复检测代码(通常是简单的 hashtable,没有碰撞检测)但不会搜索多个可能的匹配项以找到最佳匹配项(这会花费时间但会导致更高的压缩率), 并且找不到一些短匹配项。
  2. 他们只尝试压缩输入中的重复——他们不尝试利用某些字节比其他字节更有可能 在重复 之外。
  3. 与2密切相关,它们一次生成字节输出,而不是位;允许部分字节代码有时会允许更多压缩,但需要更多 CPU 工作(通常是位移位、掩码和分支)来编码和解码。
  4. 为了在现代 CPUs 上快速实现它们,已经进行了大量实际工作。

相比之下,DEFLATE 的压缩效果更好,但压缩和解压缩速度较慢,而高压缩算法如 LZMA, bzip2, LZHAM, or brotli tend to take even more time (though Brotli at its faster settings can compete with zlib)。高压缩算法之间存在很多差异,但总的来说,它们倾向于捕获更长距离的冗余,更多地利用上下文来确定可能的字节,并使用更紧凑但更慢的方式来以位表示结果。

LZ4HC 是 LZ4 的“高压缩”变体,我认为它改变了上面的第 1 点——压缩器在当前和过去的数据之间找到不止一个匹配项,并寻找最佳匹配项以确保输出是小的。与 LZ4 相比,这提高了压缩 ratio 但降低了压缩 speed。不过,解压速度不会受到影响,因此如果您压缩一次并解压多次并且主要想要非常便宜的解压,那么 LZ4HC 是有意义的。

请注意,即使是快速压缩器也可能不允许一个内核饱和大量带宽,例如 SSD 或快速数据中心内链接提供的带宽。甚至还有速度更快、比率更低的压缩器,有时用于 temporarily pack data in RAM. WKdm and Density are two such compressors; one trait they share is acting on 4-byte machine words of input at a time rather than individual bytes. Sometimes specialized hardware can achieve very fast compression, like in Samsung's Exynos chips or Intel's QuickAssist technology.

如果您对压缩比 LZ4 更多但 CPU 时间比放气更少感兴趣,LZ4 的作者 (Yann Collet) 编写了一个名为 Zstd--here's a blog post from Facebook at its stable release, background on the finite state machines used for compactly encoding info on repetitions, and a detailed description in an RFC. Its fast modes could work in some LZ4-ish use cases. (Also, Apple developed lzfse on similar principles, and Google developed gipfeli as a 'medium' packer. Neither seemed to get much use in the outside world.) Also, a couple projects aim to provide faster/lighter DEFLATE: SLZ and patches to zlib by CloudFlare and Intel.

的库

与最快的压缩器相比,那些“中等”压缩器添加了一种熵编码,也就是说它们利用了一些字节比其他字节更常见的方式,并且(实际上)为更常见的字节值在输出中放置更少的位。

如果您正在压缩一个长流,并且使用更多内核速度更快可能会有所帮助,通过 pigz and the zstd through the command-line tool's -T option (and in the library). (There are various experimental packers 也可用于 gzip 的并行压缩,但它们的存在更多是为了推动速度或密度,而不是今天使用的。)

因此,总的来说,您有很多适用于不同应用程序的替代压缩器:

  • 对于非常快速的压缩:LZ4、zstd 的最低设置,或者更弱的内存压缩器
  • 对于平衡压缩:DEFLATE 是旧标准;中低设置的 Zstd 和 brotli 是新用途的不错选择
  • 对于高压缩:brotli,或高设置的 Zstd
  • 对于非常高的压缩率(例如压缩一次并提供多次的静态内容):brotli

当您从 LZ4 通过 DEFLATE 转移到 brotli 时,您需要付出更多努力来预测和编码数据,并以一定速度为代价获得更多压缩。

顺便说一句,像 brotli 和 zstd 这样的算法通常可以胜过 gzip——在给定速度下压缩得更好,或者更快地获得相同的压缩——但这实际上并不是因为 zlib 做了任何事情 。主要的秘密可能是更新的算法可以使用更多的内存:zlib 可以追溯到 1995 年(并且 DEFLATE 到 1993). Back then RAM cost > 3,000 倍于今天,所以只保留 32KB 的历史是有意义的。CPU 的变化随着时间的推移 s 也可能是一个因素:大量算术(如有限状态机中使用的)比以前相对便宜,并且不可预测的 ifs(分支)相对更昂贵。