DEFLATE 13 级压缩:速度慢 56.4 倍,仅提高 0.134% 压缩率,值吗?

DEFLATE 13 级压缩:速度慢 56.4 倍,仅提高 0.134% 压缩率,值吗?
慢得离谱的 13 级 DEFLATE 压缩DEFLATE 13 级是一种故意设置的不实用的 libdeflate 压缩级别。其输出结果仍是标准的 DEFLATE 格式但编码器在搜索解析、霍夫曼编码和块分割选项上会花费更多时间。在西里西亚语料库Silesia上与 12 级相比它节省了 86990 字节压缩率仅提高 0.134%但运行速度慢了 56.4 倍。只有在数据仅压缩一次但多次分发的情况下这种代价才是可以接受的。为何选择 DEFLATEDEFLATE 仍然值得优化因为其解码器无处不在。像 HTTP 内容编码、ZIP 存档、PNG 内部格式、软件分发、备份工具和嵌入式格式仍在使用相同的 LZ77 加霍夫曼编码设计。解码器的规范是固定的但编码器仍可选择匹配方式、块边界和霍夫曼编码表。更好的选择可以在不改变兼容性的情况下减小文件大小。基线采用 libdeflate 12 级这是最强大的实用 DEFLATE 编码器之一。13 级的实现已作为拉取请求提交到上游。13 级的工作机制13 级保留了 libdeflate 近乎最优的解析器但增加了选择的成本。它会搜索完整的 32 KiB DEFLATE 窗口允许进行 15 次优化过程并对输入字节数最多为 50000 的块应用静态霍夫曼编码优化。此过程不涉及任何格式扩展。对于类似文本的数据13 级会延迟确定块大小。它会从当前块的起始位置采样最多 64 KiB 的数据如果样本中不包含 NULL 字节且最多有 97 种不同的字节值软块大小会从 300000 字节增加到 1000000 字节。其假设很简单稳定的字节分布可以让一个霍夫曼编码表覆盖更多数据。解析器扩大了最低成本搜索范围。它可以为每个匹配长度选择最便宜的偏移量根据字面量和匹配长度统计信息估算初始霍夫曼编码成本根据缓存的匹配估算偏移槽频率并将测量的动态霍夫曼编码成本与静态霍夫曼编码和仅使用字面量的编码进行比较。块分割也会延迟。压缩器会存储最多九个带有解析器状态的分割候选方案然后对整个块进行评分并在候选区间上计算有界最短路径。单次分割可能在成本上更优多次分割路径必须比整个块至少节省 512 位。选定的解析结果会被缓存以便最终刷新。这种缓慢是有界限的。搜索过程、分割候选方案和块大小都有上限因此 13 级不会像 turtledeflate 或更广泛的文件优化器如 ECT那样陷入无界的优化循环。回归策略开发过程中采用了针对西里西亚语料库的零压缩回归策略尝试了多种方法但只有那些严格减小至少一个压缩文件大小且不增加其他压缩文件大小的更改才会被保留到最终的 13 级配置中。西里西亚语料库足够小适合反复开发但又足够多样化能避免针对单个文件进行调优它包含文本、二进制文件、数据库、图像和结构化数据。西里西亚语料库测试结果libdeflate 12 级与 13 级在西里西亚语料库上的表现对比如下| 文件 | 12 级大小/时间 | 13 级大小/时间 | 大小差异 | 时间差异 || --- | --- | --- | --- | --- || dickens | 3688552 字节 / 1289 毫秒 | 3684671 字节 / 83512 毫秒 | -3881 字节 (-0.105%) | 82223 毫秒 (6378.8%) || mozilla | 18267490 字节 / 4959 毫秒 | 18235120 字节 / 110754 毫秒 | -32370 字节 (-0.177%) | 105795 毫秒 (2133.4%) || mr | 3448571 字节 / 1627 毫秒 | 3443723 字节 / 16260 毫秒 | -4848 字节 (-0.141%) | 14633 毫秒 (899.4%) || nci | 2766224 字节 / 7935 毫秒 | 2758044 字节 / 673648 毫秒 | -8180 字节 (-0.296%) | 665713 毫秒 (8389.6%) || ooffice | 2998130 字节 / 424 毫秒 | 2995604 字节 / 8676 毫秒 | -2526 字节 (-0.084%) | 8252 毫秒 (1946.2%) || osdb | 3642347 字节 / 798 毫秒 | 3641341 字节 / 4942 毫秒 | -1006 字节 (-0.028%) | 4144 毫秒 (519.3%) || reymont | 1702796 字节 / 1005 毫秒 | 1699494 字节 / 81839 毫秒 | -3302 字节 (-0.194%) | 80834 毫秒 (8043.2%) || samba | 5135662 字节 / 2889 毫秒 | 5122812 字节 / 141227 毫秒 | -12850 字节 (-0.250%) | 138338 毫秒 (4788.4%) || sao | 5255575 字节 / 333 毫秒 | 5255358 字节 / 1687 毫秒 | -217 字节 (-0.004%) | 1354 毫秒 (406.6%) || webster | 11565754 字节 / 6452 毫秒 | 11555293 字节 / 475196 毫秒 | -10461 字节 (-0.090%) | 468744 毫秒 (7265.1%) || x-ray | 5754248 字节 / 305 毫秒 | 5748141 字节 / 3276 毫秒 | -6107 字节 (-0.106%) | 2971 毫秒 (974.1%) || xml | 633760 字节 / 1104 毫秒 | 632518 字节 / 69504 毫秒 | -1242 字节 (-0.196%) | 68400 毫秒 (6195.7%) || 总计 | 64859109 字节 / 29120 毫秒 | 64772119 字节 / 1670521 毫秒 | -86990 字节 (-0.134%) | 1641401 毫秒 (5636.7%) |13 级在整个语料库上节省了 86990 字节压缩率降低了 0.134%但增加了 1641401 毫秒的运行时间。相对效果最明显的是 nci 文件压缩率提高了 0.296%而 sao 文件的变化仅为 0.004%。那么这样的压缩效果和速度代价真的值得吗