zstd与zlib:小数据块场景下的性能对比
XZAN
后台工程师

第一回合:压缩率,到底谁能“压”得更狠?
我们先看看 zstd 和 zlib 在不同压缩等级下的压缩率表现。压缩率的计算很简单:压缩后数据大小 ÷ 原始数据大小。这是 zlib 在不同压缩级别下的压缩率表现:

从图里可以看出来,当数据块在 2K 以内时,zlib 无论你用什么压缩级别,压缩率差异都非常小。只有数据块逐渐增大后,高压缩级别才能取得更好的压缩率。
接下来是 zstd 的表现:

zstd 的表现和 zlib 类似,不同压缩级别之间的压缩率差异也不大。不过有个小发现,我在测试时把 zstd 的压缩级别调到 9 以上,发现压缩速度会成倍地下降,但压缩率的提升却非常有限。
【我的经验分享】
对于大多数业务场景来说,直接使用压缩库的默认压缩级别就够了。它通常是一个非常均衡的选择,能在压缩率、压缩速度和解压速度这三个指标之间找到一个很好的平衡点。除非你有特别极致的要求(比如对存储空间极度敏感,愿意牺牲压缩时间),否则不建议为了那一点点压缩率而去盲目追求高压缩级别。
第二回合:默认配置下的全方位对比
接下来,我们把两个库都调回默认配置,来个正面 PK。
zlib 默认压缩等级:6
zstd 默认压缩等级:3
我们先看看压缩率的表现。

整体上看,在我的小数据测试场景中,zstd 和 zlib 的压缩率差异并不显著。
对于 小数据块(<500B, 500B–1K),两者压缩率都非常接近 0.9,基本上没啥压缩效果。
随着数据块增大(>10K),两者的压缩率都能达到 0.3 左右,效果旗鼓相当。
这说明,在小数据场景下,zstd 并没有展现出传说中的压缩率碾压优势。这个结论也和我之前在 GitHub 上看到的一些相关 issue (https://github.com/facebook/zstd/issues/1134)的讨论内容类似。
既然压缩率差不多,那速度怎么样?毕竟我们追求的是整体的成本效益,压缩和解压的速度直接影响了 CPU 资源的消耗。
我们继续对比 zstd 与 zlib 的压缩和解压吞吐量。

结果很明显,在压缩率接近的情况下,zstd 在压缩与解压速度上都明显优于 zlib。尤其当数据块增大时,zstd 的性能优势更加突出,解压与压缩速度最高甚至可以达到 zlib 的 3-4 倍!
结论
这次实战评测让我对小数据压缩有了更清晰的认识。
zstd 的核心优势是速度,而非压缩率。它能用更少的 CPU 资源和时间完成压缩与解压,这对于处理海量小数据、对时延敏感的场景来说至关重要。
在压缩率层面,zstd 和 zlib 并未拉开太大差距。
如果你的业务和我一样,都是处理海量小数据,那么 zstd 绝对是更值得优先考虑的选择。
当然,这次评测只是基于我的特定场景,具体选型还是要结合自己的业务数据特点来决定。