测试环境
操作系统: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
准备测试数据
测试数据 /opt/test.tar,大小为1.1GB。
文件压缩测试
利用现有的压缩算法库,有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。