适用于嵌入式单片机的压缩算法

1. 简介

因为MCU的内存和算力的限制,那些对内存消耗大或算力需求大的压缩算法就不适合在MCU中使用。适用于MCU的压缩算法主要有:RLE、LZ77、Huffman、LZO、DEFLATE、LZ4。

2. 算法

2.1. RLE

RLE(Run Length Encoding),也称为行程编码,压缩算法是一种无损压缩算法。算法特点:简单、易实现。使用RLE压缩方法可以将 RRRRRGGBBBBBBABCD 压缩为 5R2G6B1A1B1C1D。基于RLE算法升级,可以将RRRRRGGBBBBBBABCD可以压缩为b’\x85R\x82G\x86B\x03ABCD’,0x85表示后面有5个相同的字符,0x03表示后面有3个不连续的字符。
RLE的实现非常简单,针对一些图片颜色少或重复字符多的文件有非常好的压缩率,RLE的适用场景比较少,通用压缩率较差。

2.2. LZ77

LZ77是一种基于字典的算法,它将长字符串(也称为短语)编码成短小的标记,用小标记代替字典中的短语,从而达到压缩的目的。LZ77算法的压缩率、速度、内存消费都是中等,但是代码复杂度较低,适用于MCU的使用。

2.3. LZO

LZO压缩算法采用(重复长度L,指回距离D)代替当前已经在历史字符串中出现过的字符串。LZO致力于解压速度,不同的参数下的LZO压缩率不同。LZO内存消耗中等,解压速度较快,压缩速度较快,但是代码复杂度较低,适用于Bootloader等追求压缩率和解压速度的场景。

2.4. Huffman

霍夫曼(Huffman)编码使用变长编码表对源符号进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。霍夫曼编码使用的编码表,使用霍夫曼树来进行存储,让出现概率最高的编码最容易查找,以提升解码速度。霍夫曼编码算法的压缩率分布在20%-90%,因为要扫描整个数据来构建霍夫曼树,所以其压缩速度较慢,且需要一定的内存来存储编码表,但是解压速度较快。霍夫曼的算法复杂度较简单。

2.5. DEFLATE

DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。DEFLATE压缩与解代码可以在自由、通用的压缩库zlib上找到。DEFLATE算法压缩速度、解压速度均处于中等,却有着比较好的压缩率,所以是zlib、gzip使用的主要压缩算法。DEFLATE的算法复杂度较高,但是性能表现优秀,适用于比较大型的MCU系统。

2.6. LZ4

LZ4是一种LZ系列压缩算法,着重于压缩和解压的速度,压缩率相对较低。LZ4压缩率较低,算法复杂度和内存消耗中等,但是压缩和解压速度,尤其是解压速度远超其他算法。因为其综合性能优秀,在Linux、Android中的内存压缩技术一般使用LZ4压缩算法。LZ4 HC,有着更好的压缩率,但是算法复杂度大幅提升,且压缩速度也大幅减慢,但是依然有着很好的解压速度,适合Bootloader这种应用场景。LZ4的内存消耗从几百字节到几十K字节。

3. 基准测试

3.1. 工具用法

  1. RLE
    ● 测试文件
I:\Linux>RLE.exe d:\a.exe
d:\a.exe
Orignal Size:132096-Compressed Size:125400
Compressed rate:94%

● 测试目录

I:\Linux>RLE.exe E:\ATLDemo\Demo\Debug
E:\ATLDemo\Demo\Debug\ATLProject1.exe
Orignal Size:9160192-Compressed Size:7105584
Compressed rate:77%
E:\ATLDemo\Demo\Debug\ATLProject1.map
Orignal Size:19710649-Compressed Size:16943928
Compressed rate:85%
  1. Huffman
    ● 测试文件
I:\Linux>Huffman.exe d:\a.exe
d:\a.exe
Orignal Size:132096-Compressed Size:123772
Compressed rate:93%

● 测试目录

I:\Linux>Huffman.exe E:\ATLDemo\Demo\Debug
E:\ATLDemo\Demo\Debug\ATLProject1.exe
Orignal Size:9160192-Compressed Size:7695483
Compressed rate:84%
E:\ATLDemo\Demo\Debug\ATLProject1.map
Orignal Size:19710649-Compressed Size:15878850
Compressed rate:80%
  1. LZ77
I:\Linux>lzbench18.exe -elz4 d:\a.exe
lzbench 1.8 (64-bit Windows)   Assembled by P.Skibinski
Compressor name         Compress. Decompress. Compr. size  Ratio Filename
memcpy                  35490 MB/s 35924 MB/s      132096 100.00 a.exe
lz4 1.9.2                 616 MB/s  4388 MB/s       91011  68.90 a.exe
done... (cIters=1 dIters=1 cTime=1.0 dTime=2.0 chunkSize=1706MB cSpeed=0MB)
  1. LZO
I:\Linux>lzbench18.exe -elzo1 d:\a.exe
lzbench 1.8 (64-bit Windows)   Assembled by P.Skibinski
Compressor name         Compress. Decompress. Compr. size  Ratio Filename
memcpy                  35442 MB/s 36160 MB/s      132096 100.00 a.exe
lzo1 2.10 -1              150 MB/s   433 MB/s       90130  68.23 a.exe
lzo1 2.10 -99              70 MB/s   415 MB/s       85293  64.57 a.exe
done... (cIters=1 dIters=1 cTime=1.0 dTime=2.0 chunkSize=1706MB cSpeed=0MB)
  1. LZ4
I:\Linux>lzbench18.exe -elz4 d:\a.exe
lzbench 1.8 (64-bit Windows)   Assembled by P.Skibinski
Compressor name         Compress. Decompress. Compr. size  Ratio Filename
memcpy                  35085 MB/s 34689 MB/s      132096 100.00 a.exe
lz4 1.9.2                 615 MB/s  4388 MB/s       91011  68.90 a.exe
done... (cIters=1 dIters=1 cTime=1.0 dTime=2.0 chunkSize=1706MB cSpeed=0MB)
I:\Linux>lzbench18.exe -elz4hc d:\a.exe
lzbench 1.8 (64-bit Windows)   Assembled by P.Skibinski
Compressor name         Compress. Decompress. Compr. size  Ratio Filename
memcpy                  34462 MB/s 35944 MB/s      132096 100.00 a.exe
lz4hc 1.9.2 -1             79 MB/s  3851 MB/s       81847  61.96 a.exe
lz4hc 1.9.2 -2             79 MB/s  3840 MB/s       81847  61.96 a.exe
lz4hc 1.9.2 -3             69 MB/s  3862 MB/s       81207  61.48 a.exe
lz4hc 1.9.2 -4             63 MB/s  3885 MB/s       80896  61.24 a.exe
lz4hc 1.9.2 -5             59 MB/s  3885 MB/s       80750  61.13 a.exe
lz4hc 1.9.2 -6             56 MB/s  3896 MB/s       80650  61.05 a.exe
lz4hc 1.9.2 -7             53 MB/s  3908 MB/s       80604  61.02 a.exe
lz4hc 1.9.2 -8             51 MB/s  3919 MB/s       80586  61.01 a.exe
lz4hc 1.9.2 -9             47 MB/s  3943 MB/s       80568  60.99 a.exe
lz4hc 1.9.2 -10            29 MB/s  3919 MB/s       80454  60.91 a.exe
lz4hc 1.9.2 -11            22 MB/s  3931 MB/s       80442  60.90 a.exe
lz4hc 1.9.2 -12            20 MB/s  3896 MB/s       80420  60.88 a.exe
done... (cIters=1 dIters=1 cTime=1.0 dTime=2.0 chunkSize=1706MB cSpeed=0MB)
  1. DEFLATE
I:\Linux>lzbench18.exe -elibdeflate d:\a.exe
lzbench 1.8 (64-bit Windows)   Assembled by P.Skibinski
Compressor name         Compress. Decompress. Compr. size  Ratio Filename
memcpy                  35711 MB/s 36420 MB/s      132096 100.00 a.exe
libdeflate 1.3 -1          92 MB/s   382 MB/s       69917  52.93 a.exe
libdeflate 1.3 -2          88 MB/s   387 MB/s       69425  52.56 a.exe
libdeflate 1.3 -3          85 MB/s   391 MB/s       69207  52.39 a.exe
libdeflate 1.3 -4          81 MB/s   394 MB/s       69085  52.30 a.exe
libdeflate 1.3 -5          70 MB/s   411 MB/s       68098  51.55 a.exe
libdeflate 1.3 -6          67 MB/s   408 MB/s       68034  51.50 a.exe
libdeflate 1.3 -7          62 MB/s   409 MB/s       67972  51.46 a.exe
libdeflate 1.3 -8          22 MB/s   413 MB/s       67138  50.83 a.exe
libdeflate 1.3 -9          17 MB/s   403 MB/s       66693  50.49 a.exe
libdeflate 1.3 -10         16 MB/s   401 MB/s       66627  50.44 a.exe
libdeflate 1.3 -11         13 MB/s   400 MB/s       66604  50.42 a.exe
libdeflate 1.3 -12         10 MB/s   407 MB/s       66598  50.42 a.exe
done... (cIters=1 dIters=1 cTime=1.0 dTime=2.0 chunkSize=1706MB cSpeed=0MB)

3.2. 脚本测试

脚本是基于Cygwin环境执行的shell脚本。用法如下:

26/01/2024 11:15.41/drives/i/Linux/compression_test.sh
请输入待测目录:
e:\ATLDemototal size 297101065 , total compressed size: 210777636
RLE compression rate: 70%total size 297101065 , total compressed size: 205327668
Huffman compression rate: 69%total size 297059235 , total compressed size: 109202247
LZ4 compression rate: 36%total size 296918510 , total compressed size: 115966722
LZO compression rate: 39%        

4. 总结

4.1. 性能

● 综合压缩率排名:DEFLATE > LZ4HC > LZO > LZ77 > Huffman > LZ4 >> RLE。
● 压缩速度排名:LZ4 > LZO > RLE > LZ77 > DEFLATE > Huffman > LZ4HC。
● 解压速度排名:RLE > LZ4=LZ4HC >> Huffman > LZO > DEFLATE > LZ77。
● 算法复杂度排名:RLE < Huffman < LZ77 < LZ4 < LZO < LZ4HC < DEFLATE。
● 算法内存消耗排名:RLE < LZ4 < LZO < LZ77 < Huffman < DEFLATE < LZ4 HC。

4.2. 应用场景

不同的压缩算法,有不同的应用场景。

  1. 高压缩率,压缩速度慢,但是解压速度快的算法,适用于Bootloader。高压缩率,可以节省ROM空间,高解压速度对Boot速度影响小。因为是外部工具压缩,压缩速度不影响Bootloader的功能。适用于此场景的压缩算法有lzo、lz4hc。
  2. 追求压缩率,且算力和内存资源充足,并且压缩和解压均不错的算法,选择DEFLATE。
  3. 有一定的压缩率(50%),追求压缩和解压速度,且算法相对简单,优先LZ4,再选择LZ77,再先LZO.
  4. 在一定的压缩率(50%)的基础上,追求算法简单,优先LZ77。
    4.3. LZ77 vs LZ4
    ● 如果LZ77的算法复杂度为100,则LZ4的为130。压缩和解压C代码,LZ77在400行左右,LZ4在500行左右。
    ● 如果LZ77的内存消耗为100,则LZ4的内存消耗为50。LZ77的内存消耗十几K到几十K,LZ4的内存从几百字节到十几K字节。
    ● 如果LZ77的压缩速度为100,则LZ4的压缩速度为700。
    ● 如果LZ77的解压速度为100,则LZ4的解压速度为800。
    总结,LZ4的综合性能远优于LZ77。这也是LZ4应用于Linux和Android内存压缩的重要原因。

4.3. 代码

代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考&#xff1a;https://github.com/parallax/jsPDF html2canvas参考&#xff1a;https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

如何编写接口测试用例

作为测试人&#xff0c;我们经常要对项目中的接口进行接口测试&#xff0c;那么在做接口测试的时候&#xff0c;如何写接口测试用例呢&#xff1f; 什么是接口测试 首先我们要了解一下&#xff0c;什么是接口测试&#xff1f; 那么首先要搞清楚&#xff0c;我们一般说的接口…

LeetCode第872题 - 叶子相似的树

题目 解答 class Solution {public void inorder(TreeNode node, List<Integer> values) {if (node null) {return;}if (node.left null && node.right null) {values.add(node.val);return;}inorder(node.left, values);inorder(node.right, values);}publ…

Spring面试大全-基础知识01

1.什么是Spring Spring框架是用于构建企业级Java的开源框架&#xff0c;他通过依赖注入和IOC容器帮我我们管理对象&#xff1b;支持AOP&#xff0c;将非业务功能&#xff08;日志&#xff0c;事务等&#xff09;从我们业务代码中分离出来&#xff0c;提高了代码的可维护性&…

nginx支持wasm文件

背景 需要支持wasm文件,折腾半天不行,最后搜索wasm解决 这都是后话了,只知道是文件,不知道文件类型是wasm,关于什么事wasm直接百度 可以参考:WebAssembly(WASM) 和云原生 | wasm和区块链-CSDN博客 铺垫 Nginx通过服务器端文件的后缀名来判断这个文件属于什么类型&#xff0c…

介绍 回调函数及使用方法

回调函数是一种常见的编程概念,它允许我们将一个函数作为参数传递给另一个函数,并在需要的时候调用这个函数。回调函数通常用于异步编程、事件处理和模块间的通信。 在使用回调函数时,我们首先定义一个函数,然后将其作为参数传递给另一个函数。当满足某个条件或事件发生时…

uniapp开发一个交流社区小程序

uniapp开发一个交流社区小程序 假期的时候简单学了一下uniapp&#xff0c;想开发一款类似百度贴吧的交流社区来练练手。本篇文章主要记录开发过程&#xff0c;文末附上项目地址。 主要需要开发以下几个页面。 信息页面热榜页面用户主页用户信息页 信息页面 该页面的功能主要…

【Android】RxJava系列01-基本概述和基本用法

少年啊&#xff0c;要永远相信美好的事情即将发生 【Android】RxJava系列01-基本概述和基本用法 1.RxJava的概述2.RxJava的作用3.观察者和被观察者4.背压5.RxJava的基本用法步骤一&#xff0c;创建Observer&#xff08;观察者&#xff09;步骤二&#xff0c;创建Observable&…

华为nova12系列:图片HDR显示,让你的照片全面升级!

你是不是也想给自己的照片加点料&#xff0c;让它们看起来更真实、捕捉到更多的细节和光影&#xff1f;不用愁&#xff0c;华为nova12系列就为你量身打造了图片HDR显示技术&#xff0c;让你的照片从此焕发绚丽光芒&#xff01; 回忆一下&#xff0c;在节日的夜晚想拍下绚丽的灯…

自己动手写编译器:属性语法的实现

上一节我们研究了增强语法&#xff0c;本节我们看看何为属性语法。属性语法实则是在语法规则上附带上一些重要的解析信息&#xff0c;随着语法解析的进行&#xff0c;我们可以利用附带的解析信息去进行一系列操作&#xff0c;例如利用解析信息实现代码生成。我们先看属性语法的…

免费ai绘画软件选择哪个?

对于免费AI绘画软件的选择&#xff0c;因为每个软件都有其独特的优点和适用场景&#xff0c;可以根据个人的需求和技能水平来决定。以下是被广泛认可的AI绘画软件&#xff1a; 1、建e网AI-一款为建筑室内设计师提供AI绘图的智能工具&#xff0c;具有文字生图&#xff0c;方案优…

Python学习之路-Tornado基础:深入Tornado

Python学习之路-Tornado基础:深入Tornado Application settings 前面的学习中&#xff0c;我们在创建tornado.web.Application的对象时&#xff0c;传入了第一个参数——路由映射列表。实际上Application类的构造函数还接收很多关于tornado web应用的配置参数&#xff0c;在…

值得收藏的上千个涉及各个领域各个方面的免费的API接口服务,全网盘点并统计了网上诸多的免费API

值得收藏的上千个涉及各个领域各个方面的免费的API接口服务&#xff0c;全网盘点并统计了网上诸多的免费API。 一位开发者在GitHub上维护的免费API文档&#xff0c;不定期收录了互联网上开放的各种API接口。这些接口有些是来自第三方服务&#xff0c;你只需要在第三方注册成为会…

如何使用 FOFA 搜索引擎保姆级教程(附链接)

一、介绍 FOFA&#xff08;Fingerprinting Organizations with Advanced Tools&#xff09;是一家总部位于中国的网络安全公司提供的一款网络搜索引擎&#xff0c;专注于帮助用户收集和分析互联网上的设备和服务信息。FOFA 的主要特点包括&#xff1a; 设备指纹识别&#xff1…

面试150 颠倒二进制位 位运算分治 逻辑右移

Problem: 190. 颠倒二进制位 文章目录 思路复杂度位运算分治法 思路 &#x1f468;‍&#x1f3eb; 参考题解 >>>&#xff1a;逻辑右移&#xff08;符号位一起移动&#xff0c;高位补零&#xff09; 复杂度 时间复杂度: O ( log ⁡ n ) O(\log{n}) O(logn) 空间…

Win10系统搭建个人hMailServer邮件服务结合内网穿透远程发邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

基于IATF思想构建网络安全治理体系

文章目录 前言一、企业网络安全现状(一)防御碎片化。(二)常见网络安全问题频发。(三)安全意识教育难度大。二、“纵深防御”式综合治理体系建设方案(一)三个核心要素(二)四个保障领域1、网络和基础设施2、区域边界3、计算环境4、支撑性基础设施总结前言 近年来,国家…

计算机网络_1.6.1 常见的三种计算机网络体系结构

1.6.1 常见的三种计算机网络体系结构 1、OSI&#xff08;七层协议&#xff09;标准失败的原因2、TCP/IP参考模型3、三种网络体系结构对比 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 1、OSI&#xff08;七层协议&#xff09;标准失败的原因 &#xff08;1&#xf…

Django的web框架Django Rest_Framework精讲(四)

文章目录 1.DRF认证组件Authentication2.权限Permissions3.限流Throttling4.过滤Filtering5.排序6.分页Pagination7.异常处理 Exceptions8.自动生成接口文档 大家好&#xff0c;我是景天&#xff0c;今天我们继续DRF的最后一讲&#xff0c;Django的web框架Django Rest_Framewor…

STM32--揭秘中断(简易土货版)

抢占优先级响应优先级 视频学习--中断​​​​​​​