zstandard v1.5.0.

2021-05-15 03:18:33

1.5.0引入了一个新的默认匹配查找器,用于压缩策略贪婪,懒惰和Lazy2(哪个映射到大于256K的输入的5-12级)。优化使压缩速度的大规模改进具有压缩比(<0.5%)的轻微扰动(&lt; 0.5%)和等于或降低的内存使用情况。

在具有显着缓存争用的大量装载机器上,我们在内部测量甚至更大的收益:2-3x +速度在5-7级。 🚀

在通常大于128KB的文件上实现了最大的收益。在小于16KB的文件上,默认情况下,我们恢复到传统匹配查找器,该查找器变得更快。此默认策略可以手动覆盖:可以使用高级参数zstd_c_userowmatchfinder或通过cli选项 - [no-]行匹配查找器来强制启用新的匹配查找器。

默认为高压缩电平(16+)默认情况下,现在启用通过块分离提高压缩比。受益量根据工作量而变化。压缩由大量不同文件组成的档案将看到比单个文件的压缩更具改进,这些文件不会富集熵(如文本文件/ enw​​ik)。在16+级别,我们观察到压缩速度没有可衡量的回归。

可以在较低的压缩级别和高级参数zstd_c_splitplocks上强制启用块分离器。当在较低级别强制启用时,速度回归可能变得更加值得注意。另外,由于可以产生更多压缩块,因此这些斑块上的减压速度也可以看到小的回归。

在此版本中,用大窗口设置(如--long或-ultra)压缩的数据的减压速度已显着提高。收益根据编译器品牌和版本而有所不同,克兰通常受益最多。

通过在核心I7-9700K上压缩eNWIK9(具有128 MB窗口大小)来测量以下基准。

“正常”有效载荷的平均减压速度也略有提高,尽管撞击不太令人印象深刻。再次,里程因精确的编译器版本,有效载荷和甚至压缩级别而异。一般而言,大多数情景都可以看到+1至+ 9%的好处。这里还有一些异常值,从中有-4%到+ 13%。所有这些方案的平均增益都达到〜+ 4%。

它已经可以使用多线程支持来编译libzstd。但这是一个积极的操作。默认情况下,Make Build脚本会将Libzstd构建为仅单线程库。

v1.5.0的这种变化。现在,动态库(通常是Linux上的libzstd.so.1)默认支持多线程压缩。请注意,此属性不会扩展到静态库(通常是Linux上的libzstd.a),因为这样做会影响现有客户端应用程序的构建脚本(要求它们添加-pthread到他们的食谱),因此可能会打破其构建。为了避免这种破坏,静态库默认保持单线程。幸运的是,这种构建中断不会扩展到动态库,可以使用多线程支持构建,而存在链接到libzstd.so的现有应用程序,并且只期望单线功能只会更聪明,并且保持完全不受影响。

这个想法是从v1.5.0开始,应用程序可以期望动态库支持多线程,应该需要它,这将逐步导致加速采用这种能力。据说,由于本地部署的动态库可以或可能不是,支持多线程压缩,这取决于本地构建配置,始终最好在运行时检查此功能。对于此目标,它足以在更改参数zstd_c_nbworkers时检查返回值,如果它导致错误,则不支持多线程。

问:如果我愿意仅在单线程模式下保留图书馆,该怎么办?目标使Lib-Nomt将确保这一结果。

问:实际上,我想要静态和动态库版本来支持多线程!目标使lib-mt将产生此结果。

向上移动到较高的数字1.5表示扩展ZSTD Public API的稳定部分的机会。此更新相对较小,只有几个非争议的新人。

zstd_defaultclevel()表示默认级别(选择级别0时)。它完成了现有的zstd_minclevel()和zstd_maxclevel()。同样,ZSTD_GETDICTID_FROMCDICT()是已经推广ZSTD_GETDICTIDID_FROMDDDICT()的直接等效。

ZSTD-1.4.0稳定了一个新的高级API,允许用户将高级参数传递给ZSTD。我们现在弃用了所有由新的高级API括起来的旧实验API。将考虑在下一个ZSTD主要释放ZSTD-1.6.0中删除。请注意,只有实验符号受到影响。像zstd_initcstream()一样稳定的函数保持完全支持。

已弃用的函数在下面列出,以及迁移。所有建议的迁移都是稳定的API,这意味着一旦迁移,API将永远支持。有关如何迁移的更多详细信息,请参阅已弃用函数的文档。

不替换的函数已弃用。我们不希望任何用户的这些功能。如果您使用这些,请打开一个问题,并对如何迁移有疑问。

ZSTD略微重新组织了库布局,将所有公共标头移动到顶级lib /目录。这是为了一致性,因此所有公共标题都在lib /并且所有私有标题都在子目录中。如果从源代码构建ZSTD,这可能会影响您的构建系统。

我们已将Contrien / Single_file_lib的脚本移动到构建/ single_file_libs。这些脚本最初由@cwoffenden贡献,会产生zstd库的单个编译单元合并,这可以方便地将zstandard集成到其他源树中。此举反映了我们在我们的承诺,以支持此工具以及使用ZSTD的模式前进。

我们略微更改Windows版本.zip文件的格式,以匹配我们的其他释放工件。 .zip文件现在捆绑在名称与存档名称匹配的单个文件夹中的所有内容。该文件夹的内容完全匹配先前包含在存档的根目录中的内容。

我们为zStandard项目创建了一个签名密钥。 此版本和所有未来版本将由此密钥签署。 查看#2520进行讨论。 API:已弃用了几种实验功能,并将发出编译器警告(#2582,Senhuang42) perf:块分离器以提高压缩比,默认为高压缩电平(#2447,@ senhuang42)启用 perf:解压缩循环重构,克朗的速度改进和 - 延伸模式(#2614#2630,@ cyan4973)