Zstandard 是facebook厂商提供的一种高压缩率的实时压缩算法,他在压缩比和压缩速度上做了很好的平衡,同时还提供高速的解码器,针对小数据,也提供了一种叫做字典压缩算法,从样本中可以创建出字典集合数据,Zstandard库以BSD协议方式开源。
该算法是由Facebook的Yann Collet开发的一个无损数据压缩算法。Zstandard在设计上与DEFLATE(.zip、gzip)算法有着差不多的压缩比,但有更高的压缩和解压缩速度。
Zstandard使用字典算法(LZ77)结合熵编码法的有限状态熵(tANS)。—–Wikipedia
以下是基准测试数据对比:
默认Zstandard压缩的level=3,极限:Zstd Level22
压缩算法 | 压缩比 | 压缩速度 | 解压缩速度 |
zstd 1.4.5 -1 | 2.884 | 500 MB/s | 1660 MB/s |
zlib 1.2.11 -1 | 2.743 | 90 MB/s | 400 MB/s |
brotli 1.0.7 -0 | 2.703 | 400 MB/s | 450 MB/s |
zstd 1.4.5 --fast=1 | 2.434 | 570 MB/s | 2200 MB/s |
zstd 1.4.5 --fast=3 | 2.312 | 640 MB/s | 2300 MB/s |
quicklz 1.5.0 -1 | 2.238 | 560 MB/s | 710 MB/s |
zstd 1.4.5 --fast=5 | 2.178 | 700 MB/s | 2420 MB/s |
lzo1x 2.10 -1 | 2.106 | 690 MB/s | 820 MB/s |
lz4 1.9.2 | 2.101 | 740 MB/s | 4530 MB/s |
lzf 3.6 -1 | 2.077 | 410 MB/s | 860 MB/s |
snappy 1.1.8 | 2.073 | 560 MB/s | 1790 MB/s |
github java库,GitHub - luben/zstd-jni: JNI binding for Zstd
如何引入库:
implementation group: 'com.github.luben', name: 'zstd-jni', version: '1.+';
如何使用:
压缩:
byte[] array=...; byte[] compressArray = Zstd.compress(array);
解压缩:
byte[] compressArray=... int size = (int) Zstd.decompressedSize(compressArray); byte[] array = new byte[size]; Zstd.decompress(array, compressArray);
一般建议在长度大于256后,才开启压缩。
笔者把zstandard 和zlib做了基准测试,经过测试,发现和预期还是有差距, 我建议,该算法不是很有必要替换现有的用于协议之间传输的zlib压缩算法(或许它的字典算法能改善这个测试数据,或者是我的测试量太少了?),因为对于小数据来说,改善不明显,反而还有降低的可能,但是,强烈建议用于数据库(redis或者mysql)的海量数据的存储压缩解压,比如地图点数据,性能具有大幅提升。
sample | ratio | compress speed(ms) | decompress speed(ms) | |||
algorithm | zlib | zstandard | zlib | zstandard | zlib | zstandard |
17000中文字 | 2.005 | 1.845 | 0.873 | 0.1957 | 0.154 | 0.0402 |
1000英文 | 2.014 | 1.906 | 0.0319 | 0.0191 | 0.0117 | 0.0091 |
437英文 | 2.253 | 2.163 | 0.0237 | 0.0167 | 0.0069 | 0.0082 |
256 英文 | 1.673 | 1.61 | 0.0199 | 0.0141 | 0.007 | 0.0091 |
128 英文 | 1.293 | 1.243 | 0.0115 | 0.0102 | 0.0018 | 0.0068 |
以下是官方的图,可以做下对比:下图表示,zstandard比zlib,同样的压缩比情况下,速度高于zlib,同样的速度情况下,压缩比要高于zlib
参考:zstandard: Zstandard(zstd)是 Facebook 开源的一种快速无损压缩算法,以 zlib 级为目标的实时压缩场景和更好的压缩比