zstd v1.4.7 发布,Facebook 开源的无损压缩算法
zstd v1.4.7 已发布,官方特别推荐升级到此版本,因为 1.4.7 在性能、修复错误以及增加新功能方面均有不小的改进。zstd (Zstandard) 是由 Facebook 开源的快速无损压缩算法,主要应用于 zlib 级别的实时压缩场景,并且具有更好的压缩比。zstd 还可以以压缩速度为代价提供更强的压缩比,速度与压缩权衡可通过小增量进行配置。
P.S:文章发布时,Facebook 发布了针对 1.4.7 的热修复更新,版本也升级到了 1.4.8,修复了关于内部缓存的问题,详情点此查看。
改进--long模式
--long模式用于在合理的时间和内存预算内分析大量数据,--long模式算法运行在正则表达式匹配器上,两者均对压缩结果产生影响。不过这两个阶段独立运行,因此导致在高级别的压缩水平下出现细微差异。所以无法在默认情况下一直启用--long模式。
新版本修复了此问题,对于压缩级别为 16 以上的压缩,开启--long模式的压缩性能始终比关闭--long模式好。
提升解压小文件块的速度
此版本对解压小文件块的速度进行了优化,具体的提升根据文件块的大小有所不同,如下表所示:
| Block Size | Decompression Speed Improvement |
|---|---|
| 1 KB | ~+30% |
| 2 KB | ~+30% |
| 4 KB | ~+25% |
| 8 KB | ~+15% |
| 16 KB | ~+10% |
| 32 KB | ~+5% |
共享线程池 (Shared Thread Pool)
这是一项试验性功能。
默认情况下,每个压缩上下文可以设置为使用最大可用的线程。但在复杂情况下,可能会有多个压缩上下文并行工作,每个上下文都会使用部分线程。在这种场景中,可能需要控制所有这些压缩上下文使用的线程总数。
1.4.7 新增的共享线程池功能支持让所有这些压缩上下文共享同一个线程池,添加ZSTD_CCtx_refThreadPool()参数即可使用。
提升字典压缩速度 (Dictionary Compression)
此版本引入了新的实验性字典压缩算法,适用于中档压缩级别,采用了ZSTD_greedy, ZSTD_lazy和ZSTD_lazy2等策略。新算法可以在ZSTD_CDict创建过程中通过选择压缩参数ZSTD_c_enableDedicatedDictSearch来触发。
下面的基准测试显示了新算法带来的显著压缩速度提升:
| Level | Hot Dict | Cold Dict |
|---|---|---|
| 5 | ~+17% | ~+30% |
| 6 | ~+12% | ~+45% |
| 7 | ~+13% | ~+40% |
| 8 | ~+16% | ~+50% |
| 9 | ~+19% | ~+65% |
| 10 | ~+24% | ~+70% |
