几种压缩算法对全0数据的压缩效率比较

昨天从京东买了一支USB 3.0的U盘,Sandisk CZ48 32G。U盘上预装了闪迪保险箱™软件。新买的U盘总要测试一下,那就用dd命令做读取测试,同时用压缩工具做文件备份吧!我用的第一个压缩工具是bzip2,发现平均吞吐率只有53MB/s,跟U盘标称的100MB/s相差很远,估计瓶颈在压缩算法。于是,我用gzip再做了一次压缩备份,这次平均吞吐率达到了76.3MB/秒。最后用的xz的吞吐率就很差了,只有12.1MB/s,而且生成的压缩文件竟然反而比用bzip2压缩的大28%左右。

这支新出厂的U盘上只有11M的数据,其余基本上都是全0扇区。因此,这个简单的测试只是比较bzip2、gzip和xz这三种压缩工具对全0数据的压缩效率。

压缩

吞吐率最高的是gzip,能完全应付U盘的全速读取;压缩率最高的是bzip2,但它的吞吐率差一些;xz的吞吐率比bzip2差很多,而且生成的压缩文件反而要大28%左右。因此,对于这种数据源,可以权衡电脑CPU处理能力和存储空间大小在gzip和bzip2之间选择,xz还是算了。

对了,Sandisk CZ48标称100MB/s的读取速度,怎么用dd做读取测试不做压缩也只有76MB/s左右的吞吐率呢?

[root@acer_4830tg ~]# time dd if=/dev/sdb bs=64k | bzip2 > Sandisk_CZ48_32G.bin.bz2
482816+0 records in
482816+0 records out
31641829376 bytes (32 GB) copied, 597.249 s, 53.0 MB/s

real 9m57.489s
user 6m54.627s
sys 0m35.829s
[root@acer_4830tg ~]# time dd if=/dev/sdb bs=64k | gzip > Sandisk_CZ48_32G.bin.gz
482816+0 records in
482816+0 records out
31641829376 bytes (32 GB) copied, 414.926 s, 76.3 MB/s

real 6m55.477s
user 5m7.336s
sys 0m45.789s
[root@acer_4830tg ~]# time dd if=/dev/sdb bs=64k | xz > Sandisk_CZ48_32G.bin.xz
482816+0 records in
482816+0 records out
31641829376 bytes (32 GB) copied, 2617.33 s, 12.1 MB/s

real 43m37.606s
user 43m30.331s
sys 1m5.651s
[root@acer_4830tg ~]# time dd if=/dev/sdb of=/dev/null bs=64k
482816+0 records in
482816+0 records out
31641829376 bytes (32 GB) copied, 417.347 s, 75.8 MB/s

real 6m57.618s
user 0m0.543s
sys 0m39.826s
[root@acer_4830tg ~]# ls -l Sandisk_CZ48_32G.bin.*
-rw-r--r--. 1 root root 11654707 Aug 13 07:46 Sandisk_CZ48_32G.bin.bz2
-rw-r--r--. 1 root root 41533319 Aug 13 07:55 Sandisk_CZ48_32G.bin.gz
-rw-r--r--. 1 root root 14880004 Aug 13 08:41 Sandisk_CZ48_32G.bin.xz

解压缩

解压缩方面,xz的效率最高,bzip2次之,gzip最差。xz总算小胜一筹。

[root@acer_4830tg ~]# time gzip -cd Sandisk_CZ48_32G.bin.gz | md5sum
bb031e263477c3bc300e2882ccad17e7 -

real 2m45.745s
user 3m50.591s
sys 0m10.369s
[root@acer_4830tg ~]# time bzip2 -cd Sandisk_CZ48_32G.bin.bz2 | md5sum
bb031e263477c3bc300e2882ccad17e7 -

real 2m0.156s
user 3m3.699s
sys 0m14.619s
[root@acer_4830tg ~]# time xz -cd Sandisk_CZ48_32G.bin.xz | md5sum
bb031e263477c3bc300e2882ccad17e7 -

real 1m54.572s
user 2m59.202s
sys 0m12.892s

 

附记

后来,我在Windows 10里面做了大文件读取测试。这支U盘的读取速度波动比较大,最高即时读取速度可达100MB/s,但是平均速度仍只有76MB/s左右。

sdcz48_read2

 

3 comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注