Java Defender 策略 - DEFAULT_STRATEGY、FILTERED 和 HUFFMAN_ONLY

2023-12-21

在 gzip 压缩 Java Web 应用程序响应时,我试图在性能和压缩程度之间找到平衡。

在查看 Deflater 类时,我可以设定一个级别和一个策略。这些级别是不言自明的 -BEST_SPEED to BEST_COMPRESSION.

我不确定策略 -DEFAULT_STRATEGY, FILTERED and HUFFMAN_ONLY

我可以从 Javadoc 中理解一些道理,但我想知道是否有人在他们的应用程序中使用了特定的策略,以及您是否发现性能/压缩程度方面有任何差异。


Java Deflater 中提到的策略选项起源于 ZLIB 的 zlib (C) 实现和 (RFC 1950 https://www.rfc-editor.org/rfc/rfc1950)和放气(1951 https://www.rfc-editor.org/rfc/rfc1951), 我相信。它们几乎存在于所有实现 DEFLATE 的压缩库中。

要理解它们的含义,您需要了解一些DEFLATE http://en.wikipedia.org/wiki/DEFLATE。压缩算法结合了LZ77和Huffman编码。基础知识是:

  • LZ77 压缩的工作原理是查找重复的数据序列。实现通常使用 1k 到 32k 之间的“滑动窗口”来跟踪之前的数据。对于原始数据中的任何重复,LZ77 压缩不会在输出中插入重复数据,而是会插入“反向引用”。想象一下反向引用说“在这里,插入您在 8293 字节前看到的相同数据,17 字节”。 back-ref 被编码为这对数字:长度 - 在本例中为 17 - 和距离(或偏移量) - 在本例中为 8293。

  • 霍夫曼编码用代码代替实际数据。当数据显示 X 时,霍夫曼代码显示 Y。显然,只有当替代数据比原始数据短时,这才有助于压缩。 (反例是金·凯瑞电影中的Yes Man http://www.imdb.com/title/tt1068680/,当诺姆使用“Car”作为卡尔的简称时。卡尔指出卡尔已经很矮了。)霍夫曼编码算法进行频率分析,并使用最短的替代品来代替最常出现的数据序列。


Deflate 将这些结合起来,以便可以在 LZ77 反向引用上使用霍夫曼代码。各种 DEFLATE/ZLIB 压缩器上的策略选项只是告诉库 Huffman 与 LZ77 的权重是多少。

  • FILTERED通常意味着 LZ77 匹配在长度为 5 处停止。所以当文档说

    对过滤器(或预测器)生成的数据使用(过滤),...过滤的数据主要由具有一定随机分布的小值组成。

(from zlib 手册页 http://www.zlib.net/manual.html)
...我读到的代码表明它进行 LZ77 匹配,但最多只能匹配 5 个或更少字节的序列。我猜这就是文档所说的“小值”的意思。但文档中没有提到数字 5,因此不能保证该数字不会从一个版本更改为另一个版本,或者从 ZLIB/DEFLATE 的一种实现更改为另一种实现(例如 C 版本和 Java 版本)。

  • HUFFMAN_ONLY说,只做基于频率分析的替换代码。HUFFMAN_ONLY非常非常快,但对于大多数数据来说压缩效果不是很好。除非您的字节值范围非常小(例如,如果实际数据流中的字节仅采用可能的 255 个值中的 20 个之一),或者以牺牲大小为代价对压缩速度有极端要求,HUFFMAN_ONLY不会是你想要的。

  • DEFAULT以作者预期的方式将两者结合起来,这对于大多数应用程序来说是最有效的。


据我所知,在 DEFLATE 中没有办法只做 LZ77。没有LZ77_ONLY战略。但当然,您可以构建或获取自己的 LZ77 编码器,这将是“仅限 LZ77”。


请记住,该策略永远不会影响压缩的正确性;它只影响它的操作以及它的性能,无论是速度还是大小。


还有其他方法可以调整压缩器。一是设置LZ77滑动窗口的大小。在 C 库中,这是通过“窗口位”选项指定的。如果您了解 LZ77,那么您就会知道较小的窗口意味着更少的回溯,这意味着更快的压缩,但代价是丢失一些匹配项。这通常是压缩时转动的更有效的旋钮。


底线是,对于 80% 的情况,您不关心调整策略。您可能有兴趣摆弄窗口位,只是为了看看会发生什么。但只有当您完成了应用程序中需要执行的所有其他操作后,才可以执行此操作。


参考:
DEFLATE 的工作原理,作者:Antaeus Feldspar http://zlib.net/feldspar.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Defender 策略 - DEFAULT_STRATEGY、FILTERED 和 HUFFMAN_ONLY 的相关文章

随机推荐