【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩
文章目录
背景介绍
初始代码
优化代码
分析和应用
总结
背景介绍
在一个嵌入式软件开发项目中,有一个使用MATLAB Function编写的算法模块,功能是从一个较大的数组中提取一段数据,然后求均值输出,示例如下:
初始代码
一开始算法开发的思路非常简单,按照功能需求把算法分成两步。第一步提取目标数据,第二步求均值输出。示例如下:
function y = fcn(u, n)assert(n <= 100);x = zeros(1, n);for i=1:1:nx(i) = u(i);endy = mean(x);
基于上述算法编译后生成的代码如下:
/* Model step function */void DynamicRAMdown_step(void){real_T x_data[100];int32_T i;/* MATLAB Function: '<Root>/MATLAB Function' incorporates:* Constant: '<Root>/Constant'*/for (i = 0; i < 5; i++) {x_data[i] = DynamicRAMdown_ConstP.Constant_Value[i];}DynamicRAMdown_Y.y = x_data[0];for (i = 2; i < 6; i++) {DynamicRAMdown_Y.y += x_data[i - 1];}/* Outport: '<Root>/y' incorporates:* MATLAB Function: '<Root>/MATLAB Function'*/DynamicRAMdown_Y.y /= 5.0;}
分析上述代码可以看到,该算法的动态内存负荷是一个数组x_data[100]和一个i,数组x_data[100]的length是100,但是实际有用的长度只有5,另外95都是浪费的。
而且随着具体应用的变化,如果数据数组更大,那么不必要的动态内存负荷浪费就会更严重,所以该算法有较大的优化空间。
优化代码
我们利用matlab中的数组截取功能,把截取的数组直接送入求均值的函数,这样就不产生上述的中间变量数组x,示例如下:
function y = fcn(u, n)y = mean(u(1:n));
基于上述算法编译后生成的代码如下:
/* Model step function */void DynamicRAMdown_step(void){int32_T k;/* MATLAB Function: '<Root>/MATLAB Function1' incorporates:* Constant: '<Root>/Constant'*/DynamicRAMdown_Y.y = 1.0;for (k = 2; k < 6; k++) {DynamicRAMdown_Y.y += DynamicRAMdown_ConstP.Constant_Value[k - 1];}/* Outport: '<Root>/y' incorporates:* MATLAB Function: '<Root>/MATLAB Function1'*/DynamicRAMdown_Y.y /= 5.0;}
分析上述代码可以看到,该算法的动态内存负荷只有一个k,不产生任何的额外浪费。
至此,该算法中动态内存负荷压缩的优化就完成了。
分析和应用
动态内存负荷压缩,在不同的软件开发项目中重要性是不一样的。一种是数据量非常庞大的应用(例如图像处理),算法优化很容易会产生很大的动态内存负荷压缩。另一种是硬件资源非常小的开发平台(例如单片机),开发的算法如果不经过仔细设计,很容易就会出现动态内存负荷溢出。
动态内存负荷压缩优化时,需要注意如下几个点:
1、使用Simulink中的可变数组时,生成的数组大小并不是动态的,而是按照最大Size来生成的。所以使用该功能时要根据自己的应用来计算一下,尽可能把最大Size设定的小一些。
2、Simulink中设计的算法默认都是生成double型的数据,单个数据就要占用8 Byte的内存。所以我们要根据自己的应用选择合适的数据类型,例如,当精度要求不高时把double型改成single型就能压缩一半动态内存负荷,如果数值范围不大时把int32型改成int16型就能再压缩一半动态内存负荷。
3、Simulink中设计算法模块时,用端口形式放在外面的信号默认会被定义成全局变量,如果放在里头就是局部变量。所以我们要尽可能地把一些信号放在内部,尽量少使用全局变量,内存使用效率就会提高,也就压缩了动态内存负荷。
4、以上建议都是从硬件负荷压缩的角度来优化软件的,与此对立的一个优化方向是软件通用性和扩展性。前者的极限优化势必会降低后者的性能,反之依然。所以,要软件设计时要综合考虑各方面的性能,多方面来平衡。
总结
以上就是本人在嵌入式软件开发中遇到内存优化时,一些个人理解和分析的总结,首先介绍了它的背景情况,然后展示它的初始设计和优化设计,最后分析了内存优化的注意事项和应用场景。
后续还会分享另外几个最近总结的软件优化知识点,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。
另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。
版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!
相关文章:
【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩
文章目录 背景介绍 初始代码 优化代码 分析和应用 总结 背景介绍 在一个嵌入式软件开发项目中,有一个使用MATLAB Function编写的算法模块,功能是从一个较大的数组中提取一段数据,然后求均值输出,示例如下: 初始代…...
python使用Flask框架开发API
Flask是一个基于Python的轻量级Web应用程序框架。 安装依赖库 pip install flask pip install werkzeug 上传接口 Python from flask import Flask, request from werkzeug.utils import secure_filenameapp Flask(__name__)app.route(/upload, methods[POST]) def uploa…...
使用hexo+gitee从零搭建个人博客
一、环境准备 1.Node.js:下载 | Node.js 中文网 (nodejs.cn) ,Hexo 是基于Node.js 的博客框架 教程:https://blog.csdn.net/weixin_52799373/article/details/123840137 node -v npm -v 安装 Node.js 淘宝镜像加速器 (cnpm&am…...
绝地求生:杜卡迪来了,这些摩托车技巧不学一下吗?
摩托车在远古版本和现在完全不一样,虽然容易翻车造就了一批玩家“摩托杀手”的外号,但是速度可比今天快多了。 后来在蓝洞的削弱了其加速度,虽然资料上写着最高时速155km/h,但是平时游戏中一般只能拉到110~120km/h。这里写一点摩托…...
openstack安装dashboard后登录网页显示404错误
1. 2.进入该目录vim /etc/httpd/conf.d/openstack-dashboard.conf 增加这一行 WSGIApplicationGroup %{GLOBAL} 重启httpd后就可以访问了...
c# Xml 和 Json 转换方法记录
c# xml 转 json 在C#中,可以使用下面几种方法将XML转换为JSON: 使用Newtonsoft.Json库: using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using System.Xml;// 从XML字符串转换为JSON字符串 string …...
OpenHarmony南向开发案例:【智能垃圾桶】
样例简介 智能垃圾桶可以通过数字管家应用来监测垃圾桶当前可用容量,提醒主人及时处理垃圾;通过日程管家可以实现和其他智能设备联动。 核心组件位置功能距离传感器置于垃圾桶盖内侧感应垃圾量红外传感器置于垃圾桶前端感应是否有人靠近光敏电阻开发板…...
每日一题---OJ题: 旋转数组
片头 嗨! 小伙伴们,咱们又见面啦,今天我们一起来学习一道OJ题---旋转数组 emmm,看上去好像没有那么难,我们一起来分析分析 比如: 数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置 第一次轮转:将最后一个元素"7"放在第一个…...
基于单链表的通讯录C语言实现
关于单链表的详细了解请见博主的另一篇博客,本文旨在对单链表进行应用,采用C语言编写。 http://t.csdnimg.cn/iBpFa 一、驱动层 1.1 SList.h #pragma once#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"…...
【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测
介绍一个酷炫的目标检测方式: 论文:https://arxiv.org/abs/2401.17270 代码:https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式:…...
debian安装和基本使用
🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Debian系统简介 2、Debian与其他Lin…...
nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)
一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受,然后点击next 5.选择nvm安装路径,路径名称不要有空格,然后点击next 6.node.js安装路径&#…...
优优嗨聚集团:如何优雅地解决个人债务问题,一步步走向财务自由
在快节奏的现代生活中,个人债务问题似乎已成为许多人不得不面对的挑战。正确处理个人债务,不仅关系到个人信用和财务状况,更是实现财务自由的重要一步。本文将为您提供一些实用的建议,帮助您优雅地解决个人债务问题,走…...
SpringCloud实用篇(四)——Nacos
Nacos nacos官方网站:https://nacos.io/ nacos是阿里巴巴的产品,现在是springcloud的一个组件,相比于eureka的功能更加丰富,在国内备受欢迎 nacos的安装 下载地址:https://github.com/alibaba/nacos/releases/ 启动…...
【嵌入式基础知识学习】AD/DA—数模/模数转换
AD/DA—数模/模数转换概念 数字电路只能处理二进制数字信号,而声音、温度、速度和光线等都是模拟量,利用相应的传感器(如声音用话筒)可以将它们转换成模拟信号,然后由A/D转换器将它们转换成二进制数字信号,…...
Swift中的结构体
Swift中的结构体是一种自定义的数据类型,可用于存储多个相关的值。结构体可以包含属性和方法,从而使其具有特定的功能。 结构体与类相似,但有一些重要的区别。最重要的区别是,结构体是值类型,而类是引用类型。这意味着…...
Selenium - java - 屏幕截图
文档地址 Selenium 浏览器自动化项目 | Selenium 安装 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.19.1</version></dependency>使用 创建WebDriver实例 …...
【论文阅读——SplitFed: When Federated Learning Meets Split Learning】
级别CCFA 1.摘要 联邦学习(FL)和分割学习(SL)是两种流行的分布式机器学习方法。两者都采用了模型对数据的场景;客户端在不共享原始数据的情况下训练和测试机器学习模型。由于机器学习模型的架构在客户端和服务器之间…...
Python使用方式介绍
1.安装与版本和IDE 1.1 python2.x和python3.x区别 python2在2020已经不再维护,目前主流开发使用python3. 二者语法上略有区别:输入输出、数据处理、异常和默认编码等,如:python3中字符串为Unicode字符串,使用UTF-8编码ÿ…...
浅述python中NumPy包
NumPy(Numerical Python)是Python的一种开源的数值计算扩展,提供了多维数组对象ndarray,是一个快速、灵活的大数据容器,可以用来存储和处理大型矩阵,支持大量的维度数组与矩阵运算,并针对数组运…...
jvm的面试回答
1、jvm由本地方法栈、虚拟机栈、方法区、程序计数器、堆组成,其中堆和方法区是线程间共享的,程序计数器、虚拟机栈和本地方法栈是线程私有的。 2、虚拟机栈: 保存每个java方法的调用、保存局部变量表、等 栈可能出现内存溢出,如果…...
打不动的蓝桥杯
打不动的蓝桥杯 2024-4-13 今天的蓝桥杯打得很烂,8题写了4题,100分可能有20来分吧。我写了的题好像都很简单,没什么竞争力。又觉得我知道的东西不止这么点,没能发挥。 这次比赛,首先,有强烈的陌生感。pytho…...
学习笔记——C语言基本概念文件——(13)
1、文件操作 1.1、文件概念 文件:实现数据存储的载体 1.2、文件的分类 按照数据的组织形式分类: 1.字符文件/文本文件 2.二进制文件 按照用途分类: 1.系统文件 2.库文件--标准库文件/非标准库文件(第三方库) 3.用…...
【MySQL】事务篇
SueWakeup 个人主页:SueWakeup 系列专栏:学习技术栈 个性签名:保留赤子之心也许是种幸运吧 目录 本系列专栏 1. 什么是事务 2. 事务的特征 原子性(Atomicity) 一致性(Consistency) 隔离性&…...
tsconfig.json文件常用配置
最近在学ts,因为tsconfig的配置实在太多啦,所以写此文章用作记录,也作分享 作用? tsconfig.jsono是ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译 初始化一个tsconfig文件 tsc -init配置参数解释 …...
【Linux】tcpdump P1 - 网络过滤选项
文章目录 选项 -D选项 -c X选项 -n选项 -s端口捕获 port选项 -w总结 tcpdump 实用程序用于捕获和分析网络流量。系统管理员可以使用它来查看实时流量或将输出保存到文件中稍后分析。本文将演示在日常使用 tcpdump时可能想要使用的几种常见选项。 选项 -D 使用-D 选项的 tcpdu…...
网络篇04 | 应用层 mqtt(物联网)
网络篇04 | 应用层 mqtt(物联网) 1. MQTT协议介绍1.1 MQTT简介1.2 MQTT协议设计规范1.3 MQTT协议主要特性 2 MQTT协议原理2.1 MQTT协议实现方式2.2 发布/订阅、主题、会话2.3 MQTT协议中的方法 3. MQTT协议数据包结构3.1 固定头(Fixed header…...
Transformer模型-decoder解码器,target mask目标掩码的简明介绍
今天介绍transformer模型的decoder解码器,target mask目标掩码 背景 解码器层是对前面文章中提到的子层的包装器。它接受位置嵌入的目标序列,并将它们通过带掩码的多头注意力机制传递。使用掩码是为了防止解码器查看序列中的下一个标记。它迫使模型仅使用…...
All in One:Prometheus 多实例数据统一管理最佳实践
作者:淡唯(啃唯)、阳其凯(逸陵) 引言 Prometheus 作为目前最主流的可观测开源项目之一,已经成为云原生监控的事实标准,被众多企业广泛应用。在使用 Prometheus 的时候,我们经常会遇…...
mysql报错-mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止和数据恢复
启动mysql服务时出现该错误: 本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。 我的mysql版本是8.0.18 系统:win10 如何安装mysql,可以看我这一篇文章:mysql的安装 ---必会 - bigbigbrid - 博客园 (cn…...
商城手机网站制作/高清网站推广免费下载
react基础用法一(渲染元素) 如图所示最简单的变量使用方法 格式 let 变量名称 赋值; 渲染格式直接用 {变量名称} 就可以直接渲染到页面 如图所示第二种渲染方法 格式 const 变量名称 <标签>内容</标签> 渲染格式 {变量名称} 即…...
正规的app网站开发/淘宝推广怎么做
格式: jmap [option] vmid 作用: 生成堆转储快照。 使用:(注意:需要使用工具打开,分析。 比如: EclipseMemoryAnalyzer) 转载于:https://www.cnblogs.com/DengGao/p/jmap.html...
天河网站建设设计/网络推广员是干嘛的
数据科学(Data Science)作为一门新兴的学科,很多概念的定义其实没有特别明确。这点跟国内喜欢提的大数据很像。大数据这个概念总让我感觉有点无所适从,因为我实在说不清大数据的明确定义和具体范围。 国外一个做数据服务的网站mango-solutions将从事数据…...
精美网站制作/企业文化案例
最近一直在忙着和数据库有关的一些工作,这几天在写存储过程的时候,一些mysql的语句突然感觉有些不太明白,就是group by , order by ,where , having这些语句,这次通过一个实例来总结…...
企业品牌vi设计公司/谷歌seo 外贸建站
jboss7 webJBoss AS 7已于本月初发布,同时支持Java EE Web Profile和OSGi 4.2。 此外,此版本还引入了新的微型容器体系结构,对Java上下文和依赖注入的支持以及其他更新列表。 在这次采访中,我们与Red Hat企业应用程序平台工程小…...
福建嘉瑞建设工程有限公司网站/青岛百度seo排名
开发的时候,写了个很简单的Sql ,大概就是 总数除以数量 得出的平均值。看起来很平常是不是!简单来说就是 Total / Count 嘛!最多转个2位小数用Convert就完事了对不对。 但是呢,有些数据的Count值本身是就是0的。然后就…...