Java压缩算法库测试

March 6, 2012 / Compression, Java

之前在Linux几种压缩工具或库的简单测试一文中测试了几种不同工具的压缩比和压缩速率,此次,将对比使用Java语言编写的压缩程序的性能。

测试环境

操作系统:CentOS 5.6 x86-64

内核:Linux 2.6.18-238.el5

CPU:Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 16 threads

Memory:48GB

Disk:2TB SATA盘(读写带宽约150MB/S)

JDK:java-1.6.0-openjdk.x86_64

准备测试数据

测试数据与测试Linux压缩工具的数据一样,/opt/test.tar,大小为1.1GB。

压缩程序代码

下载地址:compression.tar.gz

文件压缩测试

利用现有的压缩算法库,有gzip、bzip2、quicklz及snappy,使用Java语言实现多个压缩程序,并进行文件压缩测试。

在进行压缩时,压缩块的大小设置为64KB,除了QuickLZ算法(将文件内容加载到内存,再对文件所有内容进行压缩),其它的算法均采用流式压缩、解压缩。

内存压缩测试

利用现有的压缩算法库,有gzip、bzip2、quicklz及snappy,使用Java语言实现多个压缩程序,并进行内存压缩测试,压缩的内容从文件中读取。

在进行压缩时,压缩块的大小设置为64KB。BZip2和GZip算法采用流式压缩,将文件的所有内容读入到一个byte数组中,然后用ByteArrayInputStream来操作文件内容;QuiclLZ、Snappy采用非流式压缩,即将文件的所有内容读入到一个byte数组中,对byte数组直接进行压缩或解压缩。

测试结果

表1. Linux系统常用压缩工具测试结果:

压缩算法 压缩比 压缩速率(MB/S) 解压缩速率(MB/S)
lzop 28.7% 268.8 266.0
quicklz 22.6% 107.0 95.0
gzip 16.1% 36.4 116.6
bzip2 11.3% 3.1 25.2
xz 11.4% 0.3 58.1
7z 11.8% 3.6 56.3

表2. 文件压缩测试结果:

压缩算法 压缩比 压缩速率(MB/S) 解压缩速率(MB/S)
bzip2 11.3% 1.6 8.3
gzip 15.9% 28.5 116.2
quicklz 22.6% 75.5 109.1
snappy 30.5% 140.7 147.9

表3. 内存压缩测试结果:

压缩算法 压缩比 压缩速率(MB/S) 解压缩速率(MB/S)
bzip2 11.3% 2.4 22.1
gzip 15.9% 30.8 201.5
quicklz 22.6% 130.8 167.7
snappy 30.5% 185.6 619.1

从表2可看出,使用Java语言编写的压缩程序的性能比Linux系统上的压缩工具略差,但压缩比基本相同。从表2和表3的数据可以看出,snappy的压缩、解压缩速率可能受限于磁盘IO。

后记

文中若有错误或疏漏之处,烦请批评指正。