惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
D
Docker
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
月光博客
月光博客
罗磊的独立博客
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
博客园 - 司徒正美
T
Tailwind CSS Blog
C
Check Point Blog
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
L
LangChain Blog
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
腾讯CDC
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - Franky
量子位

博客园 - chinese_submarine

QT项目性能调优小记 Windows下HG服务器的搭建 svn+tp-link+花生壳搭建外网服务器 udev介绍 极大极小博弈树的简洁(附Tic-Tac-Toe源码) Beating the Average------为什么要学习Lisp[转] 巧用qmake工具生成专业的makefile QT中拖拽的实现(附示例代码) 从QDataStream向QByteArray中写入数据时的注意点(QT) 如何保持GUI的响应流畅(QT平台) 也谈线程同步变量 windows7到期的问题 简述FPS的计算方法 QT中的View Model模型系列一 从农夫养牛问题推广到斐波那契数列 TimeZoneChange事件的捕获 浏览器扩展系列————透明浏览器窗口的实现 浏览器扩展系列————异步可插入协议(pluggable protocol)的实现 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】
程序优化小记
chinese_submarine · 2011-01-19 · via 博客园 - chinese_submarine

最近做给一块蓝牙芯片做了一个decode的功能,数据是用RLE(http://en.wikipedia.org/wiki/Run-length_encoding)流程算法压缩的。为什么选用RLE算法,因为蓝牙芯片自身memory的局限性,最大只能获得不到2K的内存,还是不连续,而解压出的数据有2K多,所以需要一种能够边解压边发送的算法,查看现在流行的几种算法:霍夫曼算法,RLE算法,查表算法。

  压缩率 实现复杂度 内存占用量
霍夫曼算法
RLE算法
查表算法 大(一般几十K)

由于查表算法的内存占用量一般需要几十K,所以所以首先排除,而且比较霍夫曼算法和RLE算法,RLE算法在压缩率,实现复杂度,内存占用量三个方面都占有优势,所以最终选择RLE作为压缩和解码的方法。

花了几天时间实现了改算法,今天对其进行了性能测试,发现解压目标数据需要200多ms,遂决定对其进行优化。

step1,还原行解压函数,减少一百多次的函数调用,但是实验的结果是反而增加了100多ms,猜测可能是有远指针调用,遂放弃。

step2,将行解压函数中,对堆内存的访问换成对栈上数据的访问,实验下来时间减小到了70-80ms,性能提升了一倍多。

step3,由于采用的RLE算法是经过改进过的,n + 1行的数据是和n行数据异或过,所以增加相同数据的几率,比如有三行数据时1010 1010,理论上是不能压缩的,当时经过异或,后面两行数据都变成了0000 0000,便可以采用RLE算法进行压缩。所以根据这一特性,在step3做的优化是,比较解压出的值,如果是0,则不需要和上一行的数据进行异或(因为任何数和零异或都不变)。改进后可以将时间减小到30-40ms,又提升了一倍多。

step4,在step3的基础,在行解压算法中,如果检测到行的剩余部分都是0,则直接跳过该行剩下的部分。改进后时间减小到了十几个ms。

所以进过step2-4,性能提升了10倍多。

posted on 2011-01-19 20:40  chinese_submarine  阅读(528)  评论()    收藏  举报