压缩工具的效果评估

Posted on Thu 01 March 2012 in it

因工作需要,比较gzip/bzip2/zip/7z/freearc for linux压缩效果(压缩比和压缩速度)。 为了把测试的人工参与度降到最低,写了个测试脚本。 freearc的安装比较失败,目前还没有解决;测试脚本达到了预期效果,期间解决了几个小问题,把过程写出来和大家分享。

准备测试环境

准备测试文件

tail -n 1000 android_pkgs_172_20120226.log > android_pkgs_172_tail1000.log

安装7zip

有apt-get或者yum的直接安装:sudo yum install p7zip 没有的话下源码编译 http://www.7-zip.org/download.html http://sourceforge.net/projects/p7zip/files/latest/download?source=files

安装freearc for linux

http://freearc.org/download/0.666/FreeArc-0.666-sources.tar.bz2 http://freearc.org/download/0.666/FreeArc-0.666-linux-i386.tar.bz2 呵呵,freearc不太友好,按照完无法正常运行,提示如下: $ arc arc: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory ln libcurl.so.3 libcurl.so.4后,提示 $ arc arc: /lib/libc.so.6: version `GLIBC_2.7' not found (required by arc)

编写测试脚本

为什么要写测试脚本

因为要压缩的日志很大且担心采样数据不够可信; 希望把这个验证过程变成可以重复的,成为以后验证优化压缩参数和算法的一个工具; 更重要的是,我喜欢写程序,即使是shell

第一个关卡:如何记录时间?

要记录执行时间,我想到的最土的方式就是结束时间减去开始时间。 开始摆脱陈萍来完成这个脚本,她想到了用time来记录执行时间,非常好的点子。

但time的结果并没有输入到log中:因为这个结果被输出到stderr里了 解决办法:使用>&把stderr定向到stdout

stderr怎么append

我希望一轮测试只有一个log,但>&是add而不是append,怎么办?

土办法就是用一个中间变量time.buf。

开销

占用了陈萍一个小时帮我准备脚本,我又花了半个小时解决上面的问题。 现在脚本正在测试4G日志的压缩效果,我可以把解决过程写成一篇博客。

嗯,最大的时间开销用在安装freearc上,但还没把这个玩意儿跑起来,也有点儿小郁闷。

可用脚本

#!/bin/sh

source=android_pkgs_172_tail10000.log
case=9M
echo start evaluation> ${case}.log
echo "===========gzip begin===========" >> ${case}.log
eval time tar -czf ${case}.tar.gz $source >& time.buf
cat time.buf >> ${case}.log

echo "===========bz2 begin===========" >> ${case}.log
eval time tar -cjf ${case}.tar.bz2 $source >& time.buf
cat time.buf >> ${case}.log

echo "===========zip begin===========" >> ${case}.log
eval time zip ${case}.zip $source >& time.buf
cat time.buf >> ${case}.log

echo "===========7zip begin===========" >> ${case}.log
eval time 7za a -tzip ${case}.7z $source >& time.buf
cat time.buf >> ${case}.log

echo "===========arc begin===========" >> ${case}.log
eval time arc creat ${case}.arc $source >& time.buf
cat time.buf >> ${case}.log