当前位置 : 主页 > 网络安全 > 测试自动化 >

embedded – zlib内存使用/性能.拥有500kb的数据

来源:互联网 收集:自由互联 发布时间:2021-06-22
zLib值得吗?还有其他更适合的压缩机吗? 我正在使用嵌入式系统.通常,我的应用程序只有3MB或更少的RAM可用.所以我正在考虑使用zlib压缩我的缓冲区.然而,我担心开销. 缓冲区的平均大小
zLib值得吗?还有其他更适合的压缩机吗?

我正在使用嵌入式系统.通常,我的应用程序只有3MB或更少的RAM可用.所以我正在考虑使用zlib压缩我的缓冲区.然而,我担心开销.

缓冲区的平均大小为30kb.这可能不会被zlib压缩.对于极其有限的内存环境,有谁知道一个好的压缩器?

但是,我偶尔会遇到700kb的最大缓冲区大小,更常见的是500kb.在这种情况下,zlib值得吗?或者开销太大而无法证明?

我对压缩的唯一考虑因素是算法的RAM开销和性能至少与zlib一样好.

许可证:我更喜欢压缩机根据BSD,zLib或同等许可证获得许可.

如果使用lm_init()使用1,2或3初始化zlib,则将使用deflate_fast()例程而不是deflate(),这将使用较小的运行时缓冲区和更快的算法.权衡压缩更糟糕.这可能是值得的.

如果使用定义的SMALL_MEM编译zlib,则在散列输入字符串时将使用较小的散列桶.文档(在deflate.c中)声称:

/* Compile with MEDIUM_MEM to reduce the memory requirements or
 * with SMALL_MEM to use as little memory as possible. Use BIG_MEM if the
 * entire input file can be held in memory (not possible on 16 bit systems).
 * Warning: defining these symbols affects HASH_BITS (see below) and thus
 * affects the compression ratio. The compressed output
 * is still correct, and might even be smaller in some cases.
 */

希望这两种技术结合起来可以将zlib带入您的应用范围.这是一个无处不在的标准,能够重复使用陈旧的组件可能值得在应用程序的其他地方做出牺牲.但是,如果您对数据的分布有所了解,可以编写自己的压缩例程,那么您可以做得更好,但是您可以快速删除zlib – 编写和测试自己可能需要更多时间.

更新

这是在我找到的第一个600k文件上使用不同压缩级别设置使用SMALL_MEM构建的zlib上的一些输出:

$ls -l abi-2.6.31-14-generic
-rw-r--r-- 1 sarnold sarnold 623709 2011-03-18 18:09 abi-2.6.31-14-generic
$for i in `seq 1 9` ; do /usr/bin/time ./gzip -c -${i} abi-2.6.31-14-generic | wc -c ; done
0.02user 0.00system 0:00.02elapsed 76%CPU (0avgtext+0avgdata 2816maxresident)k
0inputs+0outputs (0major+213minor)pagefaults 0swaps
162214
0.01user 0.00system 0:00.01elapsed 52%CPU (0avgtext+0avgdata 2800maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
158817
0.02user 0.00system 0:00.02elapsed 95%CPU (0avgtext+0avgdata 2800maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
156708
0.02user 0.00system 0:00.02elapsed 76%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+211minor)pagefaults 0swaps
143843
0.03user 0.00system 0:00.03elapsed 96%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
140706
0.03user 0.00system 0:00.03elapsed 81%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+211minor)pagefaults 0swaps
140126
0.04user 0.00system 0:00.04elapsed 95%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+211minor)pagefaults 0swaps
138801
0.05user 0.00system 0:00.05elapsed 84%CPU (0avgtext+0avgdata 2784maxresident)k
0inputs+0outputs (0major+212minor)pagefaults 0swaps
138446
0.06user 0.00system 0:00.06elapsed 96%CPU (0avgtext+0avgdata 2768maxresident)k
0inputs+0outputs (0major+210minor)pagefaults 0swaps
138446

整个gzip程序占用大约2.6兆字节的内存,无论要求的压缩级别如何;也许只是使用你需要的特定功能而不是整个gzip程序会将这个数字降低一些,但对于你的小机器来说可能太昂贵了.

网友评论