上位机图像处理和嵌入式模块部署(树莓派4b代码优化)

devtools/2025/1/16 5:16:58/

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我们把程序从pc端port到嵌入式开发板上面,好处是降低了部署成本,代价是牺牲了设备性能。所以等到程序真正在开发板子上面运行起来,并且解决了基本功能和稳定性之后,剩下来的就是程序优化工作。成年人的世界一般不做选择题,通常是既要、又要、还要。所以这个时候,程序代码的优化往往就显得非常重要了。

1、业务流程的优化

        很多做技术的同学往往习惯于技术的优化,忽视了业务层面的优化。比如说,如果客户的业务种类很少、流程不复杂,甚至于部分流程可以合并解决,那么这节省下来的计算资源、网络资源和存储资源,是多少技术方案都没有办法达到的效果。

2、全方位使用开发板资源

        我们写软件,一般习惯于考虑的都是cpu资源、ram资源、存储资源和网络资源。但是soc上面,还有gpu、dsp、mcu、npu等等,如果能把这些资源也用起来,常常有事半功倍的效果。

3、计算改查找

        一般嵌入式开发板的cpu频率都要比pc的低,指令集也采用了更节约资源的risc指令集。所以,在嵌入式开发板上面,能不要做计算就不要做计算,能用查表处理的就用查表处理。甚至于,在条件允许的范围内,把所有可能性都用查表来代替也不是不可以的。

4、用dma代替memcpy

        如果需要拷贝的数据非常多,这个时候最好复用soc提供的dma资源,而不是让cpu去一个一个搬数据,这样效率是非常低的。

5、用cacheable内存访问代替uncacheable内存

        记得以前在做图像的时候,经常混用cacheable内存和uncachebale内存。两者图像算法访问的速度差太多了。相信有过类似经验的同学,肯定会对这条trick印象深刻。

6、合理使用汇编指令

        arm下面有很多的mac指令、浮点指令。所谓的mac指令,主要就是矩阵的计算、浮点的计算,合理使用这些指令,也可以让程序加快运行速度。

7、并发cpu使用

        如果一个算法执行时间很长,那么没有必要全部用1个cpu来执行。我们可以做成pipeline的形式来处理。比如说,一个算法需要执行40ms,那么分成四个thread来跑,一个thread一个cpu。那么虽然算法执行的总时间没有改变,但是算法结果的输出效率提高了4倍。

8、使用ip内部的加速功能

        从名字上面可能不太好理解,但是我们举个例子就明白了。之前做一个网络报文的发送功能,中间有一个crc计算的子程序。一开始我们都是用软件计算的,后来发现eth ip可以自动帮助计算crc。发现这个功能之后,优化了代码,效率一下子增加了很多。

9、合理使用第三方库

        部分posix提供的函数,性能是比较差的,比如jemalloc第三方库就比自带的malloc库好很多。如果业务比较简单,自己写一个固定内存的分配模块,循环分配和使用也是可以的。

10、从上至下,从主要花费时间的模块入手

        从上至下比较好理解,也就是先从业务层,再从模块层,最后从实现层去优化功能。等这些大的部分做好之后,在实现层的角度,我们先找出最浪费时间的地方,比如循环最多的地方、io阻塞的地方、流程忙等的地方等等去入手。这样优化起来效率高,效果也比较明显。


http://www.ppmy.cn/devtools/37309.html

相关文章

【intro】图卷积神经网络(GCN)-续

本文为【intro】图卷积神经网络(GCN)-CSDN博客后续(因为经验告诉我超过2w字编辑器就会卡……) 第一部分还是进一步再看看GCN 图卷积神经网络GCN_哔哩哔哩_bilibili 回顾 图神经网络的基本原理就是把图中的节点编码映射成一个低…

RAG进阶(二): RAG 融合(rag fusion)

在上一篇博客中,我们学习了多重查询(Multi Query)技术,Multi Query的基本思想是当用户输入查询语句(自然语言)时,我们让大模型(LLM)基于用户的问题再生成多个查询语句,这些生成的查询语句是对用户查询语句的补充,它们是…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

【套接字-Socket】学习笔记(更新中)

【套接字-Socket】学习笔记 套接字(Socket)的概念TCP通信流程Socket编程中的细节字节序IP地址转换主机字节序 -> 网络字节序网络字节序 -> 主机字节序 参考资料 套接字(Socket)的概念 TCP/IP网络模型有四层&#xff1a;网络接口层、网络互连层、传输层和应用层。 当应用…

VS Code中PlatformIO IDE的安装并开发Arduino

VS Code中PlatformIO IDE的安装并开发Arduino VS Code的安装 略 PlatformIO IDE的安装 PlatformIO IDE是是什么 PlatformIO IDE 是一个基于开源的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于嵌入式系统和物联网&#xff08;IoT&#xff09;开发。…

深拷贝和浅拷贝的区别,如何实现一个深拷贝

在JavaScript中&#xff0c;数据类型分为基本数据类型和引用数据类型。 基本数据类型是保存在栈内存中的&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;这个引用是保存在栈内存中。 浅拷贝 浅拷贝&#xff0c;指的是创建新的数据。 如果原始…

MinHashLSH

MinHash MinHash 是一种用于近似集合相似度计算的技术。它被广泛用于大规模数据集中的快速相似度估计,特别是在处理文本、图像和网络数据等领域。 MinHash 的基本思想是通过将集合中的元素哈希成一个较小的签名(通常是一个固定长度的整数或比特串),从而快速地比较两个集合…

截图工具Snipaste:不仅仅是截图,更是效率的提升

在数字时代&#xff0c;截图工具已成为我们日常工作和生活中不可或缺的一部分。无论是用于工作汇报、学习笔记&#xff0c;还是日常沟通&#xff0c;一款好用的截图工具都能大大提升我们的效率。今天&#xff0c;我要向大家推荐一款功能强大且易于使用的截图软件——Snipaste。…