Zstandard v1.4.7

2020-12-17 22:03:28

v1.4.7从性能到各种修复程序再到新功能,在多个方面都进行了数月的改进,下面重点介绍其中的一些功能。建议升级。

(注意:如果您想知道v1.4.6发生了什么,这是一个内部发行版本号,仅供与Linux内核同步使用)

--long模式使得可以在合理的时间和内存预算内分析大量数据。 --long模式算法在常规匹配查找器之上运行,并且两者都有助于最终的压缩结果。但是,这两个阶段是独立工作的,因此在最高压缩级别上会导致较小的差异,因此必须仔细监控每个决策的成本。因此,在输入不适合--long模式的情况下(长距离无大重复),与不启用输入(高压缩率)相比,启用输入可能会降低压缩性能(即使很小)级别)。这种情况使“总是启用”变得更加困难。默认情况下--long模式。此版本已修复。对于16级及更高的压缩级别,与没有--long的压缩相比,--long的使用将永远不会退缩。该特性使对压缩混合的长模贡献增加,从而提高了其有效性。

当--long模式实际上有用时,压缩率的改善最为明显。特别是,--patch-from(隐含地依赖--long)显示了从改进中获得的出色收益。我们在这里提供一些简短的结果(在Macbook Pro 16”,i9上进行了测试)。

由于--long模式现在始终在高压缩级别下很有用,因此它会自动启用任何大于等于= 128MB的窗口。

此版本包括优化功能,可显着加快小块和小数据的解压缩速度。减压速度的增加将根据下表的块大小而有所不同:

块大小减压速度提高------------- || -------------------------------- 1 KB | 〜+ 30%2 KB | 〜+ 30%4 KB | 〜+ 25%8 KB | 〜+ 15%16 KB | 〜+ 10%32 KB | 〜+ 5%

这些优化来自改善读取块头的过程以及构建霍夫曼和FSE解码表的过程。 zstd的默认块大小为128 KB,在此块大小下,解压缩数据所花费的时间将占读取块头和构建解码表所花费的时间。但是,随着块变小,读取块头和建立解码表的成本变得更加突出。

CLI对此版本进行了一些明显的升级。首先,zstd可以通过环境变量ZSTD_NBTHREADS接受一个新参数。在应用程序(例如tar或python脚本)后面调用zstd时,此功能很有用。同样,默认情况下更喜欢多线程压缩的用户现在可以根据自己的环境设置所需的线程数量。仍然可以根据需要通过命令行覆盖此设置。使用新的命令--output-dir-mirror,可以压缩包含子目录的目录(通常使用-r命令),每个目录生成一个压缩文件,并将树状结构复制到选定的目标目录中。还有其他各种改进,例如更准确的警告和错误消息,-long-command = FILE和--long-command FILE约定之间的完全等效,固定的stdin和用户提示之间或控制台输出和状态消息之间的混淆风险,以及处理多个文件时的新的简短执行摘要,从而累计为您带来更好的命令行体验。

默认情况下,可以将每个压缩上下文设置为使用最大nb线程。在复杂的场景中,可能存在多个并行工作的压缩上下文,并且每个压缩上下文都使用一些nb线程。在这种情况下,可能希望控制所有这些压缩上下文总共使用的线程总数nb。

现在,通过使所有这些压缩上下文共享同一线程池,这是可能的。感谢@marxin提供的新的高级压缩参数ZSTD_CCtx_refThreadPool()来表达此功能。有关更多详细信息,请参见其文档。

此版本引入了一种新的实验词典压缩算法,该算法适用于中档压缩级别,采用了诸如ZSTD_greedy,ZSTD_lazy和ZSTD_lazy2之类的策略。可以通过在创建ZSTD_CDict的过程中选择压缩参数ZSTD_c_enableDedicatedDictSearch来触发此新算法(实验部分)。

我们希望这将有助于使中级压缩对字典方案更具吸引力。有关更多详细信息,请参见文档。欢迎反馈!

我们引入了一个新的入口点ZSTD_compressSequences(),它使用户可以通过他们喜欢的任何机制来定义自己的序列,并将其呈现给这个新的入口点,该入口点将基于以下内容生成单个zstd压缩帧提供的序列。

因此,例如,用户现在可以向函数提供外部生成的ZSTD_Sequence数组:[(偏移量:5,matchLength:4,litLength:10),(偏移量:7,matchLength:6,litLength:3),... ],该函数将根据这些序列输出zstd压缩帧。

目前,该实验API有一些局限性(其相关参数存在于“实验”部分)。值得注意的是,此API当前忽略提供的任何重复偏移,而是始终在运行中重新计算它们。此外,无法强制指定某些zstd功能(例如RLE或原始块)的存在。如果您对此新入口点感兴趣,请参阅zstd.h,以获取更详细的使用说明。

此版本中还有许多其他功能和改进,由于我们无法全部突出显示,因此下面列出了它们:

api:共享线程池:通过@marxin控制多个压缩作业使用的线程总数nb

api:zlibWrapper仅使用公共API,并且与@terrelln的动态库兼容

api:修复:即使在特殊情况下,多线程压缩也具有可预测的输出(请参阅#2327)(cli上不存在该问题)

api:修复:字典压缩正确地遵循字典压缩级别(请参阅#2303)(cli上不存在该问题)

构建:@ STATia_BMI2宏,用于通过@Niadb(#2258)在MSVC上对BMI2进行编译时检测