Zstandard (zstd)压缩算法在JAVA上的使用

Zstandard 是facebook厂商提供的一种高压缩率的实时压缩算法,他在压缩比和压缩速度上做了很好的平衡,同时还提供高速的解码器,针对小数据,也提供了一种叫做字典压缩算法,从样本中可以创建出字典集合数据,Zstandard库以BSD协议方式开源。

该算法是由Facebook的Yann Collet开发的一个无损数据压缩算法。Zstandard在设计上与DEFLATE(.zip、gzip)算法有着差不多的压缩比,但有更高的压缩和解压缩速度。
Zstandard使用字典算法(LZ77)结合熵编码法的有限状态熵(tANS)。—–Wikipedia

以下是基准测试数据对比:

压缩算法 压缩比 压缩速度 解压缩速度
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库,https://github.com/luben/zstd-jni

如何引入库:

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 (zstd)压缩算法在JAVA上的使用_第1张图片

 

参考:https://gitee.com/mirrors/zstandard

你可能感兴趣的:(算法)