GZIP压缩级别对解压有影响吗

Does GZIP Compression Level Have Any Impact On Decompression

我知道 GZIP 是 LZ77 和霍夫曼编码的组合,可以配置 1-9 之间的级别,其中 1 表示最快的压缩(较少压缩),9 表示最慢的压缩方法(最好的压缩)。

我的问题是,级别的选择 会影响压缩过程,还是根据用于压缩的级别,解压缩也会产生额外费用?

我问是因为如果客户端支持的话,通常许多网络服务器会即时响应 GZIP,例如Accept-Encoding: gzip。我很欣赏在动态执行此操作时,对于一般情况,6 等级别可能是不错的选择,因为它在速度和压缩之间提供了良好的平衡。

但是,如果我有一堆静态资产,我可以提前 GZIP 一次——而且永远不需要再这样做——使用最高但最慢的压缩级别会有什么缺点吗? IE。如果使用较低的压缩级别,现在是否会为客户端带来额外的开销。

实际上,在 real world measurements 中,更高的压缩级别会产生更短的解压缩时间(这可能主要是由于您需要处理更少的永久存储和更少的 RAM 访问)。

实际上,与 gunzipping 相比,在客户端发生的大多数数据操作都相当昂贵,因此您根本不应该关心它。

另请注意,对于图像静态资产,通常已经应用了 huffman/zlib 编码(PNG 仅使用 zlib!),通过 gzip 压缩它们不会有太多好处。实际上,通常小图像(例如,图标)适合单个 TCP 数据包(忽略 HTTP header,它有时比图像本身大)因此您不会获得任何速度增益(但省钱关于传输量——如果您传送 TB 的小图像。现在,我可以假设您不是 Google 本身...

此外,我想向您指出更高级别的优化,例如可以将您的 javascript 代码转换为更紧凑形状的工具(例如,删除白色 space,重命名私有变量my_mother_really_likes_this_number_of_unicornsm1);此外,JQuery 之类的内容以“预压缩”形式出现。 HTML 也是如此。不会让事情更容易调试,但由于您似乎对最终 space 节省感兴趣...

好问题,也是一个曝光不足的问题。您的直觉是可靠的——对于某些压缩算法,选择最大压缩级别可能需要解压器在解压缩时做更多的工作。

幸运的是,对于 gzip 而言并非如此 – client/browser 没有额外的开销来解压缩更多压缩的 gzip 文件(例如,选择 9 进行压缩而不是 6,假设大多数服务器使用标准 zlib 代码库).对此的最佳衡量标准是 解压缩率 ,就目前而言,它以 MB/sec 为单位,同时还监控内存和 CPU 等开销。简单地按解压缩时间计算是不好的,因为在较高的压缩设置下文件较小,如果我们只使用秒表,我们不会控制这个因素。

  1. gzip 解压缩在您获得超过 6 级压缩内容后,在解压缩时间和内存使用方面迅速变得渐近。 Marcus Müller 链接的测试结果中第 7、8 和 9 级的解压缩时间平坦线,尽管这是以整秒给出的粗粒度数据。

  2. 您还会在这些结果中注意到,对于所有级别的压缩,解压缩的内存要求都是平坦的,为 0.1 MiB。这几乎令人难以置信,只是我们很少看到的软件卓越程度。马克·阿德勒 (Mark Adler) 及其同事的成就值得大力支持。 gzip 是一种非常好的格式。

内存使用问题解决了您关于开销的问题。真的有none。 9级在浏览器解压速度上没有太大的提升,但也没有损失什么。

现在,查看 these test results 以获得更多纹理。您会看到 9 级压缩内容的 gzip 解压缩速率如何比低级别压缩内容稍微 (例如,在 9 级,解压率比 6 级快 0.9%,例如).这很有趣也很令人惊讶。我不希望利率增加。这只是一组测试结果——它可能不适用于其他场景(并且在任何情况下差异都非常小)。

临别注:预压缩静态文件是个好主意,但我不建议在第 9 级使用 gzip。通过使用 zopfli 或 libdeflate,您将获得比 g​​zip-9 更小的文件。 Zopfli 是来自 Google 的成熟的 gzip 压缩器。 libdeflate 是新的但非常优秀。在我的测试中,它始终优于 gzip-9,但仍落后于 zopfli。您还可以使用 7-Zip 创建 gzip 文件,它始终优于 gzip-9。 (在前面,gzip-9 是指使用 Apache 和 nginx 使用的规范 gzip 或 zlib 应用程序)。

不,使用最大压缩级别时在解压缩方面没有任何缺点。事实上,它有一点好处,即压缩得更好的数据解压得更快。原因很简单,解压缩器必须处理的压缩位更少。